نمایش داده های تصویر در TensorBoard

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

با استفاده از TensorFlow تصویر خلاصه API، شما به راحتی می توانید تانسورها و تصاویر دلخواه وارد شوید و آنها را در TensorBoard. این می تواند بسیار مفید به نمونه و بررسی داده ورودی خود را، و یا به تجسم وزن لایه و تانسورها تولید . همچنین می‌توانید داده‌های تشخیصی را به‌عنوان تصاویر ثبت کنید که می‌توانند در مسیر توسعه مدل شما مفید باشند.

در این آموزش، نحوه استفاده از Image Summary API برای تجسم تانسورها به عنوان تصویر را خواهید آموخت. همچنین یاد خواهید گرفت که چگونه یک تصویر دلخواه بگیرید، آن را به یک تانسور تبدیل کنید و آن را در TensorBoard تجسم کنید. شما با یک مثال ساده اما واقعی کار خواهید کرد که از خلاصه تصویر استفاده می کند تا به شما در درک عملکرد مدلتان کمک کند.

برپایی

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

مجموعه داده Fashion-MNIST را دانلود کنید

شما در حال رفتن برای ساخت یک شبکه عصبی ساده به تصاویر طبقه بندی را میتوان به مد MNIST مجموعه داده. این مجموعه داده شامل 70000 تصویر در مقیاس خاکستری 28x28 از محصولات مد از 10 دسته است که در هر دسته 7000 تصویر وجود دارد.

ابتدا داده ها را دانلود کنید:

# 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

تجسم یک تصویر واحد

برای درک نحوه عملکرد Image Summary API، اکنون می‌خواهید اولین تصویر آموزشی را در مجموعه آموزشی خود در TensorBoard ثبت کنید.

قبل از انجام این کار، شکل داده های آموزشی خود را بررسی کنید:

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

توجه داشته باشید که شکل هر تصویر در مجموعه داده یک تانسور رتبه-2 شکل (28، 28) است که نشان دهنده ارتفاع و عرض است.

با این حال، tf.summary.image() انتظار یک تانسور رتبه 4 حاوی (batch_size, height, width, channels) . بنابراین، تانسورها نیاز به تغییر شکل دارند.

شما ورود به سیستم فقط یک تصویر، به طوری batch_size 1. تصاویر سیاه و سفید می باشد، به طوری که مجموعه ای channels تا 1.

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

اکنون آماده ثبت این تصویر و مشاهده آن در 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)

اکنون از TensorBoard برای بررسی تصویر استفاده کنید. چند ثانیه صبر کنید تا رابط کاربری به بالا بچرخد.

%tensorboard --logdir logs/train_data

تب "تصاویر" تصویری را که به تازگی وارد شده اید نمایش می دهد. این یک "چکمه مچ پا" است.

برای مشاهده راحت تر، تصویر به اندازه پیش فرض کوچک شده است. اگر می خواهید تصویر اصلی بدون مقیاس را مشاهده کنید، "نمایش اندازه واقعی تصویر" را در بالا سمت چپ علامت بزنید.

با لغزنده‌های روشنایی و کنتراست بازی کنید تا ببینید چگونه بر پیکسل‌های تصویر تأثیر می‌گذارند.

تجسم چندین تصویر

ثبت یک تانسور عالی است، اما اگر بخواهید چندین نمونه آموزشی را ثبت کنید چه؟

نگران نباشید، تعداد تصاویر شما می خواهید برای ورود در هنگام عبور داده تا مشخص 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

ثبت داده های تصویر دلخواه

اگر شما می خواهید به تجسم یک تصویر یک تانسور نیست، مانند یک تصویر تولید شده توسط کتابخانه متپلات ؟

برای تبدیل نمودار به تانسور به کد دیگ بخار نیاز دارید، اما پس از آن، شما آماده هستید.

در کد زیر، شما 25 تصاویر برای اولین بار به عنوان یک شبکه خوب با استفاده از کتابخانه متپلات وارد شوید subplot() تابع. سپس شبکه را در 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

ساخت طبقه بندی کننده تصویر

حالا همه اینها را با یک مثال واقعی کنار هم بگذارید. بالاخره، شما اینجا هستید تا یادگیری ماشینی انجام دهید و تصاویر زیبا را ترسیم نکنید!

شما می‌خواهید از خلاصه‌های تصویری استفاده کنید تا متوجه شوید که مدل شما در حین آموزش یک طبقه‌بندی ساده برای مجموعه داده Fashion-MNIST چقدر خوب عمل می‌کند.

ابتدا یک مدل بسیار ساده ایجاد کنید و آن را کامپایل کنید و تابع بهینه ساز و ضرر را تنظیم کنید. مرحله کامپایل همچنین مشخص می کند که می خواهید دقت طبقه بندی کننده را در طول مسیر ثبت کنید.

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']
)

زمانی که آموزش یک طبقه بندی، آن را مفید برای دیدن ماتریس سردرگمی . ماتریس سردرگمی به شما اطلاعات دقیقی از نحوه عملکرد طبقه‌بندی کننده شما بر روی داده‌های آزمایشی می‌دهد.

تابعی را تعریف کنید که ماتریس سردرگمی را محاسبه کند. شما راحت استفاده Scikit یادگیری تابع برای این کار، و پس از آن طرح آن با استفاده از کتابخانه متپلات.

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

اکنون آماده آموزش طبقه بندی کننده هستید و به طور منظم ماتریس سردرگمی را در طول مسیر ثبت می کنید.

این چیزی است که شما انجام خواهید داد:

  1. ایجاد پاسخ به تماس Keras TensorBoard برای ورود معیارهای اساسی
  2. درست Keras LambdaCallback برای ورود ماتریس سردرگمی در پایان هر دوره
  3. مدل را با استفاده از Model.fit() آموزش دهید، مطمئن شوید که هر دو تماس را ارسال می کنید

با پیشرفت آموزش، به پایین بروید تا TensorBoard راه اندازی شود.

# 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),
)

توجه داشته باشید که دقت در هر دو مجموعه قطار و اعتبار در حال افزایش است. این نشانه خوبی است. اما عملکرد مدل بر روی زیر مجموعه های خاصی از داده ها چگونه است؟

برگه "تصاویر" را انتخاب کنید تا ماتریس های سردرگمی ثبت شده خود را تجسم کنید. "نمایش اندازه واقعی تصویر" را در بالا سمت چپ علامت بزنید تا ماتریس سردرگمی را در اندازه کامل ببینید.

به طور پیش فرض داشبورد خلاصه تصویر آخرین مرحله یا دوره ثبت شده را نشان می دهد. از نوار لغزنده برای مشاهده ماتریس های سردرگمی قبلی استفاده کنید. توجه کنید که چگونه ماتریس به طور قابل توجهی با پیشرفت تمرین تغییر می کند، با مربع های تیره تر در امتداد مورب ادغام می شوند، و بقیه ماتریس به سمت 0 و سفید متمایل می شوند. این بدان معنی است که طبقه بندی کننده شما با پیشرفت آموزش در حال بهبود است! کار عالی!

ماتریس سردرگمی نشان می دهد که این مدل ساده مشکلاتی دارد. علیرغم پیشرفت زیاد، پیراهن ها، تی شرت ها، و پیراهن ها با یکدیگر اشتباه گرفته می شوند. مدل نیاز به کار بیشتری دارد.

اگر شما علاقه مند هستید، سعی کنید به بهبود این مدل را با یک شبکه کانولوشن (سی ان ان).