Tensorboard 未显示上次训练模型的自定义指标
Tensorboard not showing the custom metric for the last trained model
我正在 python-tensorflow 上训练一系列模型并在 Tensorboard 上显示结果。这最初是在 jupyter notebook 上完成的,但显然 Colab 上也存在这个问题。
除了验证结果,我还想在 Tensorboard 上显示测试集的评估结果,为此我通过重写 on_train_end
方法创建了自定义回调,该方法调用 res = self.model.evalute(x=x_test, y=y_test, batch_size=1)
然后 tf.summary.scalar
将评估结果存储为标量。结束所有训练后,我启动 tensorboard。问题是 tensorboard 没有显示最后一个模型的指标:给定 n
个模型(其架构在 MODELS_ARCH
中定义,tensorboard 只显示第一个 [=19] 的自定义指标的值=] 模型。
代码如下(在jupyter notebook中,有些行不能直接从python运行,比如!rm -rf NNlogs/*
去掉之前的日志):
import tensorflow as tf
import numpy as np
import os
root_logdir = os.path.join(os.curdir , "NNlogs")
def get_run_logdir():
import time
run_id = time.strftime("%Y_%m_%d-%H_%M_%S")
return os.path.join(root_logdir , run_id)
def create_models():
names = ['Dense5', 'Dense6', 'Dense7', 'Dense8']
MODELS_ARCH = [
[
tf.keras.layers.Dense(5, activation='tanh')
],
[
tf.keras.layers.Dense(6, activation='tanh')
],
[
tf.keras.layers.Dense(7, activation='tanh')
],
[
tf.keras.layers.Dense(8, activation='tanh')
]
]
models = []
for el in MODELS_ARCH:
models.append(tf.keras.Sequential(el))
models[-1]._name = names[len(models)-1]
return models
x_train = np.array([[1., 2.,4., 5., 6.,],[1., 4.,0.5, 7., 9.,], [1., 2.6, 1., 5.6, 6.,]])
y_train = np.array([[ 5.5],[6.], [7.]])
x_val = np.array([[1.7, 5.2, 7.6, 5.2, 6.5,],[2.8, 4.2, 0.8, 7.3, 9.4,], [1.8, 8.4, 6.6, 6.6, 9.,]])
y_val = np.array([[ 5.5],[6.8], [7.1]])
x_test = np.array([[5.2, 7.7, 9.5, 10.8, 4.4,],[2.3, 16., 5.7, 8.8, 9.7,], [1.8, 8.4, 7.3, 6.4, 9.,]])
y_test = np.array([[ 5.5],[6.6], [8.1]])
!rm -rf NNlogs/*
lr = 1e-2
models = create_models()
EPOCHS = 10
class OnTrainEndCallback(tf.keras.callbacks.Callback):
def __init__(self, epochs):
super(OnTrainEndCallback, self).__init__()
self.epochs = epochs
def on_train_end(self, logs=None):
res = self.model.evaluate(x=x_test, y=y_test, batch_size=1)
tf.summary.scalar('Model evalutated on test', data=res, step=self.epochs)
#return res
on_train_end_cb = OnTrainEndCallback(EPOCHS)
optimizer = tf.keras.optimizers.Adagrad(lr=1e-2)
histories = []
tests = []
for m in models:
run_logdir = get_run_logdir() + "_" + m._name
file_writer = tf.summary.create_file_writer(run_logdir + "/metrics")
file_writer.set_as_default()
tensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir, update_freq='epoch') #batch or epoch
m.compile(loss='mse', optimizer=optimizer)
history = m.fit(x=x_train, y=y_train, epochs=EPOCHS,
validation_data=(x_val, y_val),
callbacks=[tensorboard_cb, on_train_end_cb], batch_size=32)
histories.append(history)
tests.append(m.evaluate(x=x_test, y=y_test, batch_size=1))
如果我这样做:
for m in models:
print(m.name, m.evaluate(x=x_test, y=y_test, batch_size=1, verbose=0))
打印所有模型的评估结果:
Dense2 43.158206939697266
Dense3 44.55398941040039
Dense4 43.6148681640625
Dense5 48.75056457519531
但是当我使用
启动 tensorboard 时
%load_ext tensorboard
%tensorboard --logdir NNlogs --host localhost
并为左侧菜单中的所有型号选择 metrics
',它不显示 Dense8
型号之一,而显示其他型号。从这张图片中可以看出问题,您可以在左下角看到已选择模型的指标,但上图未显示该模型的值(相信它不是缩放)。
此外,我检查了这个模型的文件夹 NNlogs
,我可以看到对于其他模型有一个扩展名为 *.v2
的文件,所以我认为该指标是正确安全的。
继之后,只有当缓冲区已满tf.summary.create_file_writer
才会写入磁盘。显然,当写入多个模型评估时,缓冲区会被填满。所以在第四次评估时,它写入磁盘第三个,缓冲区包含第四个,但没有满,这没有写入磁盘。要强制刷新缓冲区并将内容写入磁盘,在 for
循环之后(在循环之外)调用 file_writer.close()
就足够了。
我正在 python-tensorflow 上训练一系列模型并在 Tensorboard 上显示结果。这最初是在 jupyter notebook 上完成的,但显然 Colab 上也存在这个问题。
除了验证结果,我还想在 Tensorboard 上显示测试集的评估结果,为此我通过重写 on_train_end
方法创建了自定义回调,该方法调用 res = self.model.evalute(x=x_test, y=y_test, batch_size=1)
然后 tf.summary.scalar
将评估结果存储为标量。结束所有训练后,我启动 tensorboard。问题是 tensorboard 没有显示最后一个模型的指标:给定 n
个模型(其架构在 MODELS_ARCH
中定义,tensorboard 只显示第一个 [=19] 的自定义指标的值=] 模型。
代码如下(在jupyter notebook中,有些行不能直接从python运行,比如!rm -rf NNlogs/*
去掉之前的日志):
import tensorflow as tf
import numpy as np
import os
root_logdir = os.path.join(os.curdir , "NNlogs")
def get_run_logdir():
import time
run_id = time.strftime("%Y_%m_%d-%H_%M_%S")
return os.path.join(root_logdir , run_id)
def create_models():
names = ['Dense5', 'Dense6', 'Dense7', 'Dense8']
MODELS_ARCH = [
[
tf.keras.layers.Dense(5, activation='tanh')
],
[
tf.keras.layers.Dense(6, activation='tanh')
],
[
tf.keras.layers.Dense(7, activation='tanh')
],
[
tf.keras.layers.Dense(8, activation='tanh')
]
]
models = []
for el in MODELS_ARCH:
models.append(tf.keras.Sequential(el))
models[-1]._name = names[len(models)-1]
return models
x_train = np.array([[1., 2.,4., 5., 6.,],[1., 4.,0.5, 7., 9.,], [1., 2.6, 1., 5.6, 6.,]])
y_train = np.array([[ 5.5],[6.], [7.]])
x_val = np.array([[1.7, 5.2, 7.6, 5.2, 6.5,],[2.8, 4.2, 0.8, 7.3, 9.4,], [1.8, 8.4, 6.6, 6.6, 9.,]])
y_val = np.array([[ 5.5],[6.8], [7.1]])
x_test = np.array([[5.2, 7.7, 9.5, 10.8, 4.4,],[2.3, 16., 5.7, 8.8, 9.7,], [1.8, 8.4, 7.3, 6.4, 9.,]])
y_test = np.array([[ 5.5],[6.6], [8.1]])
!rm -rf NNlogs/*
lr = 1e-2
models = create_models()
EPOCHS = 10
class OnTrainEndCallback(tf.keras.callbacks.Callback):
def __init__(self, epochs):
super(OnTrainEndCallback, self).__init__()
self.epochs = epochs
def on_train_end(self, logs=None):
res = self.model.evaluate(x=x_test, y=y_test, batch_size=1)
tf.summary.scalar('Model evalutated on test', data=res, step=self.epochs)
#return res
on_train_end_cb = OnTrainEndCallback(EPOCHS)
optimizer = tf.keras.optimizers.Adagrad(lr=1e-2)
histories = []
tests = []
for m in models:
run_logdir = get_run_logdir() + "_" + m._name
file_writer = tf.summary.create_file_writer(run_logdir + "/metrics")
file_writer.set_as_default()
tensorboard_cb = tf.keras.callbacks.TensorBoard(run_logdir, update_freq='epoch') #batch or epoch
m.compile(loss='mse', optimizer=optimizer)
history = m.fit(x=x_train, y=y_train, epochs=EPOCHS,
validation_data=(x_val, y_val),
callbacks=[tensorboard_cb, on_train_end_cb], batch_size=32)
histories.append(history)
tests.append(m.evaluate(x=x_test, y=y_test, batch_size=1))
如果我这样做:
for m in models:
print(m.name, m.evaluate(x=x_test, y=y_test, batch_size=1, verbose=0))
打印所有模型的评估结果:
Dense2 43.158206939697266
Dense3 44.55398941040039
Dense4 43.6148681640625
Dense5 48.75056457519531
但是当我使用
启动 tensorboard 时%load_ext tensorboard
%tensorboard --logdir NNlogs --host localhost
并为左侧菜单中的所有型号选择 metrics
',它不显示 Dense8
型号之一,而显示其他型号。从这张图片中可以看出问题,您可以在左下角看到已选择模型的指标,但上图未显示该模型的值(相信它不是缩放)。
此外,我检查了这个模型的文件夹 NNlogs
,我可以看到对于其他模型有一个扩展名为 *.v2
的文件,所以我认为该指标是正确安全的。
继tf.summary.create_file_writer
才会写入磁盘。显然,当写入多个模型评估时,缓冲区会被填满。所以在第四次评估时,它写入磁盘第三个,缓冲区包含第四个,但没有满,这没有写入磁盘。要强制刷新缓冲区并将内容写入磁盘,在 for
循环之后(在循环之外)调用 file_writer.close()
就足够了。