【问题标题】:Keras multi-output model wrongly calculate target dimensions: ValueError: Error when checking targetKeras多输出模型错误计算目标尺寸:ValueError:检查目标时出错
【发布时间】:2020-01-30 18:05:04
【问题描述】:

我正在尝试从一个有效的单输出模型开始构建一个多输出 keras 模型。然而,Keras 抱怨张量维度。

单输出模型:

这个 GRU 模型训练和预测都很好:

timesteps = 250
features = 2

input_tensor = Input(shape=(timesteps, features), name="input")
conv = Conv1D(filters=128, kernel_size=6,use_bias=True)(input_tensor)
b = BatchNormalization()(conv)
s_gru, states = GRU(256, return_sequences=True, return_state=True, name="gru_1")(b)
biases = keras.initializers.Constant(value=88.15)
out = Dense(1, activation='linear', name="output")(s_gru)
model = Model(inputs=input_tensor, outputs=out)

我的 numpy 数组是:

train_x # shape:(7110, 250, 2) 
train_y # shape: (7110, 250, 1) 

如果使用以下代码拟合模型并且一切正常:

model.fit(train_x, train_y,batch_size=128, epochs=10, verbose=1)

问题:

我想使用稍微修改过的网络版本,它也输出 GRU 状态:

input_tensor = Input(shape=(timesteps, features), name="input")
conv = Conv1D(filters=128, kernel_size=6,use_bias=True)(input_tensor)
b = BatchNormalization()(conv)
s_gru, states = GRU(256, return_sequences=True, return_state=True, name="gru_1")(b)
biases = keras.initializers.Constant(value=88.15)
out = Dense(1, activation='linear', name="output")(s_gru)
model = Model(inputs=input_tensor, outputs=[out, states]) # multi output

#fit the model but with a list of numpy array as y
model.compile(optimizer=optimizer, loss='mae', loss_weights=[0.5, 0.5])
history = model.fit(train_x, [train_y,train_y], batch_size=128, epochs=10, callbacks=[])

此训练失败,keras 抱怨目标维度:

ValueError: Error when checking target: expected gru_1 to have 2 dimensions, but got array with shape (7110, 250, 1)

我正在使用 Keras 2.3.0 和 Tensorflow 2.0。

我在这里错过了什么?

【问题讨论】:

  • 'states' 的维度对于示例数和单元数的形状将是 (7110, 256),因此您无法真正将其与单个 Dense 单元的输出进行比较.
  • 谢谢!但我没有将状态连接到 Dense 层。我只使用s_gru 作为密集层的输入。 s_gru 是输出序列
  • 同意,但是,您期望的输出形状应该与状态的尺寸相匹配。在此示例中,任何形状为 (None, 256) 的 np.array 都可以。具有单个输出的情况有效,因为train_y 具有与输入相同的序列长度。您能否为多输出情况添加model.summary 的输出?
  • 对不起,我最初误解了你的回答。现在我明白你的意思了,通过改变目标列表中 secod 数组的维度,我可以训练网络。谢谢!如果您想回答问题,我会将其标记为已接受的答案。
  • 很高兴我能帮上忙

标签: python numpy keras tensorflow2.0


【解决方案1】:

第二个输出的尺寸和outputs 列表中的第二个元素的尺寸应该是相似的。在这种情况下,states 的形状将是 (7110, 256),它无法与 train_y 形状进行比较(如第一个代码块中所述,形状将是 (7110, 250, 1)。确保输出可以与相似的形状进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2020-04-07
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多