4 LSTM之代码实现
系列进度
AI 30 个神经网络 · 第 4 / 62 篇
LSTM 的重点不在名字,而在门控如何筛掉旧信息、写入新信息,再把当前状态交给下一步。读这类文章时,把每个时间步画出来,比只看公式更容易理解。这篇重点看实现。不要只复制代码,要把环境、输入形状、模型调用和输出解释逐项确认。
我会检查输入维度、序列长度、hidden size 和最后取哪一个时间步。四项说清楚,LSTM 代码才不容易跑偏。
在上一篇中,我们对LSTM(长短期记忆网络)的原理进行了深入解析,了解了其内部单元如何通过门控机制捕获序列数据中的长期依赖关系。接下来,我们将着重于LSTM的代码实现,利用Python和TensorFlow/Keras框架构建一个简单的LSTM模型,并用实战案例来演示它的应用。
LSTM的代码实现
读完《LSTM之代码实现》后,可以先挑一个小样例走完整流程,再判断哪些步骤已经能独立完成。
读到这里,可以把《LSTM之代码实现》整理成一张复盘表:先说清主线,再拿一个小任务检查结果。
环境准备
首先,请确保你已安装以下库:
pip install numpy pandas matplotlib tensorflow
数据准备
在本节中,我们将使用一个时序数据集作为案例,假设我们要预测某个时间序列的下一个值。我们使用numpy和pandas来生成并处理数据。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
# 生成示例时序数据
data = np.sin(np.arange(0, 100, 0.1)) + np.random.normal(scale=0.5, size=1000)
data = pd.DataFrame(data, columns=['value'])
# 对数据进行归一化处理
scaler = MinMaxScaler(feature_range=(0, 1))
data['value'] = scaler.fit_transform(data['value'].values.reshape(-1, 1))
数据集切分
为了训练LSTM模型,我们需要将时序数据切分成适合模型输入的格式。我们将设定使用过去n_steps个时间点的数据来预测下一个点。
# 设置时间步长
n_steps = 10
def create_dataset(data, n_steps=1):
X, y = [], []
for i in range(len(data) - n_steps):
X.append(data[i:(i + n_steps), 0])
y.append(data[i + n_steps, 0])
return np.array(X), np.array(y)
X, y = create_dataset(data.values, n_steps)
X = X.reshape((X.shape[0], X.shape[1], 1)) # 重塑为LSTM输入格式
构建LSTM模型
以下是利用Keras构建LSTM模型的代码。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
# 构建LSTM模型
model = Sequential()
model.add(LSTM(50, activation='relu', return_sequences=True, input_shape=(n_steps, 1)))
model.add(Dropout(0.2))
model.add(LSTM(50, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
模型训练
现在,我们将训练上述构建的LSTM模型。
写 LSTM 代码时,先确认 batch、时间步、特征维度和隐藏状态维度。形状对齐后,再看损失、优化器和训练日志。
# 训练模型
model.fit(X, y, epochs=200, verbose=1)
模型预测
训练完成后,我们可以使用模型进行预测。我们将使用最后n_steps个数据点进行预测,并获得模型输出。
# 进行预测
last_steps = data.values[-n_steps:].reshape((1, n_steps, 1))
predicted_value = model.predict(last_steps)
predicted_value = scaler.inverse_transform(predicted_value) # 反归一化
print("预测的下一个值:", predicted_value[0][0])
可视化结果
最后,我们可以可视化预测结果与实际结果之间的对比,以验证模型效果。
学《LSTM之代码实现》时,可以先找一个自己能复现的小场景,再看相关概念和练习步骤,读完后用自己的例子复述一遍。
# 可视化
plt.plot(data.index[-100:], data.values[-100:], label='实际值')
plt.axvline(x=len(data) - n_steps - 1, color='r', linestyle='--', label='预测起点')
plt.scatter(len(data) - 1, predicted_value, color='g', label='预测值')
plt.legend()
plt.title('LSTM预测结果')
plt.xlabel('时间')
plt.ylabel('值')
plt.show()
结论
在本篇中,我们对LSTM模型进行了代码实现,通过一个简单的时序预测案例,生动展示了如何使用Keras构建和训练LSTM网络,及其在实际应用中的效果。接下来的篇章中,我们将讨论BERT模型的架构特点,敬请期待!
相关教程
相关入口
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
相关内容