Pytorch intermediate(三) RNN分类

这篇具有很好参考价值的文章主要介绍了Pytorch intermediate(三) RNN分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用RNN对MNIST手写数字进行分类。RNN和LSTM模型结构

pytorch中的LSTM的使用让人有点头晕,这里讲述的是LSTM的模型参数的意义。


1、加载数据集

import torch 
import torchvision
import torch.nn as nn
import torchvision.transforms as transforms
import torch.utils.data as Data 

device  = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

sequence_length = 28 
input_size = 28 
hidden_size = 128 
num_layers = 2 
num_classes = 10 
batch_size = 128 
num_epochs = 2 
learning_rate = 0.01 

train_dataset = torchvision.datasets.MNIST(root='./data/',train=True,transform=transforms.ToTensor(),download=True)
test_dataset = torchvision.datasets.MNIST(root='./data/',train=False,transform=transforms.ToTensor())

train_loader = Data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
test_loader = Data.DataLoader(dataset=test_dataset,batch_size=batch_size)

 2、构建RNN模型

  • input_size – 输入的特征维度

  • hidden_size – 隐状态的特征维度

  • num_layers – 层数(和时序展开要区分开)

  • bias – 如果为False,那么LSTM将不会使用,默认为True

  • batch_first – 如果为True,那么输入和输出Tensor的形状为(batch, seq, feature)

  • dropout – 如果非零的话,将会在RNN的输出上加个dropout,最后一层除外。

  • bidirectional – 如果为True,将会变成一个双向RNN,默认为False

       1、上面的参数来自于文档,最基本的参数是input_size, hidden_size, num_layer三个。input_size:输入数据向量维度,在这里为28;hidden_size:隐藏层特征维度,也是输出的特征维度,这里是128;num_layers:lstm模块个数,这里是2。

       2、h0和c0的初始化维度为(num_layer,batch_size, hidden_size

       3、lstm的输出有out和(hn,cn),其中out.shape = torch.Size([128, 28, 128]),对应(batch_size,时序数,隐藏特征维度),也就是保存了28个时序的输出特征,因为做的分类,所以只需要最后的输出特征。所以取出最后的输出特征,进行全连接计算,全连接计算的输出维度为10(10分类)。

       4、batch_first这个参数比较特殊:如果为true,那么输入数据的维度为(batch, seq, feature),否则为(seq, batch, feature)

       5、num_layers:lstm模块个数,如果有两个,那么第一个模块的输出会变成第二个模块的输入。

       总结:构建一个LSTM模型要用到的参数,(输入数据的特征维度,隐藏层的特征维度,lstm模块个数);时序的个数体现在X中, X.shape = (batch_size,  时序长度, 数据向量维度)。

       可以理解为LSTM可以根据我们的输入来实现自动的时序匹配,从而达到输入长短不同的功能。

class RNN(nn.Module):
    def __init__(self, input_size,hidden_size,num_layers, num_classes):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        #input_size - 输入特征维度
        #hidden_size - 隐藏状态特征维度
        #num_layers - 层数(和时序展开要区分开),lstm模块的个数
        #batch_first为true,输入和输出的形状为(batch, seq, feature),true意为将batch_size放在第一维度,否则放在第二维度
        self.lstm = nn.LSTM(input_size,hidden_size,num_layers,batch_first = True)  
        self.fc = nn.Linear(hidden_size, num_classes)
        
    def forward(self,x):
        #参数:LSTM单元个数, batch_size, 隐藏层单元个数 
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)   #h0.shape = (2, 128, 128)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)
         
        #输出output :  (seq_len, batch, hidden_size * num_directions)
        #(h_n, c_n):最后一个时间步的隐藏状态和细胞状态
        #对out的理解:维度batch, eq_len, hidden_size,其中保存着每个时序对应的输出,所以全连接部分只取最后一个时序的
        #out第一维batch_size,第二维时序的个数,第三维隐藏层个数,所以和lstm单元的个数是无关的
        out,_ = self.lstm(x, (h0, c0))  #shape = torch.Size([128, 28, 128])
        out = self.fc(out[:,-1,:])  #因为batch_first = true,所以维度顺序batch, eq_len, hidden_size
        return out

 训练部分文章来源地址https://www.toymoban.com/news/detail-707813.html

model = RNN(input_size,hidden_size, num_layers, num_classes).to(device)
print(model)

#RNN(
#  (lstm): LSTM(28, 128, num_layers=2, batch_first=True)
#  (fc): Linear(in_features=128, out_features=10, bias=True)
#)

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

total_step = len(train_loader)
for epoch in range(num_epochs):
    for i,(images, labels) in enumerate(train_loader):
        #batch_size = -1, 序列长度 = 28, 数据向量维度 = 28
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        
        # Forward pass
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # Backward and optimize
        optimizer.zero_grad()
        loss.backward() 
        optimizer.step()
        
        if (i+1) % 100 == 0:
            print(outputs.shape)
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# Test the model
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        images = images.reshape(-1, sequence_length, input_size).to(device)
        labels = labels.to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print('Test Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total)) 

到了这里,关于Pytorch intermediate(三) RNN分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Deep Learning With Pytorch - 最基本的感知机、贯序模型/分类、拟合

    Step1. 感知机,多层感知机(MLP)的基本结构 感知机(Perceptron)是神经网络中的基本单元,神经网络的雏形,也被称作神经元(原理就是仿照生物上的神经元)、单层神经网络。 通过设置不同的权重,并加上一个激活函数(判决门限),就构成了一个单层感知机的基本网络结

    2024年02月12日
    浏览(49)
  • pytorch笔记:RNN 系列

    来自B站视频,API查阅,TORCH.NN RNN可以处理变长序列,是因为其每个时刻的参数是共享的 RNN每算出一个时刻都可以输出,适合流式输出,但串行计算比较慢,无法获取太长的历史信息 RNN 初始隐状态不提供默认是0,输出包括两部分:所有时刻的输出 (batch_size,seq_len,out_hidden_si

    2024年02月11日
    浏览(53)
  • pytorch笔记:RNN

    来自B站视频,API查阅,TORCH.NN RNN可以处理变长序列,是因为其每个时刻的参数是共享的 RNN每算出一个时刻都可以输出,适合流式输出,但串行计算比较慢,无法获取太长的历史信息 RNN 初始隐状态不提供默认是0,输出包括两部分:所有时刻的输出 (batch_size,seq_len,out_hidden_si

    2024年02月09日
    浏览(32)
  • pytorch 实现rnn

    rnn实现预测字符

    2024年02月12日
    浏览(35)
  • [PyTorch][chapter 44][RNN]

    简介             循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) [1]  。             对循环神经网络的研究始于二十世纪80-

    2024年02月15日
    浏览(36)
  • PyTorch RNN的原理及其手写复现。

    先给出代码的实现(包括官方API和手动实现)然后逐步介绍RNN的优缺点,应用场景等。 在看代码之前有必要了解输入输出有哪些,以及他们的特性。 官方教程在: https://pytorch.org/docs/stable/generated/torch.nn.RNN.html#torch.nn.RNN 参数:(实例化时候可以传入的参数) input_size - 输入

    2024年02月08日
    浏览(27)
  • Pytorch的CNN,RNN&LSTM

    拿二维卷积举例,我们先来看参数 卷积的基本原理,默认你已经知道了,然后我们来解释pytorch的各个参数,以及其背后的计算过程。 首先我们先来看卷积过后图片的形状的计算: 参数: kernel_size :卷积核的大小,可以是一个元组,也就是(行大小,列大小) stride : 移动步长

    2024年02月04日
    浏览(52)
  • [PyTorch][chapter 45][RNN_2]

    目录:     RNN 问题     RNN 时序链问题     RNN 词组预测的例子      RNN简洁实现   一  RNN 问题      RNN 主要有两个问题,梯度弥散和梯度爆炸     1.1  损失函数                                                            梯度                              其

    2024年02月15日
    浏览(46)
  • pytorch笔记:PackedSequence对象送入RNN

    pytorch 笔记:PAD_PACKED_SEQUENCE 和PACK_PADDED_SEQUENCE-CSDN博客  当使用 pack_padded_sequence 得到一个 PackedSequence 对象并将其送入RNN(如LSTM或GRU)时,RNN内部会进行特定的操作来处理这种特殊的输入形式。 使用 PackedSequence 的主要好处是 提高效率和计算速度 。因为通过跳过填充部分,

    2024年02月06日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包