我对张量流和 keras 相当陌生,有一个问题。 我想使用 LSTM 层进行时间序列预测,并进行一些修改。我从张量流教程中给出的示例开始
def build_LSTM(neurons, batch_size, history_size, features):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(neurons,
batch_input_shape=(batch_size, history_size, features),
stateful=True))
model.add(tf.keras.layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
return(model)
在示例的当前状态中,模型的输入采用以下形式(观测值、时间步长、特征),并且它返回一个数字(对的预测)
我想要做的是在 LSTM 层中使用模式
return_sequence=True
这返回形状(时间步长、特征)的张量 T 是否正确?
有没有一种方法可以将该张量从一个步骤(假设观察 = 1)转移到下一步(观察 = 2)?我猜对应的图表应该是这样的:
是的,的理解是正确的。当在 Keras LSTM 层中设置
return_sequences=True
时,它会为每个时间步长返回一个输出,从而产生形状为
(时间步长, 特征)
的张量。
要将一个时间步长的 LSTM 输出传递到下一个时间步长的输入,可以使用以下方法:
1. 使用
tf.keras.layers.TimeDistributed
包装器:
这是一种更简洁、更易读的方法。可以使用
TimeDistributed
包装器将
Dense
层应用于 LSTM 输出的每个时间步长。这将创建一个与 LSTM 输出具有相同形状的输出,然后可以将其反馈到输入。
def build_LSTM(neurons, batch_size, history_size, features):
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(neurons,
batch_input_shape=(batch_size, history_size, features),
stateful=True,
return_sequences=True))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(features)))
model.compile(loss='mean_squared_error', optimizer='adam')
return(model)
在这个例子中:
-
TimeDistributed(tf.keras.layers.Dense(features))
将一个
Dense
层应用于 LSTM 输出的每个时间步长。
- 由于我们希望将输出反馈到输入,因此
Dense
层的单元数应与输入特征数 (
features
) 相同。
2. 重构模型以进行迭代预测:
如果需要对输出进行更精细的控制或需要执行其他操作(例如,在将其反馈到输入之前添加其他层),则可以重构模型以迭代执行预测。
def build_LSTM(neurons, features):
input_layer = tf.keras.Input(shape=(1, features))
lstm_layer = tf.keras.layers.LSTM(neurons, stateful=True, return_state=True)
dense_layer = tf.keras.layers.Dense(features)
outputs = []
states = None
for t in range(history_size):
# 获取当前时间步长的输入
input_t = input_layer[:, t, :]
# 将输入传递给 LSTM
output, state_h, state_c = lstm_layer(tf.expand_dims(input_t, axis=1), initial_state=states)
# 应用 Dense 层
output = dense_layer(output)
# 将输出存储在列表中
outputs.append(output)
# 更新 LSTM 状态
states = [state_h, state_c]
model = tf.keras.Model(inputs=input_layer, outputs=outputs)
model.compile(loss='mean_squared_error', optimizer='adam')
return model
在这个例子中:
-
我们使用
tf.keras.Input
和tf.keras.Model
创建一个更灵活的模型。 -
我们在
for
循环中迭代时间步长。 -
return_state=True
使 LSTM 返回其内部状态,以便我们可以在下一个时间步长将其反馈。 -
initial_state
参数用于将先前的 LSTM 状态传递给下一个时间步长。
选择哪种方法取决于的特定需求。如果只需要一个简单的反馈机制,则
TimeDistributed
包装器更容易实现。如果需要对输出进行更精细的控制或需要执行其他操作,则迭代预测方法会更灵活。