【问题标题】:Does Tensorflow support Keras models fit() method with eager execution?Tensorflow 是否支持 Keras 模型 fit() 方法与急切执行?
【发布时间】:2021-04-03 19:22:07
【问题描述】:

我正在训练一个 Keras 模型 (tf.keras.models.Sequential),调用它的方法 fit()

由于我启用了 Eager Execution,训练时间(对于相同数量的 epoch)从 20.1 秒增加到 49.4 秒。此外,训练似乎不再收敛,因为损失保持在 9 左右(没有急切执行,它下降到 1),而方法 fit() 甚至不再报告请求的指标“准确度”。

是否支持 Keras 模型的急切执行?请注意,我在模型上调用方法 fit(),而不是使用估算器。

这里是声明模型并进行训练的代码的 sn-p。使用 TF 1.7 for GPU 安装 pip3。

tf.enable_eager_execution()

model = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer(input_shape=(11,)) ,
    tf.keras.layers.Dense(64, activation='relu') ,
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(11, activation='softmax')
])

optimizer = tf.train.AdamOptimizer()
# optimizer = 'adam'
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(x=train_X, y=train_y, epochs=200, batch_size=64, verbose=2)

更新:在 Tensorflow GITHUB 上提交了 issue #18642。

【问题讨论】:

  • 是的,tf.keras 旨在与急切执行兼容。事实上"Getting Started with Eager Execution" 指南使用它。如果您发现图形和急切执行之间的行为不同,我建议您使用filing a bug
  • 不幸的是,您提到的示例使用tfe.GradientTape() 来适应数据集,它不会尝试调用tf.keras.models.Sequential.fit()。它们为急切执行和 Keras 提供了另一个示例,它再次不调用 fit() 而是使用估计器。我可以让tfe.GradientTape() 工作,但fit() 似乎没有收敛(损失没有下降),并且没有报告它应该报告的指标。我将改进我的问题的标题以澄清问题是在 Keras 模型上调用 fit() 方法。我还计划在 GITHUB 上打开一个问题,将更新我的问题。

标签: tensorflow keras


【解决方案1】:

我在tensorflow上报告的问题得到了这个答案:

感谢您的错误报告。我们有一个解决这个问题的方法,这将 很快就会出现在 GitHub 上。

请参阅 GITHUB for Tensorflow 上的问题 #18642

基于此,我了解到一旦修复了错误,Keras 模型的方法fit() 将支持急切执行。

【讨论】:

    【解决方案2】:

    这是来自 Tensorflow 网站的引用 here

    计算导数时有许多参数需要优化。当将 TensorFlow 代码结构化为可重用的类和对象而不是单个顶级函数时,TensorFlow 代码更易于阅读。急切执行鼓励在 tf.keras.layers 模块中使用 Keras 样式的层类。此外,tf.train.Optimizer 类提供了计算参数更新的复杂技术。

    这意味着 keras 层和后续模型允许使用 Eager 执行。 至于您的时间安排,该链接还提到了如何使用 Eager 停止构建图表。

    TensorFlow 的即时执行是一种命令式编程环境,可立即评估操作,无需额外的图形构建步骤。操作返回具体值,而不是构建计算图以供以后运行。

    鉴于您拥有的 DENSE 层数,这可能会使您的模型更难运行。有人可能会纠正我,因为我之前没有对 DENSE 图层做过很多工作,或者我已经很久没有做过了。如果这不起作用,那么我会调查你的损失函数。 This answer may help if that becomes a problem.

    其他一切看起来都还不错。希望这会有所帮助。

    编辑

    好吧,我明白你在说什么命运。是的,第一个链接使用了顺序模型,但是渐变带从渐变不错。深入阅读急切的教程表明他们也只使用渐变胶带。以下是教程中关于培训的内容:

    自动微分对于实现机器学习算法非常有用,例如用于训练神经网络的反向传播。在急切执行期间,使用 tfe.GradientTape 来跟踪用于稍后计算梯度的操作。tfe.GradientTape 是一项可选功能,可在不跟踪时提供最大性能。由于每次通话期间可能会发生不同的操作,因此所有前向传递操作都会记录到“磁带”中。要计算梯度,请向后播放磁带,然后丢弃。特定的 tfe.GradientTape 只能计算一次,后续调用会引发运行时错误。

    所以也许目前只有渐变磁带和估算器方法是您应该使用的 Eager。

    【讨论】:

    【解决方案3】:

    在读取Model(documentation)上的compile方法时,可以找到一个参数,run_eagerly

    run_eagerly: 布尔值。默认为假。如果为 True,则此模型的逻辑将不会包装在 tf.function 中。除非您的模型不能在 tf.function 中运行,否则建议将其保留为 None。

    所以默认情况下,tf.keras.Model 将默认通过图形执行运行,而不是急切执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2019-08-29
      • 2021-06-20
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多