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

Tensorflow是否支持Keras models fit()方法和急切执行?,tensorflow,keras,Tensorflow,Keras,我正在训练一个Keras模型(tf.Keras.models.Sequential),调用它的方法fit() 由于我启用了“渴望执行”,训练时间(对于相同的历次次数)从20.1秒增加到49.4秒。此外,训练似乎不再收敛,因为损失保持在9左右(如果不急于执行,则下降到1),而方法fit()甚至不再报告要求的度量“准确性” 对Keras模型是否有执行支持?请注意,我在模型上调用方法fit(),而不是使用估计器 这里是声明模型并进行培训的代码片段。对安装了pip3的GPU使用TF1.7 tf.enab

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

由于我启用了“渴望执行”,训练时间(对于相同的历次次数)从20.1秒增加到49.4秒。此外,训练似乎不再收敛,因为损失保持在9左右(如果不急于执行,则下降到1),而方法
fit()
甚至不再报告要求的度量“准确性”

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

这里是声明模型并进行培训的代码片段。对安装了pip3的GPU使用TF1.7

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网站的一段引用

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

这意味着keras层和后续模型可以使用渴望执行。 至于您的时间安排,该链接还提到了如何使用eager停止构建图形

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

考虑到密集层的数量,这可能会使模型更难运行。有人可能会在这方面纠正我,因为我以前没有对致密层做过很多工作,或者我已经很久没有做过了。如果这不起作用,那么我会研究你的损失函数

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

编辑

好吧,我明白你的意思了。是的,第一个链接使用顺序模型,但是梯度带从梯度下降。深入阅读本教程可以发现,他们也只使用渐变带。以下是本教程关于培训的内容:

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


因此,也许到目前为止,只有梯度带和估计器方法才是您应该使用的方法。

我在tensorflow上报告的问题得到了以下答案:

谢谢你的错误报告。我们已经解决了这个问题,这将 很快就会出现在GitHub上

有关Tensorflow,请参阅GITHUB上的问题


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

当阅读模型()上的
compile
方法时,您可以找到一个参数,
急切地运行

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


因此,默认情况下,tf.keras.Model将默认运行通过图形执行,而不是即时执行。

是的,
tf.keras
意味着与即时执行兼容。事实上,指南使用了它。如果您看到graph和急切执行之间的行为有所不同,我建议。不幸的是,您提到的示例使用
tfe.GradientTape()
来适应数据集,它不会尝试调用
tf.keras.models.Sequential.fit()
。它们为急切执行和Keras提供了另一个示例,Keras同样不调用
fit()
,而是使用估计器。我可以让
tfe.GradientTape()
工作,但是
fit()
似乎没有收敛(损失没有下降),也没有报告它应该报告的指标。我将改进问题的标题,以澄清在Keras模型上调用
fit()
方法的问题。我还计划在GITHUB上发布一个问题,将更新我的问题。Keras层
tf.Keras.layers
可以很好地执行,但是
tf.Keras.models.Sequential()
的方法
fit()
,就我所知,没有。事实上,我在TF GITHUB上发现的两个Keras+eager执行示例都没有调用
fit()
方法:一个使用梯度带,另一个使用估计器。见:还有