TensorBoard(2)训练指标

举报
一颗小树x 发表于 2021/06/18 14:24:30 2021/06/18
【摘要】 机器学习涉及评估模型的指标,例如损失(loss)、准确度等,以及它们如何随着训练的进行而变化。

前言

机器学习涉及评估模型的指标,例如损失(loss)、准确度等,以及它们如何随着训练的进行而变化。

例如,这些指标可以帮助我们了解模型是否过拟合,或者是否不必要地训练太长时间。我们可以比较不同训练中的这些指标,以帮助调试和改善模型。

 

一、TensorBoard的Scalars

在TensorBoard的Scalars中,能使用简单的API来可视化这些指标。帮助我们在开发Keras模型时学习如何在TensorBoard中使用这些API。

在训练模型中,通过日志记录关键指标的信息;model.fit()有回调函数的接口,我们先创建一个TensorBoard回调函数,然后传递给model.fit()就可以了。

1. 1 实现流程

  1. 创建Keras的TensorBoard回调函数
  2. 回调函数中指定日志目录
  3. 将TensorBoard回调函数 传递给 Keras Model.fit()
# 日志目录
logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")

# 创建TensorBoard 回调传递,并指定日志路径
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(lr=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],  # 将TensorBoard回调传递给Model.fit().
)

print("Average test loss: ", np.average(training_history.history['loss']))

TensorBoard从日志目录层次结构中读取日志数据。在上面代码中,日志目录是logs/scalars,后缀有时间戳的子目录。

带时间戳的子目录使我们可以在使用TensorBoard,并在模型进行迭代是轻松识别训练过程。

 

1.2 启动TensorBoard

执行如下命令:

%tensorboard --logdir logs/scalars

等一会,能看到如下界面:

在观看训练进度是,需要注意训练金额验证损失如何迅速减少,然后保持稳定。

实际上,可能在25个epochs后就停止了训练,因为在此之后训练并没有太大改善。

 

可以点击图像左下角的 [ ] 会放大图像的;

然后,将鼠标悬停在图像上可以查看特定的数据点。我们也可尝试使用鼠标放大,或选择其中的一部分一查看更多详细信息。

 

1.3 完整代码

首先加载tensorboard

# Load the TensorBoard notebook extension.
%load_ext tensorboard

 清楚之前的日志(可选)

# Clear any logs from previous runs
rm -rf ./logs/

再执行如下代码:

# 回归模型,使用 Keras 计算回归,即找到对应数据集的最佳拟合。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

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."


# 使用 TensorBoard 观察训练和测试*损失 (loss) *在各个时期之间如何变化。 通常会看到训练集和测试集损失随着时间的流逝而减少,然后保持稳定。

data_size = 1000
# 80% 的数据用来训练
train_pct = 0.8

train_size = int(data_size * train_pct)

# 创建在(-1,1)范围内的随机数作为输入
x = np.linspace(-1, 1, data_size)
np.random.shuffle(x)

# 生成输出数据
# y = 0.5x + 2 + noise
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))

# 将数据分成训练和测试集
x_train, y_train = x[:train_size], y[:train_size]
x_test, y_test = x[train_size:], y[train_size:]

# 日志目录
logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")

# 创建TensorBoard 回调传递,并指定日志路径
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(lr=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],  # 将TensorBoard回调传递给Model.fit().
)

print("Average test loss: ", np.average(training_history.history['loss']))

 然后打开tensorboard即可。

在notebook中,使用%tensorboard 命令:

%tensorboard --logdir logs/fit

在命令行中,运行是不带"%"的,命令基本一样:

tensorboard --logdir logs/fit

 

 

二、自定义Scalars

如果要记录自定义值,例如动态学习率,如何实现呢?

需要使用TensorBoard Summary API ,来训练模型并记录自定义学习率。

实现流程

  1. 使用 tf.summary.create_file_writer( ) 创建文件编辑器。
  2. 编写自定义学习率函数;在函数内部使用 tf.summary.scalar( ) 记录自定义学习率。
  3. 然后把学习率函数,传递给 Keras LearningRateScheduler 回调中。
  4. 将 LearningRateScheduler回调 传递给Model.fit( )

下面结合代码一步 一步实现:

1、使用 tf.summary.create_file_writer( ) 创建文件编辑器。

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

2、编写自定义学习率函数;在函数内部使用 tf.summary.scalar( ) 记录自定义学习率。

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

3、然后把学习率函数,传递给 Keras LearningRateScheduler 回调中。

lr_callback = keras.callbacks.LearningRateScheduler(lr_schedule)

4、将 LearningRateScheduler回调 传递给Model.fit( )

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

整合上面的代码:

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

然后如下界面:

还能看到动态学习率的图像:

 

参考:https://www.tensorflow.org/tensorboard/scalars_and_keras?hl=zh_cn

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200