在 Keras 中拟合模型时出现维度错误

Posted

技术标签:

【中文标题】在 Keras 中拟合模型时出现维度错误【英文标题】:Dimensionality error when fitting model in Keras 【发布时间】:2018-08-30 02:35:39 【问题描述】:

我正在尝试使用 Keras(Tensorflow 后端)构建模型:

def build_model(args):
    # Define the input nodes
    text1 = build_input_node('text1', args.batch_size, args.time_steps)
    text2 = build_input_node('text2', args.batch_size, args.time_steps)

    # Create the shared LSTM node
    shared_lstm = LSTM(INPUT_SIZE, stateful=args.stateful)

    # Run inputs through shared layer
    encoded1 = shared_lstm(text1)
    encoded2 = shared_lstm(text2)

    # Concatenate outputs to form a tensor of shape (2*batch_size, INPUT_SIZE)
    concatenated = concatenate([encoded1, encoded2], axis=0)

    # Input shape: (2*batch_size, INPUT_SIZE)
    # Output shape: (2*batch_size, batch_size)
    dense1 = Dense(args.batch_size,
                   input_shape=(2 * args.batch_size, INPUT_SIZE),
                   activation='sigmoid')(concatenated)

    # Input shape: (2*batch_size, batch_size)
    # Output shape: (2*batch_size, 1)
    output_shape = (2 * args.batch_size, 1)
    output = Dense(1,
                   input_shape=(2 * args.batch_size, args.batch_size),
                   activation='sigmoid')(dense1)

    model = Model(inputs=[text1, text2], outputs=output)
    optimizer = build_optimizer(name=args.optimizer, lr=args.learning_rate)
    model.compile(loss=args.loss,
                  optimizer=optimizer,
                  metrics=['accuracy'])
    return model, output_shape

应该输入模型的数据被重新整形以适应output_shape 变量:

def build_datasets(input, time_steps, output_shape):
    T1 = []
    T2 = []
    Y = []
    for sentence1, sentence2, score in input:
        T1.append([t.vector for t in nlp(sentence1)])
        T2.append([t.vector for t in nlp(sentence2)])
        Y.append(np.full(output_shape, score))

    T1 = pad_and_reshape(T1, time_steps)
    T2 = pad_and_reshape(T2, time_steps)

    X = [T1, T2]
    Y = np.asarray(Y)
    # fit the scores between 0 and 1
    Y = expit(Y)
    return X, Y

但是当我调用model.fit(X, Y, epochs=100, batch_size=8) 时,它会抛出以下错误:

ValueError: 检查目标时出错:预期 dense_34 有 2 个维度,但得到的数组形状为 (1468, 16, 1)

其中 1468 是样本数,16 是 2*batch_size。

我做错了什么?如何获得输出节点的正确形状?

编辑 模型摘要如下:


层(类型)输出形状参数#连接到

text1 (InputLayer) (8, 15, 384) 0


text2 (InputLayer) (8, 15, 384) 0


lstm_1 (LSTM) (8, 384) 1181184 text1[0][0] 文本2[0][0]


concatenate_1 (连接) (16, 384) 0 lstm_1[0][0] lstm_1[1][0]


dense_1(密集)(16, 8) 3080 concatenate_1[0][0]


dense_2 (Dense) (16, 1) 9 dense_1[0][0]


总参数:1,184,273

可训练参数:1,184,273

不可训练的参数:0

【问题讨论】:

请使用 model.summary() 的输出更新您的帖子 INPUT_SIZE 设置为什么? @JahKnows INPUT_SIZE=384 在密集层之前,尝试使用 Keras 提供的 Flatten() 层 @JahKnows,感谢您的评论,但这不会将密集层的输入转换为 (None, 1468*16*1) 的形状吗? 【参考方案1】:

通过keras代码调试了一下,我发现keras用这一行调整了Y的维度:

y = _standardize_input_data(y, self._feed_output_names,
                            output_shapes,
                            check_batch_axis=False,
                            exception_prefix='target')

依次调用

data = [np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data]

由于我的y 的形状为(1468, 16, 1),因此稍后在验证时会引发错误。

解决方法是将Y.append(np.full(output_shape, score)) 替换为Y.append(score)

【讨论】:

以上是关于在 Keras 中拟合模型时出现维度错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 中拟合两个连接 LSTM 的模型?

python中kera LSTM网络的模型拟合和尺寸大小误差

防止神经网络模型过拟合的6种方法及keras代码实现

TensorFlow/Keras 多线程模型拟合

Keras和张量流连接和拟合错误

拟合 Keras 模型会产生错误“常量折叠失败:无效参数:不支持的类型:21”