【发布时间】:2020-05-15 20:31:02
【问题描述】:
我在玩tf.keras 并且正在编写一些基本的自定义回调,更准确地说是给定的here。
回调方法on_epoch_end给出的损失度量应该是所有小批量的平均损失,但我得到了最后一个损失记录,即最后一个小批量的损失。
如果您查看日志字典的使用部分中的Tensorflow site,通过手动计算,您会发现示例中使用on_epoch_end方法给出的损失是 这个时期所有批次的平均损失。
我尝试不使用自定义回调,它不会改变任何东西。虽然 BaseLogger callback的核心代码说你应该得到epoch end的平均loss,不是我得到的,我还是得到最后一个minibatch的loss。
这是我写的代码
# import libs
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import Dense
import random
print(tf.__version__)
print(keras.__version__)
RANDOM_SEED = 42
random.seed(RANDOM_SEED)
tf.random.set_seed(RANDOM_SEED)
#dummy dataset
t_x = tf.random.uniform([30, 4], dtype=tf.float32)
t_y = tf.range(30)
ds_x = tf.data.Dataset.from_tensor_slices(t_x)
ds_y = tf.data.Dataset.from_tensor_slices(t_y)
ds = tf.data.Dataset.zip((ds_x, ds_y))
ds = ds.batch(3)
# Custom callback
class LossCallback(tf.keras.callbacks.Callback):
def on_train_batch_end(self, batch, logs):
print(f'Batch {batch}, loss is {logs["loss"]:.2f}.\n')
def on_epoch_end(self, epoch, logs):
print(f'Avg loss on {epoch} is {logs["loss"]:.2f} \n')
cb = LossCallback()
# create dummy model
from tensorflow.keras import Model
input = Input(shape=(4,))
x = Dense(32)(input)
model = Model(input,x)
model.compile(loss = 'mean_absolute_error',
optimizer=tf.keras.optimizers.SGD())
history = model.fit(ds,
epochs=1,
verbose=0,
callbacks=[cb])
这是我得到的结果。
2.2.0
2.3.0-tf
Batch 0, loss is 1.03.
Batch 1, loss is 2.48.
Batch 2, loss is 3.95.
Batch 3, loss is 5.44.
Batch 4, loss is 6.93.
Batch 5, loss is 8.43.
Batch 6, loss is 9.93.
Batch 7, loss is 11.43.
Batch 8, loss is 12.93.
Batch 9, loss is 14.43.
Avg loss on 0 is 14.43
摆脱我的自定义回调并重新运行
history = model.fit(ds,
epochs=1)
没有让我到任何地方,因为我仍然有同样的损失。
我做这件事的时候在 Google Colab 上。
你知道为什么我在纪元结束时没有平均损失吗?我哪里做错了?
【问题讨论】:
标签: python-3.x keras callback tensorflow2.0