我在玩tf.keras
,并且正在编写一些基本的自定义回调,例如更精确地指定了here的回调。
由回调方法on_epoch_end
给出的损失指标应该是所有微型批次的平均损失,但是我得到了最后的损失记录,即最后一个微型批次的损失。
如果您查看日志的用法]部分中的Tensorflow site,通过手工计算,您会看到示例中使用方法on_epoch_end
给出的损失是此时代的所有批次。
我尝试了没有自定义回调的情况,它没有任何改变。虽然BaseLogger callback的核心代码表示您应该在时期结束时获得平均损失,这不是我得到的,我仍然会得到最后一个小批量交易的损失。
这是我写的代码
# 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上。
你知道为什么我在时代末期没有平均亏损吗?我在哪里出错了?
我在玩tf.keras,正在写一些基本的自定义回调,例如这里给出的更精确。回调方法on_epoch_end给出的损耗度量应为平均值...
我认为您最终将获得平均损失。似乎有问题的是每批次的损失。代替返回当前批次的损失,在on_train_batch_end
中的回调将打印平均损失。这似乎是TF的问题:https://github.com/tensorflow/tensorflow/issues/39448