Python 3.x Keras LSTM图层输入形状

Python 3.x Keras LSTM图层输入形状,python-3.x,deep-learning,keras,lstm,Python 3.x,Deep Learning,Keras,Lstm,我正在尝试向LSTM网络提供一个具有20个特性的序列,如代码所示。但是我得到一个错误,我的Input0与LSTM输入不兼容。不确定如何更改我的图层结构以适应数据 def build_model(features, aux1=None, aux2=None): # create model features[0] = np.asarray(features[0]) main_input = Input(shape=features[0].shape, dtype='float32', name='

我正在尝试向LSTM网络提供一个具有20个特性的序列,如代码所示。但是我得到一个错误,我的Input0与LSTM输入不兼容。不确定如何更改我的图层结构以适应数据

def build_model(features, aux1=None, aux2=None):
# create model
features[0] = np.asarray(features[0])
main_input = Input(shape=features[0].shape, dtype='float32', name='main_input')
main_out   = LSTM(40, activation='relu')
aux1_input = Input(shape=(len(aux1[0]),),   dtype='float32', name='aux1_input')
aux1_out   = Dense(len(aux1[0]))(aux1_input)
aux2_input = Input(shape=(len(aux2[0]),),   dtype='float32', name='aux2_input')
aux2_out   = Dense(len(aux2[0]))(aux2_input)
x = concatenate([aux1_out, main_out, aux2_out])
x = Dense(64, activation='relu')(x)
x = Dropout(0.5)(x)
output = Dense(1, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[aux1_input, aux2_input, main_input], outputs= [output])
return model

Features变量是一个形状数组(1456,20)。我有1456天,每天有20个变量。

您的主要输入应该是形状
(示例、时间步、特征)
然后你应该像这样定义主输入:

main_input = Input(shape=(timesteps,))  # for stateless RNN (your one)
features[0] = np.reshape(features[0], (1, features[0].shape))
main\u input=input(批处理形状=(批处理大小、时间步长),)
用于有状态RNN(不是示例中使用的)

如果您的
功能[0]
是各种功能的一维数组(1个时间步),那么您还必须对
功能[0]
进行如下重塑:

main_input = Input(shape=(timesteps,))  # for stateless RNN (your one)
features[0] = np.reshape(features[0], (1, features[0].shape))
然后对
功能[1]
功能[2]
等执行此操作

或者最好一次重塑所有样本:

features = np.reshape(features, (features.shape[0], 1, features.shape[1]))

LSTM层设计用于处理“序列”

你说你的序列有20个特征,但是它有多少个时间步呢??你是说20个时间步

LSTM层需要输入形状,如
(批大小、时间步长、特征)

如果在
20个时间步中的每个时间步中都有
1功能
,则必须将数据塑造为:

inputData = someData.reshape(NumberOfSequences, 20, 1)
输入
张量应为以下形状:

main_input = Input((20,1), ...) #yes, it ignores the batch size

请显示错误消息。你的序列有20个特征?但是你的序列长度是多少?(多少时间步?)ValueError:Input 0与层lstm_1不兼容:预期ndim=3,发现ndim=2是确切的错误我将主输入更改为main_Input=Input(batch_shape=(batch_size,20,),dtype='float32',name='main_Input')main_out=lstm(40,activation='relu')(main_输入)但我仍然有错误(输入0与层lstm_1不兼容:预期ndim=3,发现ndim=2)@Oğu您是否确保您的x.shape和y.shape有3个维度(样本、时间步、特征)?您必须以其他方式重新塑造数据我如何修改输入(“特征”)如果我有5个时间步?将其重塑为
(NumberOfSequences,5,20)
——假设有20个功能沿5个时间步变化。----我注意到的一件事是您使用
功能[0]。形状
作为输入形状。如果
功能[0]
已经正确成形,则应使用
功能[0]。形状[1:]
,因为第一个数字是
NumberOfSequences
,定义层时不会传递该数字。