为什么在我的 GPU 上训练需要这么长时间?

数据挖掘 机器学习 Python 喀拉斯
2021-10-07 05:34:43

细节:

显卡:GTX 1080

训练:约 110 万张属于 10 个类别的图像

验证:约 15 万张图片属于 10 个类别

每个时代的时间:~10 小时

我已经设置了 CUDA、cuDNN 和 Tensorflow(还有 Tensorflow GPU)。

我认为我的模型并不复杂,每个 epoch 需要 10 个小时。我什至检查了我的 GPU 是否有问题,但不是。

训练时间是因为全连接层吗?

我的模型:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

因为有很多数据我使用了ImageDataGenerator。

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)
2个回答

这和预期的差不多。如果将秒数除以处理的图像数量,则每张图像需要 33 毫秒,这对于如此小的网络来说似乎是正确的。较大的网络通常每张图像需要 50 到 200 毫秒的时间。

是的,一个大的密集层可能会损害您的性能,因为这是一个巨大的矩阵(256 x 4096),并且每次运行网络时都会伴随着一个大的矩阵乘法。

正如 shimao 所说,这就是您所期望的。尽管没有很多层,但 512x512 的输入大小是一个需要卷积的大图像。较大的计算时间可能更多是由于在大图像上卷积了 64 个滤波器,而不是完全连接的层。

不过,您组建的网络中有一个有趣的信息瓶颈。您从原始大小的图像上的 64 个过滤器开始,只会随着图像大小的减小而减少。随着图像通过您的网络,您正在学习的特征变得越来越抽象和复杂。您的 Conv2D(32, (3, 3)) 层本质上将网络限制为学习 32 个特征的 128x128 映射。

大多数网络架构在每次池化时都会将特征数量翻倍,而最近的 imagenet 架构实际上放弃了全连接层,转而使用最终特征图上的平均池,并且基本上对该池的输出执行逻辑回归。

尝试从更少的过滤器开始,比如在你的第一个卷积层中使用 16 个,每次跨步或池化时加倍。比你多做几次,以增加感受野并减小特征图大小。将其缩小到 64x64 或 32x32,即 128 或 256 个过滤器。您也可以使用 Keras 的 Global Avg 或 Max pooling 来消除完全连接的层。这应该是网络速度的两倍左右,我希望同时提高准确性。