跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

循环神经网络(RNN)与 LSTM 文本分类实战

循环神经网络利用隐藏状态处理序列数据的上下文依赖,解决传统神经网络无法捕捉时序关系的问题。 RNN 计算原理,重点讲解 LSTM 的门控机制及其在长序列中的优势。实战部分基于 TensorFlow/Keras 搭建 LSTM 模型,使用 IMDB 数据集完成情感分类,涵盖数据预处理、模型构建、训练优化及双向 LSTM 等进阶技巧。

战神发布于 2026/3/27更新于 2026/7/2536 浏览
循环神经网络(RNN)与 LSTM 文本分类实战

循环神经网络与序列数据处理实战

传统前馈神经网络在处理序列数据时存在局限,无法捕捉上下文关联。循环神经网络(RNN)通过引入隐藏状态存储历史信息,有效解决了这一问题。本文将深入探讨 RNN 原理、经典变体 LSTM 及 GRU,并通过 TensorFlow/Keras 完成基于 IMDB 数据集的文本分类实战。

为什么需要 RNN

自然语言、语音和时间序列等数据具有强烈的时序依赖。当前时刻的信息往往与之前时刻紧密相关。RNN 的核心在于其循环结构,每个时间步不仅接收当前输入,还结合上一时刻的隐藏状态进行计算。

RNN 的计算机制

RNN 在每一个时间步 $t$ 执行以下操作:

  1. 初始化隐藏状态 $h_0$,通常设为全零向量。
  2. 计算当前隐藏状态:$h_t = \tanh(W_{xh}x_t + W_{hh}h_{t-1} + b_h)$。
  3. 根据隐藏状态生成输出:$y_t = W_{hy}h_t + b_y$。

需要注意的是,基础 RNN 在长序列训练中容易出现梯度消失或爆炸问题,难以捕捉长距离依赖。因此,实际应用中更多采用改进型结构。

import tensorflow as tf
from tensorflow.keras.layers import SimpleRNN

# 定义基础 RNN 层
# units: 隐藏状态维度,return_sequences: 是否返回所有时间步输出
rnn_layer = SimpleRNN(units=64, return_sequences=True, input_shape=(10, 20))

# 模拟输入:批次大小 32,序列长度 10,特征维度 20
input_seq = tf.random.normal(shape=(32, 10, 20))

# 执行 RNN 计算
output_seq = rnn_layer(input_seq)
print("RNN 输出形状:", output_seq.shape)
# 输出形状 (32, 10, 64)

长短期记忆网络(LSTM)

为了解决梯度问题,LSTM 引入了门控机制,包括遗忘门、输入门和输出门,配合细胞状态实现信息的选择性记忆。

LSTM 的门控机制
  • 遗忘门:决定丢弃哪些旧信息,输出 0~1 之间的值。
  • 输入门:筛选新信息并更新细胞状态。
  • 输出门:控制当前细胞状态中哪些信息作为隐藏状态输出。
from tensorflow.keras.layers import LSTM

# 定义 LSTM 层
lstm_layer = LSTM(units=128, return_sequences=False, return_state=True, input_shape=(10, ))


output, final_hidden_state, final_cell_state = lstm_layer(input_seq)
(, output.shape)

20
# 执行计算
print
"LSTM 输出形状:"
# 输出形状 (32, 128)

实战:基于 LSTM 的文本分类

本次实战使用 IMDB 电影评论数据集进行情感分析。

数据准备

加载数据集,限制词汇表大小为 10000,统一序列长度为 200。超出截断,不足补零。

from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences

vocab_size = 10000
max_seq_len = 200

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=vocab_size)

# 序列填充与截断
x_train = pad_sequences(x_train, maxlen=max_seq_len, padding="post", truncating="post")
x_test = pad_sequences(x_test, maxlen=max_seq_len, padding="post", truncating="post")

print("训练集形状:", x_train.shape)
# (25000, 200)
模型搭建

模型包含嵌入层、LSTM 层和全连接层。嵌入层将词索引转为稠密向量,LSTM 捕捉上下文,全连接层输出概率。

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Embedding, Dense

embedding_dim = 128
model = Sequential([
    Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=max_seq_len),
    LSTM(units=128, dropout=0.2, recurrent_dropout=0.2),
    Dense(units=1, activation="sigmoid")
])

model.summary()
编译与训练

使用 Adam 优化器和二分类交叉熵损失函数。设置早停回调防止过拟合。

from tensorflow.keras.callbacks import EarlyStopping

# 编译模型
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])

# 定义早停策略
early_stopping = EarlyStopping(monitor="val_loss", patience=2, restore_best_weights=True)

# 训练模型
batch_size = 64
epochs = 5
history = model.fit(
    x_train, y_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_split=0.1,
    callbacks=[early_stopping]
)

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"测试集准确率:{test_acc:.4f}")
优化技巧

除了基础结构,还可以尝试双向 LSTM 同时捕捉前后文依赖,或使用预训练词向量提升特征表示能力。

from tensorflow.keras.layers import Bidirectional

# 替换为双向 LSTM
Bidirectional(LSTM(units=128, dropout=0.2, recurrent_dropout=0.2))

门控循环单元(GRU)

GRU 是 LSTM 的简化版,合并了遗忘门和输入门,取消了细胞状态。参数量更少,训练速度更快,在许多场景下效果相当。

from tensorflow.keras.layers import GRU

gru_layer = GRU(units=128, return_sequences=True, input_shape=(10, 20))
gru_output = gru_layer(input_seq)
print("GRU 输出形状:", gru_output.shape)

总结

RNN 通过隐藏状态处理序列数据的上下文依赖。LSTM 通过门控机制有效缓解了梯度消失问题。在文本分类任务中,结合嵌入层与 LSTM 能取得良好效果,配合双向结构和早停法可进一步优化性能。

目录

  1. 循环神经网络与序列数据处理实战
  2. 为什么需要 RNN
  3. RNN 的计算机制
  4. 定义基础 RNN 层
  5. units: 隐藏状态维度,return_sequences: 是否返回所有时间步输出
  6. 模拟输入:批次大小 32,序列长度 10,特征维度 20
  7. 执行 RNN 计算
  8. 输出形状 (32, 10, 64)
  9. 长短期记忆网络(LSTM)
  10. LSTM 的门控机制
  11. 定义 LSTM 层
  12. 执行计算
  13. 输出形状 (32, 128)
  14. 实战:基于 LSTM 的文本分类
  15. 数据准备
  16. 序列填充与截断
  17. (25000, 200)
  18. 模型搭建
  19. 编译与训练
  20. 编译模型
  21. 定义早停策略
  22. 训练模型
  23. 优化技巧
  24. 替换为双向 LSTM
  25. 门控循环单元(GRU)
  26. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Flutter tflite_web 在 OpenHarmony 下的 AI 推理适配与 WebGL 加速实践
  • Stable Diffusion 小清新真人模型 V4.5 使用指南
  • Aspen 15.0 升级亮点:AI 建模与绿氢适配的流程模拟功能解析
  • FANUC 机器人机架号与插槽号配置指南
  • Spring MVC 入门:从项目创建到参数接收
  • OpenClaw 配置飞书机器人完整指南
  • OpenClaw/MaxClaw/KimiClaw/Molili 四大 AI Agent 横向评测
  • 老旧安卓 4.4 电视开源直播软件适配与优化方案
  • Linux 系统(CentOS/Ubuntu)Docker CE 安装全流程详解
  • GitHub Copilot Plan 模式核心特点与使用场景分析
  • Python 使用 LangChain 集成通义千问构建聊天机器人
  • Llama.cpp Docker 镜像国内加速下载方法
  • 豆包 Seedream 4.0 多图融合实测:主体一致性与生成速度解析
  • Neo4j 安装与使用教程
  • 8 卡 RTX 5090 服务器 llama.cpp 部署与测试指南
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源、玩法与避坑攻略
  • Ubuntu 环境下安装 Steam++ 指南
  • Vitis 安装与 FPGA 开发环境配置实战
  • 在 Cursor 和 Trae 等 AI 编程工具中使用 Skills 的方法
  • 数据结构:快速排序非递归实现、优化及内省排序详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online