在大型数据集上训练 CNN

数据挖掘 神经网络 深度学习 美国有线电视新闻网 卷积 辍学
2022-03-08 09:40:08

我目前正在尝试为大约 100,000 张图像构建一个 CNN。有42个班。我使用了 32 的默认批量大小。这是我的模型的样子:

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (3, 3), activation = 'relu', input_shape = training_data.image_shape))
model.add(MaxPool2D(pool_size = (2, 2)))
model.add(Dropout(rate = 0.3))

model.add(Conv2D(filters = 64, kernel_size = (3, 3), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2, 2)))
model.add(Dropout(rate = 0.2))

model.add(Conv2D(filters = 126, kernel_size = (3, 3), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2, 2)))
model.add(Dropout(rate = 0.15))

model.add(Flatten())

model.add(Dense(units = 32, activation = 'relu'))
model.add(Dropout(rate = 0.15))

model.add(Dense(units = 64, activation = 'relu'))
model.add(Dropout(rate = 0.1))

model.add(Dense(units = 42, activation = 'softmax'))
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

但是,训练时间非常长,每个 epoch 大约需要运行 35 分钟。准确度也非常低,并且增加非常缓慢。

我的 jupyter 实验室有时会停止并不得不再次刷新所有内容。那么有没有办法小批量训练呢?还是提高训练速度的方法?任何帮助表示赞赏。这是一个非常庞大的数据集。

Epoch 1/15
2307/2307 [==============================] - 3999s 2s/step - loss: 3.5377 - accuracy: 0.0687 - val_loss: 3.3247 - val_accuracy: 0.1223
Epoch 2/15
2307/2307 [==============================] - 3764s 2s/step - loss: 3.2884 - accuracy: 0.1239 - val_loss: 3.1065 - val_accuracy: 0.1739
Epoch 3/15
2307/2307 [==============================] - 2204s 955ms/step - loss: 3.1435 - accuracy: 0.1562 - val_loss: 2.9825 - val_accuracy: 0.2069
Epoch 4/15
2307/2307 [==============================] - 2193s 951ms/step - loss: 3.0526 - accuracy: 0.1778 - val_loss: 2.9059 - val_accuracy: 0.2171
2个回答

更改批量大小不会过多地改变整体训练时间。因为对于任何批量大小,您都传递了近 80K 图像。

一种(也是最好的)方法是使用迁移学习

如果您有充分的理由进行全面培训,您将需要 GPU 驱动的更大硬件。谷歌 Colab 可以作为一个选项。还有许多其他选项可用

在此之前,您可以尝试使用大约 5k 图像的样本来衡量模型

当您使用 keras fit 时,将 x 的值作为生成器函数传递,该生成器函数将提供(可能使用 yield)一批数据 (x, y) 元组。同样在生成器函数中,您可以使用检查点。

https://www.tensorflow.org/api_docs/python/tf/keras/Model#fit