Keras LSTM 层输入形状
Keras LSTM layers input shape
我正在尝试将具有 20 个特征的序列提供给 LSTM 网络,如代码所示。但是我得到一个错误,我的 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
特征变量是一个形状数组 (1456, 20) 我有 1456 天,每天我有 20 个变量。
你的 main_input 的形状应该是 (samples, timesteps, features)
然后你应该这样定义 main_input:
main_input = Input(shape=(timesteps,)) # for stateless RNN (your one)
或 main_input = Input(batch_shape=(batch_size, timesteps,))
用于有状态 RNN(不是您在示例中使用的那个)
如果您的 features[0]
是各种特征的一维数组(1 个时间步长),那么您还必须像这样重塑 features[0]
:
features[0] = np.reshape(features[0], (1, features[0].shape))
然后对 features[1]
、features[2]
等
或更好地一次重塑所有样本:
features = np.reshape(features, (features.shape[0], 1, features.shape[1]))
LSTM 层设计用于 "sequences"。
你说你的序列有 20 个特征,但是它有多少 时间步?您是说 20 个时间步吗?
LSTM 层需要输入形状,例如 (BatchSize, TimeSteps, Features)
。
如果在每个 20 time steps
中都有 1 feature
,则必须将数据调整为:
inputData = someData.reshape(NumberOfSequences, 20, 1)
并且 Input
张量应采用以下形状:
main_input = Input((20,1), ...) #yes, it ignores the batch size
我正在尝试将具有 20 个特征的序列提供给 LSTM 网络,如代码所示。但是我得到一个错误,我的 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
特征变量是一个形状数组 (1456, 20) 我有 1456 天,每天我有 20 个变量。
你的 main_input 的形状应该是 (samples, timesteps, features)
然后你应该这样定义 main_input:
main_input = Input(shape=(timesteps,)) # for stateless RNN (your one)
或 main_input = Input(batch_shape=(batch_size, timesteps,))
用于有状态 RNN(不是您在示例中使用的那个)
如果您的 features[0]
是各种特征的一维数组(1 个时间步长),那么您还必须像这样重塑 features[0]
:
features[0] = np.reshape(features[0], (1, features[0].shape))
然后对 features[1]
、features[2]
等
或更好地一次重塑所有样本:
features = np.reshape(features, (features.shape[0], 1, features.shape[1]))
LSTM 层设计用于 "sequences"。
你说你的序列有 20 个特征,但是它有多少 时间步?您是说 20 个时间步吗?
LSTM 层需要输入形状,例如 (BatchSize, TimeSteps, Features)
。
如果在每个 20 time steps
中都有 1 feature
,则必须将数据调整为:
inputData = someData.reshape(NumberOfSequences, 20, 1)
并且 Input
张量应采用以下形状:
main_input = Input((20,1), ...) #yes, it ignores the batch size