我有一个Keras LSTM模型,其中包含多个输出。 该模型定义如下:
outputs=[]
main_input = Input(shape= (seq_length,feature_cnt), name='main_input')
lstm = LSTM(32,return_sequences=True)(main_input)
for _ in range((output_branches)): #output_branches is the number of output branches of the model
prediction = LSTM(8,return_sequences=False)(lstm)
out = Dense(1)(prediction)
outputs.append(out)
model = Model(inputs=main_input, outputs=outputs)
model.compile(optimizer='rmsprop',loss='mse')
重塑输出数据时出现问题。 重塑输出数据的代码是:
y=y.reshape((len(y),output_branches,1))
我遇到以下错误:
ValueError:检查模型目标时出错:Numpy数组列表 您传递给模型的信息不是模型期望的大小。 预期会看到5个数组,但得到以下1个列表 数组:[array([[[0.29670931], [0.16652206], [0.25114482], [0.36952324], [0.09429612]],
[[0.16652206], [0.25114482], [0.36952324], [0.09429612],...
如何正确重塑输出数据?
答案 0 :(得分:1)
由于输出量等于output_branches
,因此输出数据必须是具有相同数组数的list
。
基本上,如果输出数据在reshape
建议的中间位置,则:
y = [ y[:,i] for i in range(output_branches)]
答案 1 :(得分:0)
这取决于y
的初始结构。在这里,我假设y
是批处理中每个序列的单值标签。
当有多个输入/输出时,model.fit()
期望给出相应的输入/输出列表。在下面的完全可复制的示例中,np.split(y, output_branches, axis=-1)
确实做到了这一点-对于每个批次,将一个输出列表拆分成一个单独的输出列表,其中每个输出(在这种情况下)是1元素列表:
import tensorflow as tf
import numpy as np
tf.enable_eager_execution()
batch_size = 100
seq_length = 10
feature_cnt = 5
output_branches = 3
# Say we've got:
# - 100-element batch
# - of 10-element sequences
# - where each element of a sequence is a vector describing 5 features.
X = np.random.random_sample([batch_size, seq_length, feature_cnt])
# Every sequence of a batch is labelled with `output_branches` labels.
y = np.random.random_sample([batch_size, output_branches])
# Here y.shape() == (100, 3)
# Here we split the last axis of y (output_branches) into `output_branches` separate lists.
y = np.split(y, output_branches, axis=-1)
# Here y is not a numpy matrix anymore, but a list of matrices.
# E.g. y[0].shape() == (100, 1); y[1].shape() == (100, 1) etc...
outputs = []
main_input = tf.keras.layers.Input(shape=(seq_length, feature_cnt), name='main_input')
lstm = tf.keras.layers.LSTM(32, return_sequences=True)(main_input)
for _ in range(output_branches):
prediction = tf.keras.layers.LSTM(8, return_sequences=False)(lstm)
out = tf.keras.layers.Dense(1)(prediction)
outputs.append(out)
model = tf.keras.models.Model(inputs=main_input, outputs=outputs)
model.compile(optimizer='rmsprop', loss='mse')
model.fit(X, y)
由于未指定数据的确切外观,因此您可能需要使用轴。
编辑:
当作者从官方来源寻找答案时,提到了here(尽管没有明确指出,它仅提及数据集应产生的内容,因此-model.fit()
期望什么样的输入结构):>
使用数据集对象调用fit时,它应产生一个诸如
([title_data, body_data, tags_data], [priority_targets, dept_targets])
之类的列表元组或诸如({'title': title_data, 'body': body_data, 'tags': tags_data}, {'priority': priority_targets, 'department': dept_targets})
之类的字典元组。