TensorBoard Scalar: Keras에서 훈련 측정항목 로깅

TensorFlow.org에서 보기 Google Colab에서 실행 GitHub에서 소스 보기

개요

머신 러닝은 항상 손실과 같은 주요 메트릭과 교육이 진행됨에 따라 변경되는 방식을 이해하는 것을 포함합니다. 이 통계는 당신이하는 경우 당신이 이해하는 데 도움이 overfitting 예를 들어, 너무 오래 당신이 경우에있는 거 불필요하게 훈련. 모델을 디버그하고 개선하는 데 도움이 되도록 다양한 훈련 실행에서 이러한 메트릭을 비교할 수 있습니다.

TensorBoard의 스칼라 대시 보드는 아주 작은 노력으로 간단한 API를 사용하여 이러한 메트릭을 시각화 할 수 있습니다. 이 튜토리얼은 Keras 모델을 개발할 때 TensorBoard와 함께 이러한 API를 사용하는 방법을 배우는 데 도움이 되는 매우 기본적인 예제를 제공합니다. Keras TensorBoard 콜백 및 TensorFlow 요약 API를 사용하여 기본 및 사용자 지정 스칼라를 시각화하는 방법을 배웁니다.

설정

# 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

단순 회귀에 대한 데이터 설정

당신은 지금 사용하는거야 Keras을 페어링 데이터 세트에 맞는 최고의 라인을 찾아, 즉 회귀를 계산합니다. (신경망 및 그라데이션 하강을 사용하는 동안 것은 이런 종류의 문제에 대한 과잉 그것은 매우 이해하기 쉽게 예를 들어 메이크업을하지 않습니다.)

당신은 신 (新) 시대에 걸쳐 방법 교육 및 시험 손실의 변화를 관찰 할 수 TensorBoard을 사용하는 것입니다. 시간이 지남에 따라 훈련 및 테스트 손실이 감소한 다음 안정적으로 유지되기를 바랍니다.

먼저, 대략 라인 Y = 0.5X + 2 1,000 따라 데이터 요소를 생성한다. 이 데이터 포인트를 훈련 세트와 테스트 세트로 나눕니다. 신경망이 이 관계를 학습하기를 바랍니다.

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:]

모델 학습 및 손실 로깅

이제 모델을 정의, 훈련 및 평가할 준비가 되었습니다.

당신이 훈련으로 손실 스칼라를 기록하려면 다음을 수행합니다 :

  1. Keras 만들기 TensorBoard 콜백을
  2. 로그 디렉토리 지정
  3. Keras '에 TensorBoard 콜백을 전달 Model.fit () .

TensorBoard는 로그 디렉토리 계층 구조에서 로그 데이터를 읽습니다. 이 노트북에서 루트 로그 디렉토리는 logs/scalars 타임 스탬프 하위 접미사. 타임스탬프가 지정된 하위 디렉터리를 사용하면 TensorBoard를 사용하고 모델을 반복할 때 학습 실행을 쉽게 식별하고 선택할 수 있습니다.

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

TensorBoard를 사용하여 손실 검사

이제 위에서 사용한 루트 로그 디렉터리를 지정하여 TensorBoard를 시작합니다.

TensorBoard의 UI가 회전할 때까지 몇 초 동안 기다립니다.

%tensorboard --logdir logs/scalars

TensorBoard에 "현재 데이터 세트에 대해 활성화된 대시보드가 ​​없습니다"라는 메시지가 표시될 수 있습니다. 아직 초기 로깅 데이터가 저장되지 않았기 때문입니다. 학습이 진행됨에 따라 Keras 모델은 데이터 로깅을 시작합니다. TensorBoard는 주기적으로 새로고침하여 스칼라 측정항목을 표시합니다. 참을성이 없으면 오른쪽 상단의 새로 고침 화살표를 탭할 수 있습니다.

훈련 진행 상황을 관찰하면서 훈련 손실과 검증 손실이 모두 급격히 감소한 다음 안정적으로 유지되는 방법을 확인하십시오. 사실, 25 Epoch 후에 훈련을 중단했을 수도 있습니다. 그 시점 이후로는 훈련이 크게 개선되지 않았기 때문입니다.

특정 데이터 포인트를 보려면 그래프 위로 마우스를 가져갑니다. 마우스로 확대하거나 일부를 선택하여 더 자세히 볼 수도 있습니다.

왼쪽의 "실행" 선택기를 확인하십시오. "실행"은 훈련 라운드의 로그 세트를 나타내며, 이 경우 Model.fit()의 결과입니다. 개발자는 일반적으로 시간이 지남에 따라 모델을 실험하고 개발할 때 많은 실행을 합니다.

실행 선택기를 사용하여 특정 실행을 선택하거나 훈련 또는 검증에서만 선택합니다. 실행을 비교하면 문제를 더 잘 해결하는 코드 버전을 평가하는 데 도움이 됩니다.

좋습니다. TensorBoard의 손실 그래프는 손실이 훈련과 검증 모두에서 일관되게 감소한 다음 안정화되었음을 보여줍니다. 이는 모델의 메트릭이 매우 우수할 수 있음을 의미합니다! 이제 모델이 실제 생활에서 실제로 어떻게 작동하는지 확인하십시오.

입력 데이터 (60, 25, 2) 주어진 광고 Y = 0.5X + 2 수득한다 (32, 14.5, 3). 모델이 동의합니까?

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

나쁘지 않다!

사용자 지정 스칼라 로깅

당신이 예와 같은 사용자 정의 값을 기록 할 경우 동적 학습 속도를 ? 그렇게 하려면 TensorFlow 요약 API를 사용해야 합니다.

회귀 모델을 다시 훈련시키고 사용자 지정 학습률을 기록합니다. 방법은 다음과 같습니다.

  1. 사용하여 파일 라이터를 작성 tf.summary.create_file_writer() .
  2. 맞춤 학습률 함수를 정의합니다. 이것은 Keras에 전달됩니다 LearningRateScheduler의 콜백.
  3. 학습 속도의 함수 내부를 사용 tf.summary.scalar() 사용자 정의 학습 속도를 기록한다.
  4. Model.fit()에 LearningRateScheduler 콜백을 전달합니다.

일반적으로, 사용자 정의 스칼라를 기록, 당신은 사용할 필요가 tf.summary.scalar() 파일 작가와 함께. 파일 라이터가 지정된 디렉토리이 실행에 대한 데이터를 작성하기위한 책임이 있으며 당신이 사용하는 경우 암시 적으로 사용되는 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],
)

TensorBoard를 다시 살펴보겠습니다.

%tensorboard --logdir logs/scalars

당신이 가지고 왼쪽에 통보를 "실행합니다"선택기를 사용하여 <timestamp>/metrics 실행. 이 실행을 선택하면 이 실행 중 학습률의 진행 상황을 확인할 수 있는 "학습률" 그래프가 표시됩니다.

이 실행의 훈련 및 검증 손실 곡선을 이전 실행과 비교할 수도 있습니다. 또한 학습률 일정이 에포크에 따라 이산 값을 반환했지만 학습률 플롯이 매끄럽게 나타날 수 있음을 알 수 있습니다. TensorBoard에는 평활화되지 않은 값을 보려면 0으로 낮추어야 할 수 있는 평활화 매개변수가 있습니다.

이 모델은 어떻게 합니까?

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