我正在尝试使用Keras中的1D卷积构建时间序列数据的编码器 - 解码器模型 . 考虑这个简单的模型:
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)
我的问题是:
-
在哪里使用扩张(
dilation_rate=2
)?仅在编码器中或两者中为了最大化感受野? -
我应该使用什么作为潜在表示?完全连接的层,低维图像(如上所述),汇集或更少的过滤器?
1 回答
这个答案适用于通过谷歌来到这里的其他人:
膨胀VS步幅:Stride使响应更小 . 所以你只使用一次 . 扩张通过在两者之间添加零来使内核更大 . 它将产生与步幅相同的效果,但不会使响应变小 . Keras / tf.keras示例:
是相同的:
如果用像这样的dilation_rate替换自动编码器中的步幅,它将起作用 . (Conv2dTranspose也有dilation_rate但不起作用:https://github.com/keras-team/keras/issues/8159 . 解决方法是使用步幅(编码器)和upscaling2d(解码器)训练您的网络 . 当您使用它时,将这些权重加载到更简单的编码器中进行扩张 . )
关于池:在这种情况下不需要池化,但它可以帮助消除位置偏差 . 其他方法是翻译扩充以获得相同的结果 . 根据你的问题你想要这个或不 .
完全连接:完全不合时宜 . 只需使用大小的卷积层来连接所有内容 . 这是完全相同的,但可以有更大的输入 .
更少或更多过滤器:我永远不会知道 . 可视化您的过滤器和/或过滤器响应 . 如果您看到非常相似的过滤器,您曾经使用过许多过滤器 . 或者没有足够的刺激差异(辍学和数据增加可能有助于它) .