首页 文章

在自动编码器中何时使用扩张卷积来获取时间数据?

提问于
浏览
2

我正在尝试使用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 回答

  • 0

    这个答案适用于通过谷歌来到这里的其他人:

    膨胀VS步幅: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 . 解决方法是使用步幅(编码器)和upscaling2d(解码器)训练您的网络 . 当您使用它时,将这些权重加载到更简单的编码器中进行扩张 . )

    关于池:在这种情况下不需要池化,但它可以帮助消除位置偏差 . 其他方法是翻译扩充以获得相同的结果 . 根据你的问题你想要这个或不 .

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

    更少或更多过滤器:我永远不会知道 . 可视化您的过滤器和/或过滤器响应 . 如果您看到非常相似的过滤器,您曾经使用过许多过滤器 . 或者没有足够的刺激差异(辍学和数据增加可能有助于它) .

相关问题