Python从0到100(八十八):LSTM网络详细介绍及实战指南

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

本文目录:

    • 一、循环神经网络(RNN)的局限性
      • 1.1 RNN的基本结构
      • 1.2 RNN的梯度问题
    • 二、LSTM核心原理
      • 2.1 LSTM核心组件
        • 2.1.1 遗忘门(Forget Gate)
        • 2.1.2 输入门(Input Gate)
        • 2.1.3 细胞状态更新
        • 2.1.4 输出门(Output Gate)
      • 2.2 LSTM参数分析
    • 三、LSTM实战:股票价格预测
      • 3.1 数据集准备
      • 3.2 数据预处理
      • 3.3 模型构建
      • 3.4 模型训练
    • 四、LSTM变体与改进
      • 4.1 双向LSTM(BiLSTM)
      • 4.2 窥视孔连接(Peephole Connection)
    • 五、LSTM调优技巧
      • 5.1 超参数优化
      • 5.2 正则化策略
    • 六、LSTM应用场景
      • 6.1 典型应用领域
      • 6.2 应用案例:文本生成
    • 七、LSTM局限性及应对
      • 7.1 主要局限性
      • 7.2 改进方向
    • 八、完整代码示例
    • 文末送书
      • `本期推荐1:`
      • `本期推荐2:`

LSTM 是一种特殊的 RNN,设计用来解决长序列数据中的梯度消失问题。

一、循环神经网络(RNN)的局限性

1.1 RNN的基本结构

# 简单RNN单元实现
class SimpleRNNCell:def __init__(self, input_size, hidden_size):self.Wxh = np.random.randn(hidden_size, input_size)*0.01  # 输入到隐藏层权重self.Whh = np.random.randn(hidden_size, hidden_size)*0.01  # 隐藏层到隐藏层权重self.bh = np.zeros((hidden_size, 1))  # 隐藏层偏置def forward(self, x, h_prev):h_next = np.tanh(np.dot(self.Wxh, x) + np.dot(self.Whh, h_prev) + self.bh)return h_next

1.2 RNN的梯度问题

  • 梯度消失:长期依赖难以捕捉
  • 梯度爆炸:参数更新幅度过大
  • 理论记忆长度:通常不超过10个时间步

二、LSTM核心原理

在这里插入图片描述

2.1 LSTM核心组件

2.1.1 遗忘门(Forget Gate)

f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)

2.1.2 输入门(Input Gate)

i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) C ~ t = tanh ⁡ ( W C ⋅ [ h t − 1 , x t ] + b C ) i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \\ \tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C) it=σ(Wi[ht1,xt]+bi)C~t=tanh(WC[ht1,xt]+bC)

2.1.3 细胞状态更新

C t = f t ∘ C t − 1 + i t ∘ C ~ t C_t = f_t \circ C_{t-1} + i_t \circ \tilde{C}_t Ct=ftCt1+itC~t

2.1.4 输出门(Output Gate)

o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) h t = o t ∘ tanh ⁡ ( C t ) o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o) \\ h_t = o_t \circ \tanh(C_t) ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)

2.2 LSTM参数分析

参数类型计算方式参数量公式
输入权重矩阵W_xi, W_xf, W_xo, W_xc4 * hidden_size * input_size
循环权重矩阵W_hi, W_hf, W_ho, W_hc4 * hidden_size * hidden_size
偏置项b_i, b_f, b_o, b_c4 * hidden_size
总参数量4*(input_size + hidden_size + 1)*hidden_size

三、LSTM实战:股票价格预测

3.1 数据集准备

使用雅虎财经AAPL股票数据(2010-2023)

import yfinance as yfdata = yf.download('AAPL', start='2010-01-01', end='2023-12-31')
features = data[['Open', 'High', 'Low', 'Close', 'Volume']].values

3.2 数据预处理

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(features)# 创建时间序列样本
def create_dataset(data, look_back=60):X, y = [], []for i in range(len(data)-look_back-1):X.append(data[i:(i+look_back)])y.append(data[i+look_back, 3])  # 预测Close价格return np.array(X), np.array(y)X, y = create_dataset(scaled_data)

3.3 模型构建

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropoutmodel = Sequential([LSTM(128, return_sequences=True, input_shape=(X.shape[1], X.shape[2])),Dropout(0.3),LSTM(64, return_sequences=False),Dropout(0.3),Dense(32, activation='relu'),Dense(1)
])model.compile(optimizer='adam', loss='mean_squared_error')

3.4 模型训练

history = model.fit(X_train, y_train,epochs=100,batch_size=32,validation_split=0.2,callbacks=[EarlyStopping(monitor='val_loss', patience=10),ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5)]
)

四、LSTM变体与改进

4.1 双向LSTM(BiLSTM)

from tensorflow.keras.layers import BidirectionalBidirectional(LSTM(64, return_sequences=True))

4.2 窥视孔连接(Peephole Connection)

f t = σ ( W f ⋅ [ C t − 1 , h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [C_{t-1}, h_{t-1}, x_t] + b_f) ft=σ(Wf[Ct1,ht1,xt]+bf)

五、LSTM调优技巧

5.1 超参数优化

参数推荐范围优化方法
隐藏单元数64-512贝叶斯优化
学习率1e-4 - 1e-2学习率衰减
Dropout率0.2-0.5网格搜索
批大小32-256逐步倍增法

5.2 正则化策略

  • Recurrent Dropout:在循环计算中应用Dropout
  • Weight Constraint:限制权重矩阵的范数
  • Zoneout:随机保持前一刻的隐藏状态

六、LSTM应用场景

6.1 典型应用领域

  1. 自然语言处理

    • 机器翻译
    • 文本生成
    • 情感分析
  2. 时间序列分析

    • 股票预测
    • 气象预报
    • 设备故障检测
  3. 生物信息学

    • DNA序列分析
    • 蛋白质结构预测

6.2 应用案例:文本生成

from tensorflow.keras.layers import Embedding# 文本生成模型
model = Sequential([Embedding(vocab_size, 256),LSTM(1024, return_sequences=True),LSTM(512),Dense(vocab_size, activation='softmax')
])

七、LSTM局限性及应对

7.1 主要局限性

  1. 计算复杂度高:参数量是简单RNN的4倍
  2. 长序列处理能力有限:实际有效记忆约200-300时间步
  3. 并行化困难:时序依赖性限制计算并行度

7.2 改进方向

  • 注意力机制:Transformer架构
  • 记忆增强:Neural Turing Machine
  • 简化结构:GRU等轻量变体

八、完整代码示例

# 完整的时间序列预测代码
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler# 数据准备
def load_data(file_path, look_back=60):# 实现数据加载和预处理pass  # 构建LSTM模型
def build_lstm_model(input_shape):model = tf.keras.Sequential([tf.keras.layers.LSTM(128, return_sequences=True, input_shape=input_shape),tf.keras.layers.Dropout(0.3),tf.keras.layers.LSTM(64),tf.keras.layers.Dropout(0.3),tf.keras.layers.Dense(32, activation='relu'),tf.keras.layers.Dense(1)])model.compile(optimizer='adam', loss='mse')return model# 模型训练与评估
if __name__ == "__main__":X_train, y_train, X_test, y_test = load_data('stock_data.csv')model = build_lstm_model((X_train.shape[1], X_train.shape[2]))history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)predictions = model.predict(X_test)# 实现评估指标计算和可视化

文末送书

本期推荐1:

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》
华为OpenHarmony首席架构师力荐教材:本书通过68个实战示例+4个大型综合性案例+大量即用型优质代码,手把手教你快速掌握HarmonyOS应用开发核心技术!
在这里插入图片描述

京东:https://item.jd.com/14349963.html

从AI助力角度出发,轻松学习编程
故事引入思政,引发读者动手实践
引出目标任务,明确学习目的和方向
AI学习问答与同步训练,提升学习效率
丰富的学习资源,助力实际项目开发
内容简介
华为自主研发的HarmonyOS(鸿蒙系统)是一款面向未来、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。本书采用HarmonyOS最新版本作为基石,详细介绍如何基于HarmonyOS进行应用
的开发,包括HarmonyOS架构、DevEco Studio、应用结构、Ability、安全管理、公共事件、通知、ArkTS、ArkUI、Stage模型、设备管理、数据管理、线程管理、视频、图像、网络管理等多个主题。本书辅以大量的实战案例,图文
并茂,使读者易于理解和掌握。同时,本书的案例选型偏重于解决实际问题,具有很强的前瞻性、应用性和趣味性。加入HarmonyOS生态,让我们一起构建万物互联的新时代!
本书主要面向的是对HarmonyOS应用开发感兴趣的学生、开发人员、架构师。

本期推荐2:

《AI智能化办公:讯飞星火AI使用方法与技巧从入门到精通》
零基础上手,助你快速精通:认识讯飞星火AI大模型→基本操作→插件使用→指令集应用→各行业领域应用→产品拓展→信息检索。
在这里插入图片描述

京东:https://item.jd.com/14349955.html

本书以讯飞星火认知大模型为例,全面系统地阐述其基础知识、操作方法与技巧,以及相关实战案例。全书共分为12章,第1章为新手入门篇,为读者铺垫了讯飞星火认知大模型(以下简称讯飞星火)的基础知识;第2至第4章为基础操作篇,提供了讯飞星火的基础操作、对讯飞星火插件的探索以及讯飞星火指令集的详解;第5至第10章为应用实战篇,深入剖析了讯飞星火在办公自动化、编程辅助、创意绘画、专业设计、艺术摄影等多个维度的深度应用,并结合实际案例进行阐释;第11章~第12章为进阶拓展篇,一方面介绍了更多整合讯飞星火技术的AI产品,另一方面着眼于讯飞星火与信息检索技术结合的前沿创新。
本书采用通俗易懂的语言和紧贴现实需求的案例,旨在为广大对人工智能兴趣浓厚的读者群体提供一本实用指南。无论您是刚踏入AI领域的新手,还是有着丰富经验的资深专业人士,阅读本书都将助您拓宽知识视野,激发创造灵感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17026.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵,具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

python013-基于Python的智能停车系统的设计与实现(源码+数据库+论文+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录,所以我们要找到原先的密码 解决方式: [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…

无线4G多联机分户计费集中控制系统

拓森无线4G多联机集中控制系统应用于宝龙广场多联机计费集中控制节能改造项目,包括多联机集中控制,分户计费,空调监控管理、告警管理、节能管控、统计报表、能效分析、空调远程开关机等功能。项目的成功实施,不仅提升了维护管理效…

oracle多次密码错误登录,用户锁住或失效

多次输入错误账号查询状态: select username,account_status from dba_users; TEST EXPIRED(GRACE) 密码错误延迟登录,延迟登录还能登录 或者 TEST LOCKED(TIMED) 密码错误锁 TEST EXPIRED(GR…

连通两台VMware虚拟机

连通两台VMware虚拟机 Fairing Winds and Following Seas VMware各模式的区别 在尝试连接之前,我们要搞清楚各模式的区别 简单来说就是,只有桥接模式和NAT模式是可以实现虚拟机联通的,而桥接模式和NAT模式分别对应了 V M w a r e VMware VM…

C++ 容器适配器

文章目录 1. 适配器2. stack和queue2.1 deque2.1.1 deque的底层结构2.1.2 deque如何实现头插和随机访问 2.2 用deque实现栈和队列2.3 deque的优缺点 3. priority_queue 1. 适配器 适配器是什么? 适配器是一种设计模式,实质上就是一种复用,即…

DeepSeek R1本地部署解决,DeepSeek服务繁忙

DeepSeek 本地部署是指将DeepSeek模型下载到本地电脑上,利用电脑的显卡进行数据处理和推理,可以减少网络延迟,提高数据处理和响应速度,从而避免将数据传输到云端,增强了数据的主权和控制,减少了因网络连接可…

GPT和BERT

笔记来源: Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频(RNN模型与NLP应用) 一、GPT 1.1 GPT 模型的…

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…

JDK 14,15,17的一些新特性(部分常用)

1:instanceof(后,使用不再需要墙转) 2:switch语句增强 1:支持lmbda,自动防击穿,有返回值 2:支持case多个值,复杂逻辑结果支持yield返回 3:字符串…

活字格使用说明书

字格设计使用说明书 目录 1. 数据 2. 页面 3. 组件 4. 命令 一、数据 1.表数据创建(鼠标移动到表右击点击创建表) ‘ 图表 1 鼠标移至表1右击可重命名,添加字段输入所需字段名(一般数据类型的要注意:日期格式字段---日期、ID或者字典字段---整数、金…

springboot021校园周边美食探索及分享平台

版权声明 所有作品均为本人原创,提供参考学习使用,如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言:Javavue。 框架:后端spingboot前端vue。 模式:B/S。 数据库:mysql。 开…

Kubernetes部署KeyDB服务

Kubernetes YAML 配置文件,部署一个 KeyDB 容器 vi keydb-deployment.yaml内容如下 apiVersion: apps/v1 kind: Deployment metadata:name: keydb-deployment spec:replicas: 1selector:matchLabels:app: keydbtemplate:metadata:labels:app: keydbspec:container…

新手自学:如何用gromacs对简单分子复合物进行伞形采样

1、建立体系: 1、将蛋白的pdb文件转化为gmx: gmx pdb2gmx -f 2BEG_model1_capped.pdb -ignh -ter -o complex.gro 这个网页可以实现将多肽序列转化为pdb: ProBuilder On-line 这个教程的蛋白2BFG包含两条链(chain A和B) 在生成的topol文件中,增加如下的内容,效果就…

如何使用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天

手把手教你用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天 目录 文章目录 手把手教你用**Java**语言在**Idea**和**Android**中分别建立**服务端**和**客户端**实现局域网聊天**目录**[toc]**基本实现****问题分析****服务端**Idea:结构预览Server类代码解…

金蝶云星空与马帮平台无缝对接,提高供应链效率

采购退货金蝶》马帮ok:系统对接集成案例分享 在企业的供应链管理中,数据的高效流转和准确处理至关重要。本文将聚焦于一个实际运行的系统对接集成案例——将金蝶云星空的数据集成到马帮平台,以实现采购退货数据的无缝传输和处理。 为了确保…

GPT-4o微调SFT及强化学习DPO数据集构建

假设,已经标注的训练数据集df包含了提示词、输入和输出三列。 构建微调SFT的数据集代码如下: data [] for x in df.values:prompt x[1]user_content x[2]assistant_content x[3]data.append({"messages": [{"role": "sys…

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …