Hiển thị dữ liệu hình ảnh trong TensorBoard

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Sử dụng Tóm tắt API TensorFlow hình ảnh, bạn có thể dễ dàng đăng nhập tensors và hình ảnh tùy ý và xem chúng trong TensorBoard. Điều này có thể rất hữu ích để lấy mẫu và kiểm tra dữ liệu đầu vào của bạn, hoặc để hình dung trọng lớptensors tạo . Bạn cũng có thể ghi dữ liệu chẩn đoán dưới dạng hình ảnh có thể hữu ích trong quá trình phát triển mô hình của bạn.

Trong hướng dẫn này, bạn sẽ học cách sử dụng API Tóm tắt Hình ảnh để trực quan hóa các tensors dưới dạng hình ảnh. Bạn cũng sẽ học cách chụp một hình ảnh tùy ý, chuyển đổi nó thành tensor và trực quan hóa nó trong TensorBoard. Bạn sẽ làm việc thông qua một ví dụ đơn giản nhưng thực tế sử dụng Tóm tắt hình ảnh để giúp bạn hiểu mô hình của bạn đang hoạt động như thế nào.

Thành lập

try:
  # %tensorflow_version only exists in Colab.
  %tensorflow_version 2.x
except Exception:
  pass

# Load the TensorBoard notebook extension.
%load_ext tensorboard
TensorFlow 2.x selected.
from datetime import datetime
import io
import itertools
from packaging import version

import tensorflow as tf
from tensorflow import keras

import matplotlib.pyplot as plt
import numpy as np
import sklearn.metrics

print("TensorFlow version: ", tf.__version__)
assert version.parse(tf.__version__).release[0] >= 2, \
    "This notebook requires TensorFlow 2.0 or above."
TensorFlow version:  2.2

Tải xuống bộ dữ liệu Fashion-MNIST

Bạn sẽ xây dựng một mạng lưới thần kinh đơn giản để hình ảnh classify trong những thời trang-MNIST tập dữ liệu. Tập dữ liệu này bao gồm 70.000 hình ảnh thang độ xám 28x28 của các sản phẩm thời trang thuộc 10 danh mục, với 7.000 hình ảnh cho mỗi danh mục.

Trước tiên, hãy tải xuống dữ liệu:

# Download the data. The data is already divided into train and test.
# The labels are integers representing classes.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = \
    fashion_mnist.load_data()

# Names of the integer classes, i.e., 0 -> T-short/top, 1 -> Trouser, etc.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
    'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

Hình dung một hình ảnh duy nhất

Để hiểu cách API tóm tắt hình ảnh hoạt động, bây giờ bạn sẽ chỉ cần ghi lại hình ảnh đào tạo đầu tiên trong bộ đào tạo của bạn trong TensorBoard.

Trước khi bạn làm điều đó, hãy kiểm tra hình dạng dữ liệu đào tạo của bạn:

print("Shape: ", train_images[0].shape)
print("Label: ", train_labels[0], "->", class_names[train_labels[0]])
Shape:  (28, 28)
Label:  9 -> Ankle boot

Lưu ý rằng hình dạng của mỗi hình ảnh trong tập dữ liệu là một tensor bậc 2 của hình dạng (28, 28), đại diện cho chiều cao và chiều rộng.

Tuy nhiên, tf.summary.image() hy vọng một tensor rank-4 chứa (batch_size, height, width, channels) . Do đó, các tensor cần được định hình lại.

Bạn đang đăng nhập chỉ có một hình ảnh, vì vậy batch_size là 1. Các hình ảnh là màu xám, sau đó thiết lập channels 1.

# Reshape the image for the Summary API.
img = np.reshape(train_images[0], (-1, 28, 28, 1))

Bây giờ bạn đã sẵn sàng để ghi lại hình ảnh này và xem nó trong TensorBoard.

# Clear out any prior log data.
!rm -rf logs

# Sets up a timestamped log directory.
logdir = "logs/train_data/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Creates a file writer for the log directory.
file_writer = tf.summary.create_file_writer(logdir)

# Using the file writer, log the reshaped image.
with file_writer.as_default():
  tf.summary.image("Training data", img, step=0)

Bây giờ, sử dụng TensorBoard để kiểm tra hình ảnh. Chờ một vài giây để giao diện người dùng quay lên.

%tensorboard --logdir logs/train_data

Tab "Hình ảnh" hiển thị hình ảnh bạn vừa đăng nhập. Đó là một "đôi giày cao cổ".

Hình ảnh được thu nhỏ thành kích thước mặc định để dễ xem hơn. Nếu bạn muốn xem hình ảnh gốc chưa được chỉnh tỷ lệ, hãy chọn "Hiển thị kích thước hình ảnh thực tế" ở phía trên bên trái.

Chơi với các thanh trượt độ sáng và độ tương phản để xem chúng ảnh hưởng như thế nào đến các pixel hình ảnh.

Hình dung nhiều hình ảnh

Ghi nhật ký một tensor là tuyệt vời, nhưng nếu bạn muốn ghi nhật ký nhiều ví dụ đào tạo thì sao?

Chỉ cần xác định số lượng hình ảnh mà bạn muốn đăng nhập khi chuyển dữ liệu vào tf.summary.image() .

with file_writer.as_default():
  # Don't forget to reshape.
  images = np.reshape(train_images[0:25], (-1, 28, 28, 1))
  tf.summary.image("25 training data examples", images, max_outputs=25, step=0)

%tensorboard --logdir logs/train_data

Ghi dữ liệu hình ảnh tùy ý

Điều gì nếu bạn muốn hình dung một hình ảnh mà không phải là một tensor, chẳng hạn như một hình ảnh được tạo ra bởi matplotlib ?

Bạn cần một số mã soạn sẵn để chuyển đổi cốt truyện thành tensor, nhưng sau đó, bạn đã sẵn sàng.

Trong đoạn mã dưới đây, bạn sẽ đăng nhập trong 25 hình ảnh đầu tiên như một mạng lưới thoải mái sử dụng matplotlib của subplot() chức năng. Sau đó, bạn sẽ xem lưới trong TensorBoard:

# Clear out prior logging data.
!rm -rf logs/plots

logdir = "logs/plots/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir)

def plot_to_image(figure):
  """Converts the matplotlib plot specified by 'figure' to a PNG image and
  returns it. The supplied figure is closed and inaccessible after this call."""
  # Save the plot to a PNG in memory.
  buf = io.BytesIO()
  plt.savefig(buf, format='png')
  # Closing the figure prevents it from being displayed directly inside
  # the notebook.
  plt.close(figure)
  buf.seek(0)
  # Convert PNG buffer to TF image
  image = tf.image.decode_png(buf.getvalue(), channels=4)
  # Add the batch dimension
  image = tf.expand_dims(image, 0)
  return image

def image_grid():
  """Return a 5x5 grid of the MNIST images as a matplotlib figure."""
  # Create a figure to contain the plot.
  figure = plt.figure(figsize=(10,10))
  for i in range(25):
    # Start next subplot.
    plt.subplot(5, 5, i + 1, title=class_names[train_labels[i]])
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)

  return figure

# Prepare the plot
figure = image_grid()
# Convert to image and log
with file_writer.as_default():
  tf.summary.image("Training data", plot_to_image(figure), step=0)

%tensorboard --logdir logs/plots

Xây dựng bộ phân loại hình ảnh

Bây giờ đặt tất cả điều này lại với nhau bằng một ví dụ thực tế. Rốt cuộc, bạn ở đây để thực hiện học máy chứ không phải vẽ những bức tranh đẹp!

Bạn sẽ sử dụng tóm tắt hình ảnh để hiểu mô hình của bạn đang hoạt động tốt như thế nào trong khi đào tạo một bộ phân loại đơn giản cho tập dữ liệu Fashion-MNIST.

Đầu tiên, tạo một mô hình rất đơn giản và biên dịch nó, thiết lập trình tối ưu hóa và chức năng mất mát. Bước biên dịch cũng chỉ định rằng bạn muốn ghi lại độ chính xác của trình phân loại trong quá trình thực hiện.

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(
    optimizer='adam', 
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

Khi đào tạo một phân loại, nó rất hữu ích để xem ma trận nhầm lẫn . Ma trận nhầm lẫn cung cấp cho bạn kiến ​​thức chi tiết về cách trình phân loại của bạn hoạt động trên dữ liệu kiểm tra.

Định nghĩa một hàm tính toán ma trận nhầm lẫn. Bạn sẽ sử dụng một thuận tiện Scikit-học chức năng để làm điều này, và sau đó âm mưu sử dụng nó matplotlib.

def plot_confusion_matrix(cm, class_names):
  """
  Returns a matplotlib figure containing the plotted confusion matrix.

  Args:
    cm (array, shape = [n, n]): a confusion matrix of integer classes
    class_names (array, shape = [n]): String names of the integer classes
  """
  figure = plt.figure(figsize=(8, 8))
  plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
  plt.title("Confusion matrix")
  plt.colorbar()
  tick_marks = np.arange(len(class_names))
  plt.xticks(tick_marks, class_names, rotation=45)
  plt.yticks(tick_marks, class_names)

  # Compute the labels from the normalized confusion matrix.
  labels = np.around(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], decimals=2)

  # Use white text if squares are dark; otherwise black.
  threshold = cm.max() / 2.
  for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
    color = "white" if cm[i, j] > threshold else "black"
    plt.text(j, i, labels[i, j], horizontalalignment="center", color=color)

  plt.tight_layout()
  plt.ylabel('True label')
  plt.xlabel('Predicted label')
  return figure

Bây giờ bạn đã sẵn sàng để đào tạo trình phân loại và thường xuyên ghi lại ma trận nhầm lẫn trên đường đi.

Đây là những gì bạn sẽ làm:

  1. Tạo callback Keras TensorBoard để đăng nhập số liệu cơ bản
  2. Tạo một Keras LambdaCallback để đăng nhập ma trận nhầm lẫn ở phần cuối của mọi thời đại
  3. Đào tạo mô hình bằng cách sử dụng Model.fit (), đảm bảo chuyển cả hai lệnh gọi lại

Khi quá trình đào tạo diễn ra, hãy cuộn xuống để xem TensorBoard khởi động.

# Clear out prior logging data.
!rm -rf logs/image

logdir = "logs/image/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Define the basic TensorBoard callback.
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
file_writer_cm = tf.summary.create_file_writer(logdir + '/cm')
def log_confusion_matrix(epoch, logs):
  # Use the model to predict the values from the validation dataset.
  test_pred_raw = model.predict(test_images)
  test_pred = np.argmax(test_pred_raw, axis=1)

  # Calculate the confusion matrix.
  cm = sklearn.metrics.confusion_matrix(test_labels, test_pred)
  # Log the confusion matrix as an image summary.
  figure = plot_confusion_matrix(cm, class_names=class_names)
  cm_image = plot_to_image(figure)

  # Log the confusion matrix as an image summary.
  with file_writer_cm.as_default():
    tf.summary.image("Confusion Matrix", cm_image, step=epoch)

# Define the per-epoch callback.
cm_callback = keras.callbacks.LambdaCallback(on_epoch_end=log_confusion_matrix)
# Start TensorBoard.
%tensorboard --logdir logs/image

# Train the classifier.
model.fit(
    train_images,
    train_labels,
    epochs=5,
    verbose=0, # Suppress chatty output
    callbacks=[tensorboard_callback, cm_callback],
    validation_data=(test_images, test_labels),
)

Lưu ý rằng độ chính xác đang tăng lên trên cả tập hợp xác thực và xe lửa. Đó là một dấu hiệu tốt. Nhưng mô hình hoạt động như thế nào trên các tập con cụ thể của dữ liệu?

Chọn tab "Hình ảnh" để trực quan hóa ma trận nhầm lẫn đã ghi của bạn. Kiểm tra "Hiển thị kích thước hình ảnh thực tế" ở trên cùng bên trái để xem ma trận nhầm lẫn ở kích thước đầy đủ.

Theo mặc định, bảng điều khiển hiển thị tóm tắt hình ảnh cho bước hoặc kỷ nguyên được ghi cuối cùng. Sử dụng thanh trượt để xem các ma trận nhầm lẫn trước đó. Lưu ý rằng ma trận thay đổi đáng kể như thế nào khi quá trình đào tạo diễn ra, với các ô vuông tối hơn tập hợp lại dọc theo đường chéo và phần còn lại của ma trận có xu hướng về 0 và màu trắng. Điều này có nghĩa là trình phân loại của bạn đang được cải thiện khi quá trình đào tạo diễn ra! Công việc tuyệt vời!

Ma trận nhầm lẫn cho thấy rằng mô hình đơn giản này có một số vấn đề. Mặc dù có những tiến bộ vượt bậc, Áo sơ mi, Áo phông và Áo chui đầu đang bị lẫn lộn với nhau. Mô hình cần nhiều công việc hơn.

Nếu bạn quan tâm, hãy cố gắng cải thiện mô hình này với một mạng chập (CNN).