【发布时间】: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