调用 tf.keras.model.fit 时,Tensorflow 2.0 不会遍历整个数据集
Tensorflow 2.0 does not iterate through entire dataset when tf.keras.model.fit is called
我正在使用 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)
它正确地报告了训练和验证样本的数量,然后弹出了进度条……但到此为止,成功就停止了。对于每个时期,val_loss 和 val_mean_squared_error 始终为 0,而且在我的数据集中,它的训练似乎永远不会超过 windows 的一小部分 (~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 中它们需要 < 3 秒),并且 tf 1.15 报告合法的 val_loss 和val_mean_squared_error。我无法弄清楚为什么模型不能在 tf 2.0 中正确训练。这是我第一次在 tf 2.0 中编写代码/没有从 tf 1.13 迁移,但是我从 tf 1.13 升级到 tf 2.0 的所有遗留代码执行时没有任何错误。 None 我迁移的遗留代码有顺序模型。
没有报告任何错误、警告或信息,它只是提前停止遍历我的数据集。 有没有人对 tensorflow 2.0 中 tf.keras.Model.fit 中可能导致此问题的变化有任何见解?还是我走的路有什么错误?任何见解将不胜感激。 谢谢!
编辑 11/25:
我已针对此错误 here 提交了一个 GitHub 问题。请查看 post 以了解进度更新,我会尽量记得在问题解决后更新此 post。
您描述的行为很可疑,听起来很像是 TF 方面的错误。
您可以尝试的一种方法是在导入 tensorflow 后立即调用 tf.compat.v1.enable_v2_behavior()
以在 TF 1.15 中启用 TF2 的行为。这做了很多内部更改(老实说,我自己不知道 究竟是什么 它做了什么,文档只说 "It switches all global behaviors that are different between TensorFlow 1.x and 2.x to behave as intended for 2.x."),这可能会帮助您弄清楚是否错误的根源在 Tensorflow 的实现中或在您的代码中。
我要做的另一个可能的检查是确保你在任何地方都使用 tf.keras
(即 Tensorflow 对 Keras API 的实现),而不是 "standalone" Keras (您将通过 pip install keras
安装的那个)。第一个是为与 TF 兼容而量身定制的,也许第二个还不能完全容忍 TF1 和 TF2 之间的重大变化,尽管这纯粹是猜测。
实际上,这是一个错误。当你更新 Keras 和 TensorFlow 时,就会出现这个问题。为了快速解决,在 google 协作中,首先,您应该使用以下方法卸载 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,希望以后有高手能解决。
我正在使用 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)
它正确地报告了训练和验证样本的数量,然后弹出了进度条……但到此为止,成功就停止了。对于每个时期,val_loss 和 val_mean_squared_error 始终为 0,而且在我的数据集中,它的训练似乎永远不会超过 windows 的一小部分 (~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 中它们需要 < 3 秒),并且 tf 1.15 报告合法的 val_loss 和val_mean_squared_error。我无法弄清楚为什么模型不能在 tf 2.0 中正确训练。这是我第一次在 tf 2.0 中编写代码/没有从 tf 1.13 迁移,但是我从 tf 1.13 升级到 tf 2.0 的所有遗留代码执行时没有任何错误。 None 我迁移的遗留代码有顺序模型。
没有报告任何错误、警告或信息,它只是提前停止遍历我的数据集。 有没有人对 tensorflow 2.0 中 tf.keras.Model.fit 中可能导致此问题的变化有任何见解?还是我走的路有什么错误?任何见解将不胜感激。 谢谢!
编辑 11/25:
我已针对此错误 here 提交了一个 GitHub 问题。请查看 post 以了解进度更新,我会尽量记得在问题解决后更新此 post。
您描述的行为很可疑,听起来很像是 TF 方面的错误。
您可以尝试的一种方法是在导入 tensorflow 后立即调用 tf.compat.v1.enable_v2_behavior()
以在 TF 1.15 中启用 TF2 的行为。这做了很多内部更改(老实说,我自己不知道 究竟是什么 它做了什么,文档只说 "It switches all global behaviors that are different between TensorFlow 1.x and 2.x to behave as intended for 2.x."),这可能会帮助您弄清楚是否错误的根源在 Tensorflow 的实现中或在您的代码中。
我要做的另一个可能的检查是确保你在任何地方都使用 tf.keras
(即 Tensorflow 对 Keras API 的实现),而不是 "standalone" Keras (您将通过 pip install keras
安装的那个)。第一个是为与 TF 兼容而量身定制的,也许第二个还不能完全容忍 TF1 和 TF2 之间的重大变化,尽管这纯粹是猜测。
实际上,这是一个错误。当你更新 Keras 和 TensorFlow 时,就会出现这个问题。为了快速解决,在 google 协作中,首先,您应该使用以下方法卸载 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,希望以后有高手能解决。