عرض بيانات الصورة في TensorBoard

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

باستخدام API ملخص TensorFlow صورة، يمكنك بسهولة تسجيل التنسورات والصور التعسفية وعرضها في 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 صورة ذات تدرج رمادي 28 × 28 لمنتجات الموضة من 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

لاحظ أن شكل كل صورة في مجموعة البيانات هو موتر من الدرجة الثانية للشكل (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

تسجيل بيانات الصورة التعسفية

ما إذا كنت تريد أن تصور صورة هذا ليس الموترة، مثل صورة الناتجة عن matplotlib ؟

أنت بحاجة إلى بعض التعليمات البرمجية المعيارية لتحويل المؤامرة إلى موتر ، ولكن بعد ذلك ، من الجيد أن تبدأ.

في التعليمات البرمجية أدناه، سوف تقوم بتسجيل أول صور 25 كما لطيفة الشبكة باستخدام matplotlib في 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 تعلم وظيفة للقيام بذلك، ومن ثم رسم باستخدام 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

أنت الآن جاهز لتدريب المصنف وتسجيل مصفوفة الارتباك بانتظام على طول الطريق.

إليك ما ستفعله:

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

لاحظ أن الدقة تتزايد في كل من مجموعات القطار والتحقق من الصحة. هذه علامة جيدة. ولكن كيف يعمل النموذج على مجموعات فرعية معينة من البيانات؟

حدد علامة التبويب "الصور" لتصور مصفوفات الارتباك التي تم تسجيلها. حدد "إظهار الحجم الفعلي للصورة" في الجزء العلوي الأيسر لرؤية مصفوفة الارتباك بالحجم الكامل.

بشكل افتراضي ، تعرض لوحة المعلومات ملخص الصورة لآخر خطوة أو حقبة تم تسجيلها. استخدم شريط التمرير لعرض مصفوفات الارتباك السابقة. لاحظ كيف تتغير المصفوفة بشكل كبير مع تقدم التدريب ، حيث تتحد المربعات الداكنة على طول القطر ، وتميل بقية المصفوفة نحو الصفر والأبيض. هذا يعني أن المصنف الخاص بك يتحسن مع تقدم التدريب! عمل عظيم!

توضح مصفوفة الارتباك أن هذا النموذج البسيط به بعض المشكلات. على الرغم من التقدم الكبير ، فإن القمصان والقمصان والبلوفرات يتم الخلط بينها وبين بعضها البعض. النموذج يحتاج إلى مزيد من العمل.

إذا كنت مهتما، في محاولة لتحسين هذا النموذج مع شبكة التلافيف (CNN).