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

JME*_*JME 5 keras keras-layer

我有一系列处理过的音频文件,正在使用Keras输入到CNN中。Keras 1D卷积层是否支持可变的序列长度?Keras文档使其不清楚。

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

它在文档的顶部提到您可以对128维向量的可变长度序列使用(None,128)。但在底部,它声明输入形状必须为

3D tensor with shape: (batch_size, steps, input_dim)
Run Code Online (Sandbox Code Playgroud)

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

可以说我有两个示例(a和b),它们包含要输入到1DConv层中作为输入的长度为100的X 1维向量

3D tensor with shape: (batch_size, steps, input_dim)
Run Code Online (Sandbox Code Playgroud)

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

a.shape = (100, 100)
b.shape = (200, 100)
Run Code Online (Sandbox Code Playgroud)

然后重塑它成为某种东西

c.shape = (300, 100)
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ler 5

None定义模型时,Keras通过在各个尺寸中使用来支持可变长度。

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

因此,具有形状的3D张量(batch_size, steps, input_dim)完全适合的模型input_shape=(steps, input_dim)

要使该模型接受可变长度,您所需要做的就是None在步骤维度中使用:

input_shape=(None, input_dim)
Run Code Online (Sandbox Code Playgroud)

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

有两种解决方案:

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