【发布时间】: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