1D卷积层是否支持可变序列长度?

时间:2017-11-30 15:59:34

标签: keras keras-layer

我使用Keras将一系列经过处理的音频文件用作CNN的输入。 Keras 1D卷积层是否支持可变序列长度? Keras文档对此不清楚。

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

在文档的顶部,它提到您可以使用(无,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,无,100)的输入形状吗?我是否需要将这些张量连接到c

c.shape = (300, 100)

然后重塑它成为某种东西

c_reshape.shape = (3, 100, 100)

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

1 个答案:

答案 0 :(得分:5)

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

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

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

要使此模型接受变量长度,只需在步骤维度中使用None

input_shape=(None, input_dim)

现在,关于变量长度存在 numpy 限制。您无法创建具有适合可变长度的形状的numpy数组。

有两种解决方案可供选择:

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