【问题标题】:Keras model.fit very, very slow compared to model.predict与 model.predict 相比,Keras model.fit 非常非常慢
【发布时间】:2021-02-13 03:09:21
【问题描述】:

我正在处理具有大量输入(10e8 个特征)的二进制图像分类任务。我在 Keras 中定义了一个带有 Tensorflow 后端的小型卷积网络,它原则上可以使用 model.predict 在一秒钟内对一批 500 个这样的图像进行分类。与此相比,训练模型非常慢。在单个图像上使用 model.fit 每个 epoch 大约需要 20 分钟。这种差距在意料之中吗?有什么简单的改进吗?

重现这一点的 Python 代码如下:

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Dropout,Dense

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=[4,150], activation='relu',input_shape=(257,44101,1)))      
model.add(MaxPooling2D(pool_size=(4, 500)))
model.add(Flatten)
model.add(Dropout(0.3))
model.add(Dense(50))
model.add(Dense(2, activation='softmax'))
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy())

ex_tensor=tf.ones([100,257,44101,1])
ex_labels=tf.ones([100,1])

model(ex_tensor) # Fast
model.fit(ex_tensor,ex_label,epochs=1,steps_per_epoch=1) # Very slow

【问题讨论】:

  • 我对你的语言有点困惑。 “10e8 个特征”你是说图像的输入大小是 10^9 像素,还是你正在做一些事情来首先生成“特征”?我认为您需要包含对“适合”的完整调用,也许还有一些虚拟的 numpy 数组来表示数据。
  • 上面添加的代码。
  • 这很有帮助!当您执行 model.fit 时,它会进行很多计算。尤其是在 第一个 epoch 上使用 adam 优化器。它必须进行前向传播,然后使用反向传播并计算导数。我预计它可能需要比仅仅进行一次健康呼叫要长 10 到 100 倍。您是否测量了两个呼叫,一个快速的呼叫和一个“非常慢”的呼叫?此外,您的 fit call 正在 100 张此类图片上进行。
  • 谢谢,由于内存限制,我一次加载 500 张图像,因此以 100 张为例,它的负担要小一些。 'model(ex_tensor)' 运行时间为 100 毫秒,但 'model.fit...' 行大约需要 1000 到 2000 秒,即使我将张量大小减小到第一个维度中也是如此。我预计您提到的这种差异大约是 100 倍,但在这里进行反向传播似乎需要超过 10,000 倍的时间。

标签: tensorflow keras classification


【解决方案1】:

是的,这是意料之中的。

使用神经网络进行预测是几个矩阵乘法的简单问题。另一方面,训练/拟合你的模型是一个更复杂的数学。您正在等待算法找出如何区分一张图片和另一张图片 - 这不是一件容易的事。

您永远不应该只训练一张图片。这只会导致模型记住那张图像。确保您在训练数据集上进行训练,并保留另一个(例如 20%)用于测试或验证模型的质量。

一些加快速度的方法:

  1. 通过缩小图像来减少特征数量。 1,000,000,000 个特征就是很多特征。
  2. 降低模型的复杂性或更改超参数。
  3. 如果这些不可接受,请使用功能更强大的计算机。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 1970-01-01
    • 2015-01-27
    • 2014-09-06
    • 1970-01-01
    • 2018-06-28
    • 2019-07-26
    • 2013-06-09
    • 2019-02-17
    相关资源
    最近更新 更多