一维卷积层是否支持可变序列长度?

Does 1D Convolutional layer support variable sequence lengths?

我有一系列经过处理的音频文件,我正在使用 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 通过在定义模型时在相应维度中使用 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