在 Keras 中使用扩张卷积

2023-12-22

In WaveNet https://deepmind.com/blog/article/wavenet-generative-model-raw-audio,扩张卷积用于增加上面各层的感受野。

从图中,您可以看到内核大小为 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。为什么情况并非如此?


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

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
_________________________________________________________________

总而言之,扩张卷积只是增加模型感受野的另一种方法。它的优点是保留输入图像的输出形状。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Keras 中使用扩张卷积 的相关文章

随机推荐