Pytorch之RNN实战

RNN原理

  • 循环神经网络:处理序列模型,权值共享。

    在这里插入图片描述

    h[t] = fw(h[t-1], x[t])	#fw is some function with parameters W
    h[t] = tanh(W[h,h]*h[t-1] + W[x,h]*x[t])    #to be specific
    y[t] = W[h,y]*h[t]
    
  • Sequence to Sequence 模型示意图

    在这里插入图片描述

  • 语言模型示意图

    在这里插入图片描述

RNN实战

  • 3个句子,一个句子10个单词,一个单词100维

    在这里插入图片描述

  • 基础用法

    rnn = nn.RNN(100,10)	#input_size(feature_len)=100,hidden_len = 10
    rnn._parameters.keys()  #how many tensor(4个l0层的w和b)
    
    nn.RNN(input_size,hidden_size, num_layers = 1)
    #h0 : [layer, batchsz, hidden]  x : [seq, batchsz, input ]
    #ht : [layer, batchsz, hidden] out: [seq, batchsz, hidden]
    out, ht = forward(x, h0)
    #对于多层rnn,out不变(所有时间最后mem状态),ht变为[2,~,~](所有层最后时间状态)
    
    cell = nn.RNNcell()	#参数与nn.RNN()相同,但是每个时间戳都要输入xt
    for xt in x:
    	h1 = cell(xt,h1)
        
    #如果你想在输入x时按这个格式:[batchsz, seq_len, input]
    #需要在nn.RNN()中加参数: batch_first = True
    
  • 建一个非常简单的RNN模型(以一个简单时间序列预测为例)

    class Net(nn.Module):
    	def __init__(self,input_size,hidden_size):
            super(net, self).__init__()
            self.rnn = nn.RNN(
                input_size=input_size,
                hidden_size=hidden_size,
                num_layers=1,
                batch_first=True,
            )	
            for p in self.rnn.parameters():#正态分布的权值初始化
                nn.init.normal_(p, mean=0.0, std=0.001)
            self.linear = nn.Linear(hidden_size, output_size)
    	def forward(self,x,h0):
        	out, ht = self.rnn(x, h0)	   #out:[batch_sz,seq,hidden_sz]
           	out = out.view(-1, hidden_size)#out:[seq,hidden_size](b=1)
           	out = self.linear(out)		   #out:[seq,output_size]
           	out = out.unsqueeze(dim=0)	   #out:[1,seq,output_size]
           	return out, ht
    
  • 由于我们在对RNN进行反向传播求梯度的时候,最后的求导项里面有一个 W h h k W_{hh}^{k} Whhk,会导致梯度爆炸或梯度消失。

    # 解决梯度爆炸
    for p in net.parameters():
        torch.nn.utils.clip_grad_norm_(p, 10)	# 保证梯度的绝对值小于10 
    # 解决梯度离散:LSTM
    
  • LSTM:Long Short-Term Memory(结构如下图)

    在这里插入图片描述
    有三个门:分别是遗忘门— f f f,输入门— i i i,输出门— o o o。对于输入输出变量: c t − 1 c_{t-1} ct1</

PyTorch中的RNN (Recurrent Neural Network) 训练实战通常涉及到处理序列数据,比如文本、音频或时间序列预测。以下是一个简单的步骤概述: 1. **导入库**:首先需要导入必要的库,如`torch`, `torch.nn`(用于定义网络结构),以及`torch.optim`(优化器)。 ```python import torch import torch.nn as nn import torch.optim as optim ``` 2. **定义模型**:创建一个LSTM或GRU层作为RNN的基本单元。例如,一个基本的LSTM模型: ```python class RNNModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(RNNModel, self).__init__() self.rnn = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): # x形状为(batch_size, sequence_length, input_size) out, _ = self.rnn(x) out = self.fc(out[:, -1, :]) # 取最后时刻的状态作为输出 return out ``` 3. **准备数据**:将输入序列转换成PyTorch可以接受的张量,并可能对标签做适当的预处理。 4. **实例化模型和优化器**: ```python model = RNNModel(input_size, hidden_size, num_layers, output_size) optimizer = optim.Adam(model.parameters(), lr=learning_rate) criterion = nn.CrossEntropyLoss() # 如果是分类任务 ``` 5. **训练循环**:包含前向传播、损失计算、反向传播和优化器更新步骤: ```python for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 6. **评估**:在验证集上测试模型性能。 7. **保存模型**:训练完成后,你可以保存模型以便于后续使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值