代码之家  ›  专栏  ›  技术社区  ›  Márton György

在时间数据的自动编码器中,在哪里使用扩展卷积?

  •  2
  • Márton György  · 技术社区  · 7 年前

    我正在尝试在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)
    

    我的问题是:

    1. 何处使用扩张( dilation_rate=2 )? 为了最大化感受野,是只在编码器中还是在两者中?

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tom Nijhof    6 年前

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

    扩张VS步幅:步幅使反应变小。所以你只使用一次。膨胀通过在两者之间添加零使内核变大。它将产生与跨步相同的效果,但不会使响应变小。 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)
    

    如果将自动编码器中的步幅替换为像这样的dibulation\u速率,它将起作用。(Conv2dTranspose也有Distribution\u rate,但不起作用: https://github.com/keras-team/keras/issues/8159 . 解决方法是使用跨步(编码器)和放大2D(解码器)来训练您的网络。将这些权重加载到一个更简单的编码器中,并在使用时进行扩容。)

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

    完全连接:完全过时。只需使用大小相同的卷积层即可连接所有内容。这是完全相同的,但将有可能有更大的投入。

    更少或更多的过滤器:我永远不知道。可视化过滤器和/或过滤器响应。如果你看到的过滤器非常相似,你习惯了很多过滤器。或者没有足够的刺激差异(辍学和数据扩充可能会有所帮助)。