Tensorboard 未在 google colab 中按批次更新
Tensorboard not updating by batch in google colab
我在 google colab 中使用 tensorboard,如果我想跟踪时代,它工作正常。但是,我想按批次跟踪 accuracy/loss。我正在尝试使用文档 https://www.tensorflow.org/tensorboard/get_started 上的入门指南,但如果我将参数 update_freq
更改为 update_freq="batch"
,则它不起作用。我已经在我的本地电脑上试过了,它可以工作。知道发生了什么事吗?
使用 tensorboard 2.8.0 和 tensorflow 2.8.0
代码(运行 在 colab 中)
%load_ext tensorboard
import tensorflow as tf
import datetime
!rm -rf ./logs/
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
log_dir = "logs/fit_2/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, update_freq="batch")
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
我试过使用整数,但它也不起作用。在我的本地计算机上没有问题。
TensorFlow 2.3 之后的更改使 batch-level 摘要成为 Model.train_function
的一部分,而不是 TensorBoard 回调自行创建的内容。这导致 Model.fit
中许多小型模型的速度提高了 2 倍,但它确实有副作用,即在自定义训练循环中调用 TensorBoard.on_train_batch_end(my_batch, my_metrics)
将不再记录 batch-level 指标。
此问题已在 GitHub issue 中讨论过。
可以通过创建像 LambdaCallback 这样的自定义回调来解决。
我修改了代码的最后一部分,使用 tf.summary.scalar()
显式添加 batch_loss 和 batch_accuracy 的标量值,以显示在 tensorboard 日志中。
代码模块如下:
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
from keras.callbacks import LambdaCallback
def batchOutput(batch, logs):
tf.summary.scalar('batch_loss', data=logs['loss'], step=batch)
tf.summary.scalar('batch_accuracy', data=logs['accuracy'], step=batch)
return batch
batchLogCallback = LambdaCallback(on_batch_end=batchOutput)
log_dir = "logs/fit_2/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs', update_freq='batch')
model.fit(x=x_train,
y=y_train,
epochs=1,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback, batchLogCallback])
我在 Colab 中也试过了,效果很好。
我在 google colab 中使用 tensorboard,如果我想跟踪时代,它工作正常。但是,我想按批次跟踪 accuracy/loss。我正在尝试使用文档 https://www.tensorflow.org/tensorboard/get_started 上的入门指南,但如果我将参数 update_freq
更改为 update_freq="batch"
,则它不起作用。我已经在我的本地电脑上试过了,它可以工作。知道发生了什么事吗?
使用 tensorboard 2.8.0 和 tensorflow 2.8.0
代码(运行 在 colab 中)
%load_ext tensorboard
import tensorflow as tf
import datetime
!rm -rf ./logs/
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
log_dir = "logs/fit_2/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, update_freq="batch")
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
我试过使用整数,但它也不起作用。在我的本地计算机上没有问题。
TensorFlow 2.3 之后的更改使 batch-level 摘要成为 Model.train_function
的一部分,而不是 TensorBoard 回调自行创建的内容。这导致 Model.fit
中许多小型模型的速度提高了 2 倍,但它确实有副作用,即在自定义训练循环中调用 TensorBoard.on_train_batch_end(my_batch, my_metrics)
将不再记录 batch-level 指标。
此问题已在 GitHub issue 中讨论过。
可以通过创建像 LambdaCallback 这样的自定义回调来解决。
我修改了代码的最后一部分,使用 tf.summary.scalar()
显式添加 batch_loss 和 batch_accuracy 的标量值,以显示在 tensorboard 日志中。
代码模块如下:
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
from keras.callbacks import LambdaCallback
def batchOutput(batch, logs):
tf.summary.scalar('batch_loss', data=logs['loss'], step=batch)
tf.summary.scalar('batch_accuracy', data=logs['accuracy'], step=batch)
return batch
batchLogCallback = LambdaCallback(on_batch_end=batchOutput)
log_dir = "logs/fit_2/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs', update_freq='batch')
model.fit(x=x_train,
y=y_train,
epochs=1,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback, batchLogCallback])
我在 Colab 中也试过了,效果很好。