【问题标题】:Average metrics given by on_epoch_end seem wrong with tf.kerason_epoch_end 给出的平均指标似乎与 tf.keras 错误
【发布时间】: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


    【解决方案1】:

    我认为你最终得到了平均损失。似乎有问题的是每批的损失。 on_train_batch_end 中的回调不是返回当前批次的损失,而是打印平均损失。这似乎是 TF 的问题:https://github.com/tensorflow/tensorflow/issues/39448

    我做了一点测试,Tensorflow 2.0.0 似乎呈现了预期的行为。看看this colab,它将您的代码与 TF 2.0.0 一起使用。

    使用 TF 2.0.0,您的代码输出为:

    Batch 0, loss is 1.03.
    
          1/Unknown - 0s 438ms/step - loss: 1.0256
    Batch 1, loss is 3.93.
    
          2/Unknown - 0s 222ms/step - loss: 2.4791
    Batch 2, loss is 6.90.
    
          3/Unknown - 0s 149ms/step - loss: 3.9526
    Batch 3, loss is 9.90.
    
          4/Unknown - 0s 113ms/step - loss: 5.4391
    Batch 4, loss is 12.90.
    
          5/Unknown - 0s 91ms/step - loss: 6.9314 
    Batch 5, loss is 15.92.
    
          6/Unknown - 0s 77ms/step - loss: 8.4295
    Batch 6, loss is 18.91.
    
          7/Unknown - 0s 66ms/step - loss: 9.9273
    Batch 7, loss is 21.94.
    
          8/Unknown - 0s 58ms/step - loss: 11.4284
    Batch 8, loss is 24.93.
    
          9/Unknown - 0s 52ms/step - loss: 12.9280
    Batch 9, loss is 27.90.
    
         10/Unknown - 0s 47ms/step - loss: 14.4251
    Avg loss on 0 is 14.43 
    
    10/10 [==============================] - 0s 49ms/step - loss: 14.4251
    

    【讨论】:

    • 好的,on_train_batch_end 显示的是运行中的平均损失,它给出了时代结束时的平均损失,这不是很好。我想如果我想获得每小批量的损失,那么我必须制作一个自定义的 train_step,至少现在是这样。
    • 是的,如果降级到以前的 TF 不是一个选项,我认为这是现在要走的路:/
    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2017-09-21
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多