【问题标题】:Does 1D Convolutional layer support variable sequence lengths?一维卷积层是否支持可变序列长度?
【发布时间】:2018-05-14 14:59:54
【问题描述】:

我有一系列处理过的音频文件,我使用 Keras 作为 CNN 的输入。 Keras 1D 卷积层是否支持可变序列长度? Keras 文档说明了这一点。

https://keras.io/layers/convolutional/

在文档的顶部,它提到您可以将 (None, 128) 用于 128 维向量的可变长度序列。然而在底部它声明输入形状必须是一个

3D tensor with shape: (batch_size, steps, input_dim)

给定以下示例,我应该如何将可变长度的序列输入到网络中

假设我有两个示例(a 和 b),其中包含长度为 100 的 X 1 维向量,我想将它们作为输入输入 1DConv 层

a.shape = (100, 100)
b.shape = (200, 100)

我可以使用 (2, None, 100) 的输入形状吗?我是否需要将这些张量连接到 c where

c.shape = (300, 100)

然后将其重塑为某种东西

c_reshape.shape = (3, 100, 100)

其中 3 是批大小,100 是步数,第二个 100 是输入大小?关于输入向量的文档不是很清楚。

【问题讨论】:

    标签: keras keras-layer


    【解决方案1】:

    Keras 在定义模型时通过在相应维度中使用None 来支持可变长度。

    请注意,input_shape 通常指的是形状没有批量大小

    因此,形状为 (batch_size, steps, input_dim) 的 3D 张量非常适合带有 input_shape=(steps, input_dim) 的模型。

    让这个模型接受可变长度所需的只是在步骤维度中使用None

    input_shape=(None, input_dim)
    

    Numpy 限制

    现在,关于可变长度有一个 numpy 限制。您不能创建形状适合可变长度的 numpy 数组。

    有几种解决方案:

    • 用虚拟值填充您的序列,直到它们都达到相同的大小,这样您就可以将它们放入形状为(batch_size, length, input_dim) 的numpy 数组中。使用Masking 层来忽略虚拟值。
    • 使用形状为(1, length, input_dim) 的单独numpy 数组进行训练,每个数组都有自己的长度。
    • 按大小将图像分组到更小的数组中。

    小心不支持可变大小的图层

    在使用可变大小的卷积模型中,例如,您不能使用Flatten,如果可能的话,展平的结果将具有可变大小。并且以下Dense 层将无法拥有恒定数量的权重。这是不可能的。

    因此,您应该开始使用GlobalMaxPooling1DGlobalAveragePooling1D 层,而不是Flatten

    【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多