从你的描述和代码来看,问题可能出在on_epoch_end()
函数被多次调用。为了解决这个问题,你可以尝试使用tf.keras.callbacks.Callback
类来自定义一个回调函数,确保on_epoch_end()
只被调用一次。以下是一个示例:
import tensorflow as tf
class CustomCallback(tf.keras.callbacks.Callback):
def __init__(self):
super(CustomCallback, self).__init__()
self.epoch_counter = 0
def on_epoch_end(self, epoch, logs=None):
if self.epoch_counter == 0:
# 在这里更新你的参数
print("更新参数")
self.epoch_counter += 1
else:
pass
# 在模型训练时添加自定义回调
model.fit(train_data, epochs=10, callbacks=[CustomCallback()])
这个示例中,我们创建了一个名为CustomCallback
的自定义回调类,它继承自tf.keras.callbacks.Callback
。在on_epoch_end()
方法中,我们检查self.epoch_counter
是否为0,如果是,则执行更新参数的操作,并将self.epoch_counter
加1。这样可以确保on_epoch_end()
只在每个epoch开始时被调用一次。
7条答案
按热度按时间t1rydlwq1#
请提供完整的缩进代码以及依赖项,或者如果可能的话,与错误报告一起分享一个colab gist。
w9apscun2#
@Saduf2019
这个谷歌Colab有一个简单的生成器,可以生成随机样本和一个非常简单的卷积模型。它显示了on_epoch_end()函数被多次调用,就像我上面的例子一样。谷歌Colab文件运行的是Tensorflow 2.4.0,但它产生的行为与我上面的例子相同(在2.3.0版本中也是如此)。我希望这个谷歌Colab文件是你心目中的那个。
laik7k3q3#
请运行我分享的夜间代码,找到gist here,如果确认了您的问题,请告知我们。
lo8azlld4#
它调用了两次on_epoch_end()函数。然而,在Tensorflow 2.3.0和2.4.0版本中,验证生成器有时只调用该函数两次,而不是像在这个版本中那样总是调用两次。这种不可预测性是我最大的问题,因为无法使用计数器来解决。你分享的代码中似乎没有显示验证生成器的不可预测性。希望这有意义。
wztqucjr5#
在TensorFlow的2.6版本的夜间版本中仍然存在这个问题。请查看gist here 。谢谢!
eanckbw96#
拥有完全相同的问题。设置
workers=1
似乎会抑制这种行为。@jvishnuvardhan 有任何更新吗?谢谢!
cbeh67ev7#
你好,
感谢你打开这个问题。由于这个问题已经开放了很长时间,这个问题的代码/调试信息可能与当前代码库的状态不相关。
Tensorflow团队正在不断通过修复错误和添加新功能来改进框架。我们建议你尝试使用最新的TensorFlow version 和最新的兼容硬件配置,这可能会解决该问题。如果你仍然遇到问题,请创建一个新的GitHub问题,附上你的最新发现以及所有有助于我们调查的调试信息。
请按照 release notes 了解Tensorflow空间中最新发展的动态。