一维卷积层是否支持可变序列长度?
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
层将无法拥有恒定数量的权重。这是不可能的。
因此,您应该开始使用 GlobalMaxPooling1D
或 GlobalAveragePooling1D
层,而不是 Flatten
。
我有一系列经过处理的音频文件,我正在使用 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
层将无法拥有恒定数量的权重。这是不可能的。
因此,您应该开始使用 GlobalMaxPooling1D
或 GlobalAveragePooling1D
层,而不是 Flatten
。