在 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 中拟合模型时出现维度错误的主要内容,如果未能解决你的问题,请参考以下文章