tensorflow 当workers > 0时,on_epoch_end()被多次调用,

3df52oht  于 4个月前  发布在  其他
关注(0)|答案(7)|浏览(111)

从你的描述和代码来看,问题可能出在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开始时被调用一次。

t1rydlwq

t1rydlwq1#

请提供完整的缩进代码以及依赖项,或者如果可能的话,与错误报告一起分享一个colab gist。

w9apscun

w9apscun2#

@Saduf2019
这个谷歌Colab有一个简单的生成器,可以生成随机样本和一个非常简单的卷积模型。它显示了on_epoch_end()函数被多次调用,就像我上面的例子一样。谷歌Colab文件运行的是Tensorflow 2.4.0,但它产生的行为与我上面的例子相同(在2.3.0版本中也是如此)。我希望这个谷歌Colab文件是你心目中的那个。

laik7k3q

laik7k3q3#

请运行我分享的夜间代码,找到gist here,如果确认了您的问题,请告知我们。

lo8azlld

lo8azlld4#

它调用了两次on_epoch_end()函数。然而,在Tensorflow 2.3.0和2.4.0版本中,验证生成器有时只调用该函数两次,而不是像在这个版本中那样总是调用两次。这种不可预测性是我最大的问题,因为无法使用计数器来解决。你分享的代码中似乎没有显示验证生成器的不可预测性。希望这有意义。

wztqucjr

wztqucjr5#

在TensorFlow的2.6版本的夜间版本中仍然存在这个问题。请查看gist here 。谢谢!

eanckbw9

eanckbw96#

拥有完全相同的问题。设置 workers=1 似乎会抑制这种行为。
@jvishnuvardhan 有任何更新吗?谢谢!

cbeh67ev

cbeh67ev7#

你好,
感谢你打开这个问题。由于这个问题已经开放了很长时间,这个问题的代码/调试信息可能与当前代码库的状态不相关。
Tensorflow团队正在不断通过修复错误和添加新功能来改进框架。我们建议你尝试使用最新的TensorFlow version 和最新的兼容硬件配置,这可能会解决该问题。如果你仍然遇到问题,请创建一个新的GitHub问题,附上你的最新发现以及所有有助于我们调查的调试信息。
请按照 release notes 了解Tensorflow空间中最新发展的动态。

相关问题