TensorBoard'da görüntü verilerini görüntüleme

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

TensorFlow Görüntü Özeti API kullanarak, kolayca Tensörleri ve keyfi görüntüleri log ve TensorBoard şekilde görebilirsiniz. Bu örnek ve giriş verileri incelemek, ya da son derece yararlı olabilir katman ağırlıkları görselleştirmek ve oluşturulan tensörleri . Tanılama verilerini, model geliştirmeniz sırasında yardımcı olabilecek görüntüler olarak da kaydedebilirsiniz.

Bu öğreticide, tensörleri görüntü olarak görselleştirmek için Görüntü Özeti API'sinin nasıl kullanılacağını öğreneceksiniz. Ayrıca keyfi bir görüntü almayı, onu tensöre dönüştürmeyi ve TensorBoard'da görselleştirmeyi öğreneceksiniz. Modelinizin nasıl performans gösterdiğini anlamanıza yardımcı olması için Görüntü Özetlerini kullanan basit ama gerçek bir örnek üzerinde çalışacaksınız.

Kurmak

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 veri setini indirin

İçeri sınıfladıkları'nı görüntülere basit sinir ağı oluşturmak için gidiyoruz Moda-MNIST veri kümesi. Bu veri seti, kategori başına 7.000 görüntü ile 10 kategoriden moda ürünlerinin 70.000 28x28 gri tonlamalı görüntüsünden oluşur.

İlk önce verileri indirin:

# 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

Tek bir görüntüyü görselleştirme

Görüntü Özeti API'sinin nasıl çalıştığını anlamak için, şimdi TensorBoard'daki eğitim setinizdeki ilk eğitim görüntüsünü kaydetmeniz yeterlidir.

Bunu yapmadan önce egzersiz verilerinizin şeklini inceleyin:

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

Veri kümesindeki her görüntünün şeklinin, yüksekliği ve genişliği temsil eden bir sıra-2 şekil tensörü (28, 28) olduğuna dikkat edin.

Bununla birlikte, tf.summary.image() ihtiva eden bir seviye-4 tensörünün bekler (batch_size, height, width, channels) . Bu nedenle, tensörlerin yeniden şekillendirilmesi gerekir.

Böylece tek görüntü, konum günlüğü batch_size görüntüleri gri tonlama vardır 1'dir, yani set channels 1'e.

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

Artık bu görüntüyü günlüğe kaydetmeye ve TensorBoard'da görüntülemeye hazırsınız.

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

Şimdi görüntüyü incelemek için TensorBoard'u kullanın. Kullanıcı arayüzünün dönmesi için birkaç saniye bekleyin.

%tensorboard --logdir logs/train_data

"Görüntüler" sekmesi, az önce kaydettiğiniz görüntüyü görüntüler. Bu bir "ayak bileği çizmesi".

Görüntü, daha kolay görüntüleme için varsayılan bir boyuta ölçeklenir. Ölçeklenmemiş orijinal görüntüyü görüntülemek istiyorsanız, sol üstteki "Gerçek görüntü boyutunu göster" seçeneğini işaretleyin.

Görüntü piksellerini nasıl etkilediklerini görmek için parlaklık ve kontrast kaydırıcılarıyla oynayın.

Birden fazla görüntüyü görselleştirme

Bir tensörü günlüğe kaydetmek harika, ama ya birden fazla eğitim örneğini günlüğe kaydetmek isterseniz?

Basitçe veri geçerken oturum açmak istediğiniz görüntü sayısını belirtmek 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

Rastgele görüntü verilerini günlüğe kaydetme

Ne tür tarafından üretilen bir görüntü olarak bir tensör olmayan bir resim, görselleştirmek isterseniz matplotlib ?

Grafiği bir tensöre dönüştürmek için bazı ortak kodlara ihtiyacınız var, ancak bundan sonra gitmeye hazırsınız.

Aşağıdaki kodunda, Matplotlib en kullanarak güzel ızgarası olarak ilk 25 görüntüleri kayda alıyoruz subplot() fonksiyonu. Ardından ızgarayı TensorBoard'da görüntüleyeceksiniz:

# 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

Bir görüntü sınıflandırıcı oluşturma

Şimdi hepsini gerçek bir örnekle bir araya getirin. Ne de olsa burada makine öğrenimi yapmak ve güzel resimler çizmek için buradasınız!

Fashion-MNIST veri kümesi için basit bir sınıflandırıcı eğitirken modelinizin ne kadar iyi çalıştığını anlamak için görüntü özetlerini kullanacaksınız.

İlk olarak, çok basit bir model oluşturun ve derleyin, optimize edici ve kayıp işlevini ayarlayın. Derleme adımı, yol boyunca sınıflandırıcının doğruluğunu günlüğe kaydetmek istediğinizi de belirtir.

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

Bir sınıflandırıcı eğitim, bu görmek yararlıdır karışıklık matrisi . Karışıklık matrisi, sınıflandırıcınızın test verileri üzerinde nasıl performans gösterdiği hakkında size ayrıntılı bilgi verir.

Karışıklık matrisini hesaplayan bir fonksiyon tanımlayın. Sen elverişli kullanacağız Scikit-öğrenme Bunu yapmanın işlevi ve sonra matplotlib kullanarak çizmek.

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

Artık sınıflandırıcıyı eğitmeye ve yol boyunca karışıklık matrisini düzenli olarak kaydetmeye hazırsınız.

İşte yapacaklarınız:

  1. Create Keras TensorBoard geri arama Temel ölçümleri günlüğe
  2. Bir oluşturun Keras LambdaCallback her dönemin sonunda karışıklık matrisi günlüğe
  3. Model.fit() kullanarak modeli eğitin, her iki geri aramayı da ilettiğinizden emin olun

Eğitim ilerledikçe, TensorBoard'un başladığını görmek için aşağı kaydırın.

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

Doğruluğun hem tren hem de doğrulama setlerinde arttığına dikkat edin. Bu iyi bir işaret. Ancak model, verilerin belirli alt kümelerinde nasıl performans gösteriyor?

Kaydedilmiş karışıklık matrislerinizi görselleştirmek için "Görüntüler" sekmesini seçin. Karışıklık matrisini tam boyutta görmek için sol üstteki "Gerçek görüntü boyutunu göster" seçeneğini işaretleyin.

Varsayılan olarak gösterge panosu, son günlüğe kaydedilen adım veya dönem için görüntü özetini gösterir. Daha önceki karışıklık matrislerini görüntülemek için kaydırıcıyı kullanın. Diyagonal boyunca daha koyu karelerin birleştiği ve matrisin geri kalanının 0 ve beyaza yöneldiği, eğitim ilerledikçe matrisin nasıl önemli ölçüde değiştiğine dikkat edin. Bu, eğitim ilerledikçe sınıflandırıcınızın geliştiği anlamına gelir! Harika iş!

Karışıklık matrisi, bu basit modelin bazı sorunları olduğunu gösteriyor. Büyük ilerlemeye rağmen Gömlekler, Tişörtler ve Kazaklar birbirine karışıyor. Modelin daha fazla çalışmaya ihtiyacı var.

Eğer ilgileniyorsanız, bir ile bu modeli geliştirmeye çalışmak konvolusyanla ağa (CNN).