在自动编码器中的哪里使用扩张卷积来处理时间数据?

Where to use dilated convolution in autoencoder for temporal data?

我正在尝试在 Keras 中使用一维卷积为时间序列数据构建编码器-解码器模型。考虑这个简单的模型:

inputs = Input(shape = (timesteps, input_dim))
t = Conv1D(16, kernel_size=3, padding='same')(inputs)
encoded = Conv1D(16, kernel_size=2, strides=2)(t)

t = UpSampling1D(2)(encoded)
t = Conv1D(16, kernel_size=3, padding='same')(inputs)
decoded = Conv1D(1, kernel_size=3, padding='same')(t)

model = Model(inputs, decoded)

我的问题是:

  1. 哪里用dilation(dilation_rate=2)?仅在编码器中还是在两者中以最大化感受野?

  2. 我应该使用什么作为潜在表示?全连接层、低维图像(如上)、池化或更少的过滤器?

此答案适用于通过 google 来到这里的其他人:

Dilation VS stride:Stride 使响应更小。所以你只使用一次。扩张通过在两者之间添加零来使内核变大。它会产生与步幅相同的效果,但不会使响应变小。 Keras/tf.keras 示例:

x = input_img

x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), strides=2, padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), strides=2, padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)

encoded = Conv2D(num_featers, (2, 2), padding='valid')(x)

等同于:

x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=2, padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=2, padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=4, padding='valid')(x)

encoded = Conv2D(num_featers, (2, 2), dilation_rate=4, padding='valid')(x)

如果你像这样用 dilation_rate 替换自动编码器中的步幅,它将起作用。 (Conv2dTranspose 也有 dilation_rate,但这不起作用:https://github.com/keras-team/keras/issues/8159。解决方法是用 strides(编码器)和 upscaling2d(解码器)训练你的网络。将这些权重加载到一个更简单的编码器中,当你已经用过了。)

关于池化:在这种情况下不需要池化,但它可以帮助消除位置偏差。另一种方法是翻译增强以获得相同的结果。取决于你的问题,你是否想要这个。

完全连接:完全不合时宜。只需使用具有大小的卷积层即可连接所有内容。这完全相同,但可以有更大的输入。

更少或更多过滤器:我不知道。可视化您的过滤器 and/or 过滤器响应。如果您看到非常相似的过滤器,那么您使用了很多过滤器。或者没有足够地刺激种类差异(辍学和数据增强可以帮助解决这个问题)。