我正在尝试为时间序列数据构建和编码decoder模型,并在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
(?仅在编码器或两者中以最大化接受场?我应该用什么用作潜在表示?完全连接的层,较低的尺寸图像(如上所述(,合并或更少的过滤器?
这个答案是针对通过Google来这里的其他人:
扩张与大步:大步使响应较小。因此,您只使用一次。扩张通过在中间添加零来使内核更大。它将带来与大步相同的效果,但不会使响应较小。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)
如果您用diletation_rate替换自动编码器中的步幅,它将起作用。(conv2dtranspose也具有扩张_rate,但这无效:https://github.com/keras-team/keras/keras/issues/8159。围绕的工作是通过步幅(cododer(和upscaling2d(解码器(培训您的网络。加载这些权重。当您使用时,可以使用扩张的简单编码器。(
在这种情况下不需要汇总:可以帮助删除位置偏见。其他方法是翻译增加以获得相同的结果。取决于您的问题,您是否想要这个。
完全连接:完全过时。只需使用具有大小的卷积层即可连接所有内容。这是完全相同的,但可以具有更大的输入。
更少或更多的过滤器:我永远不知道。可视化过滤器和/或过滤器响应。如果您看到过滤器非常相似,则习惯了许多过滤器。或没有刺激足够的差异(辍学和数据启发可能会有所帮助(。