TensorBoard训练指标
Posted 一颗小树x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorBoard训练指标相关的知识,希望对你有一定的参考价值。
前言
机器学习涉及评估模型的指标,例如损失(loss)、准确度等,以及它们如何随着训练的进行而变化。
例如,这些指标可以帮助我们了解模型是否过拟合,或者是否不必要地训练太长时间。我们可以比较不同训练中的这些指标,以帮助调试和改善模型。
目录
一、TensorBoard的Scalars
在TensorBoard的Scalars中,能使用简单的API来可视化这些指标。帮助我们在开发Keras模型时学习如何在TensorBoard中使用这些API。
在训练模型中,通过日志记录关键指标的信息;model.fit()有回调函数的接口,我们先创建一个TensorBoard回调函数,然后传递给model.fit()就可以了。
1. 1 实现流程
- 创建Keras的TensorBoard回调函数
- 回调函数中指定日志目录
- 将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
参考:https://www.tensorflow.org/tensorboard/scalars_and_keras?hl=zh_cn
二、自定义Scalars
如果要记录自定义值,例如动态学习率,如何实现呢?
需要使用TensorBoard Summary API ,来训练模型并记录自定义学习率。
实现流程
- 使用 tf.summary.create_file_writer( ) 创建文件编辑器。
- 编写自定义学习率函数;在函数内部使用 tf.summary.scalar( ) 记录自定义学习率。
- 然后把学习率函数,传递给 Keras LearningRateScheduler 回调中。
- 将 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
然后如下界面:
还能看到动态学习率的图像:
后面的文章进一步介绍~~
以上是关于TensorBoard训练指标的主要内容,如果未能解决你的问题,请参考以下文章
小白学习tensorflow教程二TensorBoard可视化模型训练