2017-10-17 78 views
1

试图建立一个单一输出回归模型,但似乎有问题在最后一层错误检查时的目标:预期time_distributed_5有3个维度,但得到了与形状阵​​列(14724,1)

inputs = Input(shape=(48, 1)) 
lstm = CuDNNLSTM(256,return_sequences=True)(inputs) 
lstm = Dropout(dropouts[0])(lstm) 

#aux_input 
auxiliary_inputs = Input(shape=(48, 7)) 
auxiliary_outputs = TimeDistributed(Dense(4))(auxiliary_inputs) 
auxiliary_outputs = TimeDistributed(Dense(7))(auxiliary_outputs) 

#concatenate 
output = keras.layers.concatenate([lstm, auxiliary_outputs]) 

output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(64, activation='linear'))(output) 
output = TimeDistributed(Dense(1, activation='linear'))(output) 

model = Model(inputs=[inputs, auxiliary_inputs], outputs=[output]) 

我是新来keras ...我收到以下错误

ValueError: Error when checking target: expected time_distributed_5 to have 3 dimensions, but got array with shape (14724, 1)

回答

0

好吧,我想我找到了一个修复程序 根据 - https://keras.io/layers/wrappers/它说我们正在对每个时间步施加密集层(在我的情况下,我有48个时间步)。所以,我最后一层的输出将是(batch_size时,时间步长,尺寸等)低于:

output = TimeDistributed(Dense(1, activation='linear'))(output) 

会因此尺寸不匹配(,48.1?)。但是,如果我想将其转换为单一的回归结果,我们将不得不压平最终TimeDistributed层

,所以我增加了以下行来解决它:

output = Flatten()(output) 
output = (Dense(1, activation='linear'))(output) 

所以现在timedistributed层变平至49输入(看起来像是一个偏置输入)到最后的密集层到单个输出。

好的,代码工作正常,我得到正确的结果(模型学习)。我唯一的疑问是,如果数学上可以将TimeDistributed图层展平为简单的密集图层以获得如上所述的结果?

0

你能否提供关于你的问题的背景下,更?测试数据或至少更多的代码。你为什么首先选择这个架构?更简单的架构(只是LSTM)能做到这一点吗?你在倒退什么?用线性激活函数堆叠多个TimeDistributed Dense图层可能不会增加太多的模型。

+0

是的,你可能是对的。我可以使用LSTM,但它能给我带来满意的结果。 lstm的输入是48步时间序列,我想预测下一个时间步骤(第49个)。每个时间步骤都附带通过辅助输入馈送的附加数据(48,7)(7个功能)。我试图用辅助输出连接lstm的输出。 – mojo1643

相关问题