首页 > 解决方案 > 多输入多输出模型返回单值

问题描述

我正在尝试使用 Keras 中的多输入模型使用时间序列(即过去 n 个月的收入)和时间不变的客户数据(即性别、职业)来预测客户收入。为此,我使用 LSTM 模型来预测时间 (n+1) 的收入,然后引入客户数据作为辅助输入。

第一个模型 (LSTM) 产生了不错的结果,但添加辅助层似乎产生了一个悖论,因为每个客户的预测都是相同的值。任何建议为什么会发生这种情况?

已经尝试了多个批量大小并转换了一些数值变量,但问题仍然存在。

from keras.layers import Input, LSTM, Dense, concatenate
from keras.models import Model


'''
train_X1: time series data, customer revenues, 1 to (n-1)
train_X2: customer demographics
'''


train_X1 = np.asarray(X1.drop('id', axis = 1))
train_X1 = train_X1.reshape(train_X1.shape[0], train_X1.shape[1], 1)
print(train_X1.shape)

train_X2 = np.asarray(X2.drop('id', axis = 1))
print(train_X2.shape)


main_input = Input(shape = (20,1), name = "main_input")
hidden = Dense(10, activation = 'tanh')(main_input)
hidden = LSTM(10)(hidden)
aux_output = Dense(1, name = 'aux_output')(hidden)

train_X2 = np.asarray(X2.drop('id', axis = 1))
train_X2 = train_X2.reshape(train_X2.shape[0], train_X2.shape[1])
print(train_X2.shape)

aux_input = Input(shape = (2, ), name = "aux_input")
hidden = concatenate([aux_output, aux_input])
hidden = Dense(2, activation = 'relu')(hidden)
main_output = Dense(1, name = "main_output")(hidden)

model = Model(inputs = [main_input, aux_input], outputs = [main_output, aux_output])

model.compile(optimizer ='adam',
              loss = {'main_output': 'mean_squared_error', 'aux_output': 'mean_squared_error'},
              loss_weights = {'main_output': 1, 'aux_output': 0.2})
model.fit({'main_input': train_X1, 'aux_input': train_X2},
                {'main_output': y, 'aux_output': y},
                epochs = 50, batch_size = 5)

期望不同的预测,但此代码仅导致单个值预测。(见图)

注意:我目前只在一个非常小的数据集中模拟这项工作,然后才能将其扩展到更大的集合。这可能是数据问题吗?

在此处输入图像描述

标签: python-3.xkerasdeep-learninglstmkeras-layer

解决方案


当你这样做

preds = model.predict([train_X1, train_X2])

您将获得两个 numpy 数组的列表。

如果 is 的 shapetrain_X1(100, 20, 1)shape of train_X2is(100, 2)preds将是两个 numpy 数组的列表,其中每个数组都是 shape (100, 1)

i您可以像这样访问测试样本的预测

preds[0][i], preds[1][i]

您可以遍历数组以获取每个样本的输出以进行视觉验证,如下所示

preds = model.predict([train_X1, train_X2])
for i in range(len(preds[1])):
    print(f'Main prediction for sample {i} = {preds[0][i]} --- Aux Prediction for sample {i} = {preds[1][i]}')


# Output

Main prediction for sample 0 = [-5.820766e-09] --- Aux Prediction for sample 0 = [-9.313226e-09]
Main prediction for sample 1 = [-5.820766e-09] --- Aux Prediction for sample 1 = [-9.313226e-09]
Main prediction for sample 2 = [-5.820766e-09] --- Aux Prediction for sample 2 = [-9.313226e-09]
Main prediction for sample 3 = [-5.820766e-09] --- Aux Prediction for sample 3 = [-9.313226e-09]
Main prediction for sample 4 = [-5.820766e-09] --- Aux Prediction for sample 4 = [-9.313226e-09]
..................................................................................................

推荐阅读