Tensorflow是否支持Keras模型fit()方法和急切执行?



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

自从我启用了快速执行以来,训练时间(相同数量的 epoch)从 20.1s 增加到 49.4s。此外,训练似乎不再收敛,因为损失保持在 9 左右(没有急切执行,它下降到 1),而方法fit()甚至不再报告请求的指标"准确性"。

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

此处是声明模型并进行训练的代码片段。将 TF 1.7 用于与 pip3 一起安装的 GPU。

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上提交了问题#18642。

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

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

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

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

这是来自Tensorflow网站的引述

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

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

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

考虑到您拥有的 DENSE 层数,这可能会使您的模型更难运行。有人可能会纠正我,因为我以前没有做过太多关于 DENSE 层的工作,或者我已经很久没有了。如果这不起作用,那么我会研究你的损失函数。如果这成为一个问题,这个答案可能会有所帮助。

不过其他一切看起来都很好。希望这有帮助。

编辑

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

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

因此,也许到目前为止,只有渐变磁带和估算器方法是您应该急切使用的。

在模型(文档)上读取compile方法时,您可以找到一个参数,run_eagerly

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

因此,默认情况下,tf.keras.Model 将默认为通过图形执行运行,而不是急切执行

最新更新