【问题标题】:Tensorflow 2.0 does not iterate through entire dataset when tf.keras.model.fit is called调用 tf.keras.model.fit 时,Tensorflow 2.0 不会遍历整个数据集
【发布时间】:2019-11-12 20:54:09
【问题描述】:

我正在使用 tensorflow 2.0 在 tf.keras 中训练模型。 我遇到了一个问题,我的模型似乎训练成功,但它没有遍历整个数据集。我将代码重组为 tensorflow 1.15,我在 tensorflow 1.x 中没有这个问题.我正在关注this tutorial 的多输入系列。以下是更多详细信息:

我有一个时间序列数据集。它非常小,所以我可以将它加载到内存中,所以我不需要数据集 API。我将时间序列窗口化以生成两个数组 X 和 Y,例如,

X=[
   [[1,2,3],[4,5,6],   [7,8,9]],
   [[4,5,6],[7,8,9],   [10,11,12]],
   [[7,8,9],[10,11,12],[13,14,15]],
   ...
  ] 
Y = [
     [4],
     [7],
     [10],
     ...
    ]

(是的,我意识到我可以很容易地只包含一个功能并制作X=[[[1,2,3]], [[4,5,6]], [[7,8,9]], ...],但我将包含许多在管道工作时无法完美同步的功能。此外,即使当我只包括第一个功能,我仍然看到我描述的问题。)

然后,我建立我的模型:

model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_steps, n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

然后我训练它:

model.fit([X],[Y],num_epochs=300,validation_split=0.2)

它正确地报告了训练和验证样本的数量,然后弹出进度条......但这就是成功停止的地方。对于每个 epoch,val_loss 和 val_mean_squared_error 始终为 0,而且它似乎永远不会训练超过我数据集中窗口的一小部分(~1/1000)。这是打印出来的:

Epoch X/300   192/162636 [..............................] - ETA: 45:42 - loss: 0.4783 - mean_squared_error: 0.4783 - val_loss: 0.0000e+00 - val_mean_squared_error: 0.0000e+00

当我在 tf 1.15 中执行相同的代码时,它会按我的预期执行 - 时期大约需要 45 分钟(在 tf 2.0 中它们需要

没有报告错误、警告或信息,它只是提前停止迭代我的数据集。 是否有人对 tensorflow 2.0 中 tf.keras.Model.fit 中可能导致此问题的变化有任何见解?还是我走的路有什么错误?任何见解都将不胜感激。谢谢!

编辑 11/25:

我已经为此错误here 提交了一个 GitHub 问题。请查看该帖子以获取有关进度的更新,当问题解决后,我会尽量记住更新此帖子。

【问题讨论】:

  • 您能在 v1.15 代码中导入 tensorflow 后立即致电tf.compat.v1.enable_v2_behavior() 吗?那么在训练中会发生什么?这似乎是一个错误,而不是你的错误......也许在 TF 的 GitHub 上打开一个问题也可能得到回报
  • 我打电话给tf.compat.v1.enable_v2_behavior(),这绝对是一个 tensorflow 错误。在提交错误报告之前,我一直在寻找这样的功能来检查,所以非常感谢!如果您提交答案,我会接受,以便您获得赏金:)
  • 很高兴听到它有帮助!我详细说明了答案,尤其是在 Keras vs tf.keras 部分。也许您也可以尝试一下;)作为旁注,如果您确实在 Github 上提出了问题,那么在问题中也有一个指向它的链接会很棒,您可以添加它吗? :) 祝你好运!
  • 完成!我会尽量记住在可用时发布更新

标签: tensorflow tensorflow2.0 tf.keras


【解决方案1】:

你描述的行为很可疑,听起来很像 TF 的错误。 您可以尝试的一种可能方法是在导入 tensorflow 后立即调用 tf.compat.v1.enable_v2_behavior() 在 TF 1.15 中启用 TF2 的行为。这做了很多内部变化(老实说,我自己不知道它做了什么究竟,文档只说“它切换了 TensorFlow 1.x 和 2.x 之间不同的所有全局行为2.x."),这可以帮助您确定错误的来源是在 Tensorflow 的实现中还是在您的代码中。

我要做的另一个可能的检查是确保您在任何地方都使用tf.keras(即,Tensorflow 的 Keras API 实现),而不是“独立”Keras(您将通过 @987654323 安装的那个) @)。第一个被大量定制以与 TF 兼容,也许第二个还不能完全容忍 TF1 和 TF2 之间的巨大变化,尽管这纯粹是猜测。

【讨论】:

  • 绝对是您描述的第一个错误,“独立” keras 未安装在此环境中。再次感谢!
【解决方案2】:

实际上,这是一个错误。当你更新 Keras 和 TensorFlow 时,就会出现这个问题。为了快速解决,在 google collab 上,首先,您应该使用以下命令卸载 TensorFlow:

    pip uninstall tensorflow

然后它说内核需要重新启动,执行它。 那么你也应该卸载 Keras:

    pip uninstall keras

现在你必须安装 tensorflow v 2.1.0:

    pip install tensorflow==2.1.0

然后安装 keras v 2.3.1:

    pip install keras==2.3.1

在旧版本中,例如,当您在 Keras 上训练 MNIST 数据集(包含 60,000 张训练图像)时,进度条左侧显示 x/60,000,并且在每一步中,它都会继续显示为数字批量大小:

Epoch 3/4
60000/60000 [==============================] - 98s 2ms/step - loss: 0.0084 - accuracy: 0.9973 - val_loss: 0.0066 - val_accuracy: 0.9977

但是,在较新的版本中,进度条左侧的数字实际上是图像总数除以批量大小:

Epoch 3/4
200/200 [==============================] - 92s 461ms/step - loss: 0.2783 - accuracy: 0.3571 - val_loss: 0.2649 - val_accuracy: 0.4344

您必须注意到,这个问题不仅仅与训练中显示的样本数量有关,而是在某些架构上,新版本的整体性能显着下降。上面的例子是一个分类器,但是使用相同的代码,我得到完全不同的结果(在这个例子中是 epoch 3),你可以看到一切都不一样。不知道为什么这个bug会出现在较新的版本中,但我希望未来专家可以修复这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多