【问题标题】:Using dilated convolution in Keras在 Keras 中使用空洞卷积
【发布时间】:2020-11-14 07:56:24
【问题描述】:

WaveNet中,扩张卷积用于增加上面各层的感受野。

从图中,您可以看到核大小为 2 的扩张卷积层和 2 次幂的扩张率创建了一个树状的感受野结构。我试图(非常简单地)在 Keras 中复制上述内容。

import tensorflow.keras as keras
nn = input_layer = keras.layers.Input(shape=(200, 2))
nn = keras.layers.Conv1D(5, 5, padding='causal', dilation_rate=2)(nn)
nn = keras.layers.Conv1D(5, 5, padding='causal', dilation_rate=4)(nn)
nn = keras.layers.Dense(1)(nn)
model = keras.Model(input_layer, nn)
opt = keras.optimizers.Adam(lr=0.001)
model.compile(loss='mse', optimizer=opt)
model.summary()

还有输出:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_4 (InputLayer)         [(None, 200, 2)]          0
_________________________________________________________________
conv1d_5 (Conv1D)            (None, 200, 5)            55
_________________________________________________________________
conv1d_6 (Conv1D)            (None, 200, 5)            130
_________________________________________________________________
dense_2 (Dense)              (None, 200, 1)            6
=================================================================
Total params: 191
Trainable params: 191
Non-trainable params: 0
_________________________________________________________________

我期待axis=1 在每个conv1d 层之后缩小,类似于 gif。为什么不是这样?

【问题讨论】:

    标签: tensorflow keras conv-neural-network


    【解决方案1】:

    模型摘要符合预期。正如您所注意到的,使用扩张卷积会导致感受野增加。然而,扩张卷积实际上保留了我们输入图像/激活的输出形状,因为我们只是改变了卷积核。一个常规的核可能如下

    0 1 0
    1 1 1
    0 1 0
    

    膨胀率为 2 的内核将在原始内核的每个条目之间添加零,如下所示。

    0 0 1 0 0
    0 0 0 0 0
    1 0 1 0 1
    0 0 0 0 0
    0 0 1 0 0
    

    实际上,您可以看到我们的原始内核也是膨胀率为 1 的膨胀内核。增加感受野的其他方法会导致输入图像的尺寸缩小。最大池化和跨步卷积是两种替代方法。

    例如。如果你想通过减小输出形状的大小来增加感受野,你可以使用如下的跨步卷积。我用跨步卷积替换了空洞卷积。你会看到输出的形状每层都减少了。

    import tensorflow.keras as keras
    nn = input_layer = keras.layers.Input(shape=(200, 2))
    nn = keras.layers.Conv1D(5, 5, padding='causal', strides=2)(nn)
    nn = keras.layers.Conv1D(5, 5, padding='causal', strides=4)(nn)
    nn = keras.layers.Dense(1)(nn)
    model = keras.Model(input_layer, nn)
    opt = keras.optimizers.Adam(lr=0.001)
    model.compile(loss='mse', optimizer=opt)
    model.summary()
    
    Model: "model_1"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    input_2 (InputLayer)         [(None, 200, 2)]          0
    _________________________________________________________________
    conv1d_3 (Conv1D)            (None, 100, 5)            55
    _________________________________________________________________
    conv1d_4 (Conv1D)            (None, 25, 5)             130
    _________________________________________________________________
    dense_1 (Dense)              (None, 25, 1)             6
    =================================================================
    Total params: 191
    Trainable params: 191
    Non-trainable params: 0
    _________________________________________________________________
    
    

    总结扩张卷积只是增加模型感受野的另一种方法。它的好处是可以保留输入图像的输出形状。

    【讨论】:

    • 应该补充一下,扩张卷积通常与stride一起使用。扩张卷积改变了内核的感受野,而步幅改变了输出形状,因此下一层具有更大的感受野。当跨多个层使用时,单独的扩张并不会改变感受野。但不幸的是,Keras 不支持 stride 扩张的 conv。
    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多