Keras序列模型的可变输入形状

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras序列模型的可变输入形状相关的知识,希望对你有一定的参考价值。

我有一个Sequential模型定义如下:

model = Sequential([
    BatchNormalization(axis=1,input_shape=(2,4)),
    Flatten(),
    Dense(256, activation='relu'),       
    BatchNormalization(),
    Dropout(0.1),
    Dense(2, activation='softmax')
])

我想改变这个模型来接受可变形状的输入。具体而言,第一维需要是可变的。阅读specifying the input shape上的Keras文档,我看到你可以在input_shape元组中使用None条目,其中None表示可能需要任何正整数。

使用我现有的模型,如果我将input_shape从(2,4)更改为(None,4),我会收到以下错误:

---> Dense(2, activation='softmax')
TypeError: an integer is required

我不是肯定的,但是当模型包含Flatten()层时,我不相信可以指定变量输入形状。我已经读过Flatten()需要知道输入形状,因此变量输入形状与Flatten()不兼容。如果我删除Flatten()图层,我会收到与上面相同的错误。我不希望这个模型在没有Flatten()层的情况下工作,因为我认为输入在传递给Dense层之前是平坦的。

鉴于此,任何人都可以解释我如何能够利用可变输入形状?如果这里的问题是Flatten()层,那么在传递到Dense图层之前输入应该被展平的情况下,解决这个问题的方法是什么?

提前感谢任何建议。

编辑:举例说明潜在的训练集 - 对于上面显示的带有input_shape =(2,4)的模型,训练集可能如下所示,其中集合中的每个2维阵列都有形状(2, 4):

x_train = np.array([
         [[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]], 
         [[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]],
         [[1.01 ,1, 1.2, 1.2], [1.3, 1.2, 0.89, 0.98]]
        ])

对于具有input_shape =(None,4)的数据,其中每个数据点的第一维的形状可以变化,第二维固定为4,训练集可能如下所示:

x_train = np.array([
         [[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99], [1.1, 1.2, 0.91, 0.99]], 
         [[1, 1.02, 1.3, 0.9], [1.1, 1.2, 0.91, 0.99]],
         [[1,1,1,1], [1.3, 1.2, 0.89, 0.98], [1,1,1,1], [1,1,1,1]]
        ])
答案

x_train具有变化的维度,这将在训练阶段引起麻烦。如果wer pad额外为零,它会对您的数据产生重大影响吗?如果没有,找出不同尺寸的最大值并相应地构建新阵列,如下面的jupyter笔记本所示:Dimension of x_train and x_train2

The way how you pad zeros

以上是关于Keras序列模型的可变输入形状的主要内容,如果未能解决你的问题,请参考以下文章

带有用于可变长度输入的掩蔽层的 Keras lstm

Keras模型密集输入形状投掷误差

ValueError:检查目标时出错:预期(keras 序列模型层)具有 n 维,但得到的数组具有形状

Keras:TPU 模型的所有操作必须具有恒定的形状

如何在 Keras 的顺序模型中更改输入形状

Keras LSTM 层输入形状