টেনসরবোর্ডে ইমেজ ডেটা প্রদর্শন করা হচ্ছে

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

TensorFlow ভাবমূর্তি সারাংশ API ব্যবহার, আপনি সহজেই tensors ও নির্বিচারে ইমেজ লগ ইন করুন এবং TensorBoard তাদের দেখতে পারেন। এই নমুনা এবং আপনার ইনপুট ডেটা পরীক্ষা বা অত্যন্ত সহায়ক হতে পারে স্তর ওজন ঠাহর এবং উত্পন্ন tensors । আপনি চিত্র হিসাবে ডায়াগনস্টিক ডেটা লগ করতে পারেন যা আপনার মডেল বিকাশের সময় সহায়ক হতে পারে।

এই টিউটোরিয়ালে, আপনি শিখবেন কিভাবে ইমেজ সারাংশ এপিআই ব্যবহার করে টেনসরকে ইমেজ হিসেবে কল্পনা করতে হয়। এছাড়াও আপনি শিখবেন কিভাবে একটি নির্বিচারে ছবি তুলতে হয়, এটিকে টেনসরে রূপান্তর করতে হয় এবং টেনসরবোর্ডে এটিকে কল্পনা করতে হয়। আপনি একটি সাধারণ কিন্তু বাস্তব উদাহরণের মাধ্যমে কাজ করবেন যা চিত্র সারাংশ ব্যবহার করে আপনাকে বুঝতে সাহায্য করবে যে আপনার মডেলটি কীভাবে কাজ করছে।

সেটআপ

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 ডেটা সেটটি। এই ডেটাসেটে 10টি বিভাগের ফ্যাশন পণ্যের 70,000 28x28 গ্রেস্কেল চিত্র রয়েছে, প্রতি বিভাগে 7,000টি চিত্র রয়েছে।

প্রথমে ডেটা ডাউনলোড করুন:

# 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

একটি একক ইমেজ ভিজ্যুয়ালাইজ করা

চিত্র সারাংশ API কীভাবে কাজ করে তা বোঝার জন্য, আপনি এখন টেনসরবোর্ডে আপনার প্রশিক্ষণ সেটের প্রথম প্রশিক্ষণ চিত্রটি লগ করতে যাচ্ছেন।

আপনি এটি করার আগে, আপনার প্রশিক্ষণ ডেটার আকার পরীক্ষা করুন:

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

আপনি এখন এই ছবিটি লগ করতে এবং এটি টেনসরবোর্ডে দেখতে প্রস্তুত৷

# 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 ব্যবহার করুন। UI স্পিন আপ হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করুন।

%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 ?

প্লটটিকে টেনসরে রূপান্তর করতে আপনার কিছু বয়লারপ্লেট কোডের প্রয়োজন, কিন্তু তার পরে, আপনি যেতে পারবেন।

নিচের কোড, আপনি matplotlib এর ব্যবহার করে একটি চমৎকার গ্রিড হিসাবে প্রথম 25 ইমেজ লগ ইন করুন করব subplot() ফাংশন। তারপরে আপনি টেনসরবোর্ডে গ্রিডটি দেখতে পাবেন:

# 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

একটি ইমেজ ক্লাসিফায়ার নির্মাণ

এখন একটি বাস্তব উদাহরণ সহ এই সব একসাথে রাখুন। সর্বোপরি, আপনি এখানে মেশিন লার্নিং করতে এসেছেন এবং সুন্দর ছবি প্লট করার জন্য নয়!

ফ্যাশন-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),
)

লক্ষ্য করুন যে ট্রেন এবং বৈধতা উভয় সেটেই নির্ভুলতা আরোহণ করছে। এটা একটা ভালো লক্ষণ। কিন্তু মডেলটি ডেটার নির্দিষ্ট উপসেটগুলিতে কীভাবে কাজ করছে?

আপনার লগ করা বিভ্রান্তি ম্যাট্রিক্সগুলি কল্পনা করতে "চিত্র" ট্যাবটি নির্বাচন করুন৷ সম্পূর্ণ আকারে বিভ্রান্তি ম্যাট্রিক্স দেখতে উপরের বাম দিকে "প্রকৃত চিত্রের আকার দেখান" চেক করুন।

ডিফল্টরূপে ড্যাশবোর্ড শেষ লগ করা ধাপ বা যুগের চিত্র সারাংশ দেখায়। আগের বিভ্রান্তি ম্যাট্রিক্স দেখতে স্লাইডার ব্যবহার করুন। প্রশিক্ষণের অগ্রগতির সাথে সাথে ম্যাট্রিক্স কীভাবে উল্লেখযোগ্যভাবে পরিবর্তিত হয় তা লক্ষ্য করুন, তির্যক বরাবর গাঢ় বর্গক্ষেত্র একত্রিত হয় এবং বাকি ম্যাট্রিক্স 0 এবং সাদার দিকে ঝুঁকছে। এর মানে হল যে প্রশিক্ষণের অগ্রগতির সাথে সাথে আপনার শ্রেণীবদ্ধকারীর উন্নতি হচ্ছে! মহান কাজ!

বিভ্রান্তি ম্যাট্রিক্স দেখায় যে এই সাধারণ মডেলটিতে কিছু সমস্যা রয়েছে। দুর্দান্ত অগ্রগতি সত্ত্বেও, শার্ট, টি-শার্ট এবং পুলওভার একে অপরের সাথে বিভ্রান্ত হচ্ছে। মডেল আরো কাজ প্রয়োজন.

আপনি আগ্রহী হলে, একটি সঙ্গে এই মডেল উন্নত করতে চেষ্টা convolutional নেটওয়ার্কের (সিএনএন)।