【问题标题】:ValueError in multiple input model多输入模型中的 ValueError
【发布时间】:2020-08-15 18:26:51
【问题描述】:

我正在创建一个多输入模型,在其中连接一个 CNN 模型和一个 LSTM 模型。 lstm 模型包含最后 5 个事件,CNN 包含最后一个事件的图片。两者都经过组织,以便 numpy 中的每个元素 k 匹配 5 个事件和相应的图片,输出标签也是模型应该预测的“下一个”事件。

chanDim = -1
inputs = Input(shape=inputShape)
x = inputs
x = Dense(128)(x)
x = Activation("relu")(x)
x = BatchNormalization(axis=chanDim)(x)
x = Dropout(0.3)(x)
x = Flatten()(x)
x = Activation("relu")(x)
x = BatchNormalization(axis=chanDim)(x)
x = Dropout(0.1)(x)
x = Activation("relu")(x)
model_cnn = Model(inputs, x)

这样就创建了CNN模型,下面的代码代表LSTM模型

hidden1 = LSTM(128)(visible)
hidden2 = Dense(64, activation='relu')(hidden1)
output = Dense(10, activation='relu')(hidden2)
model_lstm = Model(inputs=visible, outputs=output)

现在,当我组合这些模型并使用简单的密集层扩展它们以对 14 个类进行多类预测时,所有输入都匹配,我可以将 (none, 10) 和 (none, 10) 连接成 (无,20) 对于 MLP:

x = Dense(14, activation="softmax")(x)
model_mlp = Model(inputs=[model_lstm.input, model_cnn.input], outputs=x)

这一切都很好,直到我尝试编译模型它给我一个关于 mlp 模型的最后一个密集层的输入的错误:

ValueError: 检查目标时出错:预期 dense_121 的形状为 (14,) 但得到的数组的形状为 (1,)

你知道这怎么可能吗?如果您需要更多信息,我很乐意提供

【问题讨论】:

  • dense_121 是模型的最后一层
  • y_train 数组的形状是什么?您是否对目标进行了 one-hot 编码?
  • LSTM 的训练集是 (79322, 1, 5) CNN 的训练集是 (79322, 1, 25088) y (outputlabels) 的训练集是 (113318,)
  • 我没有对数字进行热编码,但我将事件名称的分类整数从 0 到 14。0 是虚拟事件

标签: keras neural-network functional-programming conv-neural-network valueerror


【解决方案1】:

您的目标必须是 (None, 14) 维度的。使用 softmax,您必须对输出进行 one-hot 编码

试试这个:

y = pd.get_dummies(np.concatenate([y_train, y_test])).values
y_train = y[:len(y_train)]
y_test = y[len(y_train):]

【讨论】:

  • 我是否也必须为 LSTM 的输入值这样做?因为它是一个 numpy,其中每个元素都是最后 5 个事件的数组。例如 (0,0,4,7,2)。这些事件也是输出的多类选项(0->14)
  • 因为我使用 reshape() 函数将 lstm 输入从 (79322,5) 更改为 (79322,1,5) 因为它期望一个额外的维度作为输入但我不确定它是否和你说的一样
  • 输入的形状与你的错误无关(不知道是否正确有价值)
  • 好的,没问题。非常感谢您的回复!
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 2021-08-25
  • 2022-01-23
  • 1970-01-01
  • 2017-10-17
  • 2021-04-14
  • 2021-01-19
  • 2021-03-04
相关资源
最近更新 更多