【发布时间】:2019-12-03 02:45:45
【问题描述】:
我使用 Keras 构建了一个 LSTM 架构。我的目标是将长度为 29 的浮点时间序列输入序列映射到长度为 29 的浮点输出序列。我正在尝试实施“多对多”的方法。我跟着this post 实现了这样一个模型。
我首先将每个数据点重塑为形状为 `(1, 29, 1) 的 np.array。我有多个数据点,并分别在每个数据点上训练模型。以下代码是我构建模型的方式:
def build_model():
# define model
model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(29, return_sequences=True, input_shape=(29, 1)))
model.add(tf.keras.layers.LeakyReLU(alpha=0.3))
model.compile(optimizer='sgd', loss='mse', metrics = ['mae'])
#cast data
for point in train_dict:
train_data = train_dict[point]
train_dataset = tf.data.Dataset.from_tensor_slices((
tf.cast(train_data[0], features_type),
tf.cast(train_data[1], target_type))
).repeat() #cast into X, Y
# fit model
model.fit(train_dataset, epochs=100,steps_per_epoch = 1,verbose=0)
print(model.summary())
return model
我很困惑,因为当我调用 model.predict(test_point, steps = 1, verbose = 1) 时,模型返回 29 长度 29 序列!根据我对链接帖子的理解,我不明白为什么会这样。当我尝试 return_state=True 而不是 return_sequences=True 时,我的代码会引发此错误:ValueError: All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.
我该如何解决这个问题?
【问题讨论】:
-
test_point的形状是什么?据我所知,您的模型输出[batch_size, 29, 29]大小的输出。所以输出形状中会有两个 29(我假设这就是你得到的)。 -
test_point 也是 [1,29,1]。这也是我想输出的理想形状
-
那么你需要在你的 LSTM 之上有一个密集层。我假设这是一个回归问题。因此,我在 LSTM 之上发布了一个带有线性密集层的答案。另外,我不确定您为什么要在 LSTM 之上应用 LeakyReLU。这对我来说似乎很奇怪。
标签: python tensorflow keras neural-network lstm