NLP 单双向RNN+LSTM+池化
# 单项RNN 从左往右顺序
# 双向RNN
import torch.nn as nn
import torch
# nn.RNN(3,3,1,batch_first=True,bidirectional=True)
# 双向单层RNN(Recurrent Neural Network)是一种特殊类型的循环神经网络,它能够在两个方向上处
# 理序列数据,即正向和反向。这使得网络在预测当前输出时,能够同时考虑到输入序列中当前元素之前
# 的信息和之后的信息。双向单层RNN由两个独立的单层RNN组成,一个负责处理正向序列(从开始到结
# 束),另一个负责处理反向序列(从结束到开始)。
# 每一层RNN由两个RNN构成 一个考虑输入一个考虑输出共同决定本层状态
# . RNN的训练方法——BPTT
# 随时间反向传播
# 本质还是BP算法,只不
# 过RNN处理时间序列数据,所以要基于时间反向传播
# RNN不善于处理远期依赖性任务 比如长句子
# 比较擅长 有序列的短句
# LSTM 长短期记忆网络
# 神经网络中不是单纯的一个层+激活函数了
# 而是多层+多个激活函数互相作用
# 核心是门控机制
# 基于 pytorch API 代码实现
# 在 LSTM 网络中,初始化隐藏状态 ( h0 ) 和细胞状态 ( c0 ) 是一个重要的步骤,确保模型在处理序列数据时有一个合理的起始状态。
def demo1():
class Model(nn.Module):
def __init__(self,input_size,hidden_size,output_size):
super().__init__()
self.output_size=output_size
self.hidden_size=hidden_size
self.lstm=nn.LSTM(input_size=input_size,hidden_size=self.hidden_size,batch_first=True)
self.fc=nn.Linear(hidden_size,output_size)
def forward(self,x):
self.h0=torch.zeros(1,x.shape[0],self.hidden_size)
self.c0=torch.zeros(1,x.shape[0],self.hidden_size)
# lstm 的返回值为 out 和 (hn, cn) 。 out为隐藏状态 hn是最后一次的隐藏状态 cn为最后一次的细胞状态 output batch_first=True,形状为 (batch, seq_len, num_directions * hidden_size)
x,_=self.lstm(x,(self.h0,self.c0))
x=self.fc(x[-1][-1].view(x.shape[0],-1)) # 取最后一次的隐藏状态 当全连接的输出
return x
# 这里的假数据是词向量,不是序列下标 注意一下最后一个维度是input_size
model1=Model(3,16,10)
data=torch.rand(1,2,3)
res=model1(data)
print(res)
# 序列池化
# 在自然语言处理 (NLP) 中,序列池化(sequence pooling)是一种将变长序列转换为固定长度表示的方法。这个过程对于处理可变长度的输入(如句子或文档)特别有用,因为许多深度学习模型(如全连接层)需要固定长度的输入。
# . 最大池化(Max Pooling):
# 一个批次中的每个字变为向量后 全部向量的对应维度 留下最大的那个
# 平均池化就是取平均值 nn.AdaptiveAvgPool1d
#
if __name__=="__main__":
demo1()
pass