为什么SeparableConv2D比Conv2D慢?

3

我一直在试验不同类型的卷积层以检查它们的计算速度。我的代码一开始是这样的。

def conv_block_A(layer):
    block = tf.keras.layers.Conv2D(filters=128, kernel_size=3, strides=1, padding='same')(layer)
    block = tf.keras.layers.Conv2D(filters=196, kernel_size=3, strides=1, padding='same')(block)
    block = tf.keras.layers.Conv2D(filters=128, kernel_size=3, strides=1, padding='same')(block)
    block = tf.keras.layers.BatchNormalization(momentum=0.8)(block)
    block = tf.keras.layers.LeakyReLU(alpha=0.2)(block)

    return block

在阅读了几篇博客后,我修改了我的代码如下:

def conv_block_A(layer):
    block = tf.keras.layers.SeparableConv2D(filters=128, kernel_size=3, strides=1, padding='same')(layer)
    block = tf.keras.layers.SeparableConv2D(filters=196, kernel_size=3, strides=1, padding='same')(block)
    block = tf.keras.layers.SeparableConv2D(filters=128, kernel_size=3, strides=1, padding='same')(block)
    block = tf.keras.layers.BatchNormalization(momentum=0.8)(block)
    block = tf.keras.layers.LeakyReLU(alpha=0.2)(block)

    return block

在CPU上,训练过程加快了两倍,但在Tesla T4上训练已经变得非常缓慢。可能的原因是什么?

1个回答

1
这是GPU的已知问题,已在#33836中修复。另外,您应该更新GPU驱动程序。 按照经验法则,通过进行可分离卷积来加速,在使用大内核大小时更加明显,因为执行两个卷积涉及的开销可能大于加速效果。

谢谢你的帮助。但是,这似乎不能解决我的问题。我正在使用 TensorFlow ==1.14.0 CUDA ==10.2 驱动程序版本 ==440.33.01 cudnn == 7.6.4 但仍然很慢,有时会出现内存不足的情况。 请问你能否帮我确定应该使用哪些版本? - explr_1298
1
使用cudnn == 7.6.4仍然没有速度上的改善。 - explr_1298
你尝试在Google Collab上运行你的代码了吗?看看问题是否仍然存在。 - cosine
1
是的,我在Google Colab中尝试运行它,并在Google Compute Engine中创建了一个带有一块V100 GPU的虚拟机。在这两种情况下,与conv2d相比,可分离卷积(separable conv2d)非常缓慢。 - explr_1298

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接