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


10

细节:

GPU:GTX 1080

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

验证:约15万张属于10类的图像

每个纪元时间:〜10小时

我已经设置了CUDA,cuDNN和Tensorflow(以及Tensorflow GPU)。

我不认为我的模型这么复杂,每个纪元需要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
我投票将其移至堆栈溢出,但实际上它属于数据科学堆栈交换,IMO
–generic_user,

generic_user:“数据科学”可以使用“机器学习”,但并非所有“机器学习”都用于“数据科学”。(ML只是另一个工具,tensorflow只是另一个库; ML可能很快(如果尚未使用)甚至用于执行诸如管理用户首选项属性文件之类的普通任务。)
michael

另见相关(TL;博士:其实核实GPU上运行,看看GPU的统计信息TF可提供)stackoverflow.com/questions/42527492/... stackoverflow.com/questions/38559755/...
迈克尔

我尝试过这种方法,它指出正在使用当前的GPU。为了确认这一点,我还使用nvidia-smi检查了GPU的利用率,它的波动幅度在85%-99%之间。
Pradyumna Rahul,

Answers:


7

那是预期的。如果将秒数除以处理的图像数,则每个图像可获得33毫秒,这对于如此小的网络来说似乎是正确的。较大的网络通常每个图像占用50到200毫秒的时间。

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


您对提高性能有何建议?

4
1:将批处理大小增加到32或64。2:将FC层的大小缩小到1024或2048个单元,看看是否有帮助。3:提早停车。在您完成第一个时期之前,您的网络可能已经收敛或开始过度拟合,在这种情况下,您应该减少训练量。

我应该减少每个时期的步骤吗?
Pradyumna Rahul

@shimao“少训练”是什么意思?您是说使用更少的数据吗?
StatsSorceress

3

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

但是,您组成的网络中有一个有趣的信息瓶颈。您首先在原始尺寸的图像上使用64个滤镜,然后随着图像尺寸的减小而减小。当图像通过您的网络传递时,您正在学习的功能变得越来越抽象和复杂。Conv2D(32,(3,3))层实际上限制了网络学习32个要素的128x128映射。

大多数网络体系结构每次将特征合并时都会使特征数量加倍,并且最新的imagenet体系结构实际上放弃了完全连接的层,而倾向于使用最终特征图上的平均资源池,并基本上对该逻辑池的输出执行逻辑回归。

尝试从较少的过滤器开始,例如在第一个卷积层中使用16个过滤器,每次跨步或合并时加倍。这样做的次数比实际次数多,以增加接收范围并减小要素图的大小。将此操作降低到64x64或32x32,即128或256个滤镜。您也可以使用Keras的全局平均池或最大池来消除完全连接的层。那应该是网络速度的两倍,而且我希望同时提高准确性。


嗯,网络体系结构是基于我试图复制的研究论文。lirmm.fr/%7Echaumont/publications/...
Pradyumna拉胡尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.