TensorBoard Scalars: Ghi nhật ký số liệu đào tạo trong Keras

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub

Tổng quat

Học máy luôn liên quan đến việc hiểu các số liệu chính như mất mát và cách chúng thay đổi khi quá trình đào tạo tiến triển. Những số liệu có thể giúp bạn hiểu nếu bạn đang overfitting , ví dụ, hoặc nếu bạn đào tạo không cần thiết đang quá lâu. Bạn có thể muốn so sánh các chỉ số này qua các lần chạy đào tạo khác nhau để giúp gỡ lỗi và cải thiện mô hình của mình.

Vô hướng Dashboard TensorBoard cho phép bạn hình dung những số liệu sử dụng một API đơn giản với rất ít nỗ lực. Hướng dẫn này trình bày các ví dụ rất cơ bản để giúp bạn tìm hiểu cách sử dụng các API này với TensorBoard khi phát triển mô hình Keras của mình. Bạn sẽ học cách sử dụng API gọi lại Keras TensorBoard và Tóm tắt TensorFlow để trực quan hóa các đại lượng tùy chỉnh và mặc định.

Thành lập

# Load the TensorBoard notebook extension.
%load_ext tensorboard
from datetime import datetime
from packaging import version

import tensorflow as tf
from tensorflow import keras

import numpy as np

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

Thiết lập dữ liệu cho một hồi quy đơn giản

Bây giờ bạn sẽ sử dụng Keras để tính toán một hồi quy, tức là, tìm dòng tốt nhất của sự phù hợp cho một tập dữ liệu ghép nối. (Trong khi sử dụng mạng thần kinh và gradient descent là quá mức cần thiết cho các loại hình vấn đề , nó làm cho một ví dụ rất dễ hiểu.)

Bạn sẽ sử dụng TensorBoard để quan sát cách đào tạo và mất kiểm tra sự thay đổi qua các thời kỳ. Hy vọng rằng bạn sẽ thấy việc luyện tập và mất bài kiểm tra giảm dần theo thời gian và sau đó vẫn ổn định.

Đầu tiên, tạo ra 1000 điểm dữ liệu khoảng dọc theo đường y = 0.5x + 2. Chia các điểm dữ liệu này thành các tập huấn luyện và kiểm tra. Hy vọng của bạn là mạng lưới thần kinh học được mối quan hệ này.

data_size = 1000
# 80% of the data is for training.
train_pct = 0.8

train_size = int(data_size * train_pct)

# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size)
np.random.shuffle(x)

# Generate the output data.
# y = 0.5x + 2 + noise
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))

# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size]
x_test, y_test = x[train_size:], y[train_size:]

Đào tạo mô hình và ghi chép thất thoát

Bây giờ bạn đã sẵn sàng để xác định, đào tạo và đánh giá mô hình của mình.

Để đăng nhập vô hướng mất khi bạn tập luyện, bạn sẽ làm như sau:

  1. Tạo Keras callback TensorBoard
  2. Chỉ định một thư mục nhật ký
  3. Vượt qua callback TensorBoard để Keras' Model.fit () .

TensorBoard đọc dữ liệu nhật ký từ hệ thống phân cấp thư mục nhật ký. Trong máy tính xách tay này, thư mục log gốc là logs/scalars , với hậu tố bởi một thư mục con timestamped. Thư mục con có dấu thời gian cho phép bạn dễ dàng xác định và chọn các lần chạy đào tạo khi bạn sử dụng TensorBoard và lặp lại trên mô hình của mình.

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(learning_rate=0.2),
)

print("Training ... With default parameters, this takes less than 10 seconds.")
training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback],
)

print("Average test loss: ", np.average(training_history.history['loss']))
Training ... With default parameters, this takes less than 10 seconds.
Average test loss:  0.05271831926424056

Kiểm tra tổn thất bằng TensorBoard

Bây giờ, khởi động TensorBoard, chỉ định thư mục bản ghi gốc mà bạn đã sử dụng ở trên.

Chờ vài giây để giao diện người dùng của TensorBoard quay lên.

%tensorboard --logdir logs/scalars

Bạn có thể thấy TensorBoard hiển thị thông báo "Không có trang tổng quan nào đang hoạt động cho tập dữ liệu hiện tại". Đó là bởi vì dữ liệu ghi nhật ký ban đầu vẫn chưa được lưu. Khi quá trình đào tạo diễn ra, mô hình Keras sẽ bắt đầu ghi dữ liệu. TensorBoard sẽ định kỳ làm mới và hiển thị cho bạn các chỉ số vô hướng của bạn. Nếu thiếu kiên nhẫn, bạn có thể nhấn vào mũi tên Làm mới ở trên cùng bên phải.

Khi bạn theo dõi tiến trình đào tạo, hãy lưu ý rằng mất mát cả quá trình đào tạo và xác nhận đều giảm nhanh chóng như thế nào và sau đó vẫn ổn định. Trên thực tế, bạn có thể ngừng luyện tập sau 25 kỷ, bởi vì việc luyện tập không cải thiện nhiều sau thời điểm đó.

Di chuột qua biểu đồ để xem các điểm dữ liệu cụ thể. Bạn cũng có thể thử phóng to bằng chuột hoặc chọn một phần của chúng để xem chi tiết hơn.

Chú ý bộ chọn "Chạy" ở bên trái. "Chạy" đại diện cho một tập hợp các bản ghi từ một vòng đào tạo, trong trường hợp này là kết quả của Model.fit (). Các nhà phát triển thường có rất nhiều lần chạy, khi họ thử nghiệm và phát triển mô hình của mình theo thời gian.

Sử dụng bộ chọn Chạy để chọn các lần chạy cụ thể hoặc chỉ chọn từ đào tạo hoặc xác nhận. So sánh các lần chạy sẽ giúp bạn đánh giá phiên bản mã nào đang giải quyết vấn đề của bạn tốt hơn.

Ok, đồ thị tổn thất của TensorBoard chứng tỏ rằng tổn thất luôn giảm cho cả quá trình đào tạo và xác nhận và sau đó ổn định. Điều đó có nghĩa là các chỉ số của mô hình có thể rất tốt! Bây giờ hãy xem mô hình thực sự hoạt động như thế nào trong cuộc sống thực.

Căn cứ vào dữ liệu đầu vào (60, 25, 2), dòng y = 0.5x + 2 nên năng suất (32, 14,5, 3). Người mẫu có đồng ý không?

print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
[[32.234306 ]
 [14.5974245]
 [ 3.0074697]]

Không tệ!

Ghi nhật ký các vô hướng tùy chỉnh

Điều gì nếu bạn muốn đăng nhập giá trị tùy chỉnh, chẳng hạn như một tỷ lệ học năng động ? Để làm điều đó, bạn cần sử dụng API Tóm tắt TensorFlow.

Đào tạo lại mô hình hồi quy và ghi lại tỷ lệ học tập tùy chỉnh. Đây là cách thực hiện:

  1. Tạo một nhà văn tập tin, sử dụng tf.summary.create_file_writer() .
  2. Xác định một hàm tỷ lệ học tập tùy chỉnh. Điều này sẽ được chuyển tới các Keras LearningRateScheduler gọi lại.
  3. Bên trong hàm tỷ lệ học, sử dụng tf.summary.scalar() để đăng nhập tỷ lệ học tùy chỉnh.
  4. Chuyển lệnh gọi lại LearningRateScheduler tới Model.fit ().

Nói chung, để đăng nhập một vô hướng tùy chỉnh, bạn cần phải sử dụng tf.summary.scalar() với một nhà văn tập tin. Nhà văn tập tin có trách nhiệm ghi dữ liệu cho lần chạy này vào thư mục chỉ định và được mặc nhiên được sử dụng khi bạn sử dụng tf.summary.scalar() .

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

def lr_schedule(epoch):
  """
  Returns a custom learning rate that decreases as epochs progress.
  """
  learning_rate = 0.2
  if epoch > 10:
    learning_rate = 0.02
  if epoch > 20:
    learning_rate = 0.01
  if epoch > 50:
    learning_rate = 0.005

  tf.summary.scalar('learning rate', data=learning_rate, step=epoch)
  return learning_rate

lr_callback = keras.callbacks.LearningRateScheduler(lr_schedule)
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(),
)

training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback, lr_callback],
)

Hãy nhìn lại TensorBoard.

%tensorboard --logdir logs/scalars

Sử dụng "Chạy" chọn ở bên trái, thông báo rằng bạn có một <timestamp>/metrics chạy. Việc chọn lần chạy này sẽ hiển thị biểu đồ "tốc độ học tập" cho phép bạn xác minh sự tiến triển của tốc độ học tập trong quá trình chạy này.

Bạn cũng có thể so sánh các đường cong mất xác thực và đào tạo của lần chạy này so với các lần chạy trước đó của bạn. Bạn cũng có thể nhận thấy rằng lịch trình tốc độ học tập trả về các giá trị rời rạc, tùy thuộc vào thời kỳ, nhưng biểu đồ tốc độ học tập có thể trông mượt mà. TensorBoard có một tham số làm mịn mà bạn có thể cần phải giảm xuống 0 để xem các giá trị chưa được di chuyển.

Làm thế nào để mô hình này làm gì?

print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
[[32.234013 ]
 [14.5973015]
 [ 3.0074618]]