Pytorch实现LSTM和GRU示例

作者:winycg 时间:2022-02-08 09:14:44 

为了解决传统RNN无法长时依赖问题,RNN的两个变体LSTM和GRU被引入。

LSTM

Long Short Term Memory,称为长短期记忆网络,意思就是长的短时记忆,其解决的仍然是短时记忆问题,这种短时记忆比较长,能一定程度上解决长时依赖。

Pytorch实现LSTM和GRU示例

上图为LSTM的抽象结构,LSTM由3个门来控制,分别是输入门、遗忘门和输出门。输入门控制网络的输入,遗忘门控制着记忆单元,输出门控制着网络的输出。最为重要的就是遗忘门,可以决定哪些记忆被保留,由于遗忘门的作用,使得LSTM具有长时记忆的功能。对于给定的任务,遗忘门能够自主学习保留多少之前的记忆,网络能够自主学习。

具体看LSTM单元的内部结构:

Pytorch实现LSTM和GRU示例

Pytorch实现LSTM和GRU示例

Pytorch实现LSTM和GRU示例

Pytorch实现LSTM和GRU示例

在每篇文章中,作者都会使用和标准LSTM稍微不同的版本,针对特定的任务,特定的网络结构往往表现更好。

GRU

Pytorch实现LSTM和GRU示例

上述的过程的线性变换没有使用偏置。隐藏状态参数不再是标准RNN的4倍,而是3倍,也就是GRU的参数要比LSTM的参数量要少,但是性能差不多。

Pytorch

在Pytorch中使用nn.LSTM()可调用,参数和RNN的参数相同。具体介绍LSTM的输入和输出:

输入: input, (h_0, c_0)

input:输入数据with维度(seq_len,batch,input_size)

h_0:维度为(num_layers*num_directions,batch,hidden_size),在batch中的

初始的隐藏状态.

c_0:初始的单元状态,维度与h_0相同

输出:output, (h_n, c_n)

output:维度为(seq_len, batch, num_directions * hidden_size)。

h_n:最后时刻的输出隐藏状态,维度为 (num_layers * num_directions, batch, hidden_size)

c_n:最后时刻的输出单元状态,维度与h_n相同。

LSTM的变量:

Pytorch实现LSTM和GRU示例

以MNIST分类为例实现LSTM分类

MNIST图片大小为28×28,可以将每张图片看做是长为28的序列,序列中每个元素的特征维度为28。将最后输出的隐藏状态Pytorch实现LSTM和GRU示例 作为抽象的隐藏特征输入到全连接层进行分类。最后输出的

导入头文件:


import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
from torchvision import transforms

class Rnn(nn.Module):
 def __init__(self, in_dim, hidden_dim, n_layer, n_classes):
   super(Rnn, self).__init__()
   self.n_layer = n_layer
   self.hidden_dim = hidden_dim
   self.lstm = nn.LSTM(in_dim, hidden_dim, n_layer, batch_first=True)
   self.classifier = nn.Linear(hidden_dim, n_classes)

def forward(self, x):
   out, (h_n, c_n) = self.lstm(x)
   # 此时可以从out中获得最终输出的状态h
   # x = out[:, -1, :]
   x = h_n[-1, :, :]
   x = self.classifier(x)
   return x

训练和测试代码:


transform = transforms.Compose([
 transforms.ToTensor(),
 transforms.Normalize([0.5], [0.5]),
])

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True)

testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False)

net = Rnn(28, 10, 2, 10)

net = net.to('cpu')
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9)

# Training
def train(epoch):
 print('\nEpoch: %d' % epoch)
 net.train()
 train_loss = 0
 correct = 0
 total = 0
 for batch_idx, (inputs, targets) in enumerate(trainloader):
   inputs, targets = inputs.to('cpu'), targets.to('cpu')
   optimizer.zero_grad()
   outputs = net(torch.squeeze(inputs, 1))
   loss = criterion(outputs, targets)
   loss.backward()
   optimizer.step()

train_loss += loss.item()
   _, predicted = outputs.max(1)
   total += targets.size(0)
   correct += predicted.eq(targets).sum().item()

print(batch_idx, len(trainloader), 'Loss: %.3f | Acc: %.3f%% (%d/%d)'
     % (train_loss/(batch_idx+1), 100.*correct/total, correct, total))

def test(epoch):
 global best_acc
 net.eval()
 test_loss = 0
 correct = 0
 total = 0
 with torch.no_grad():
   for batch_idx, (inputs, targets) in enumerate(testloader):
     inputs, targets = inputs.to('cpu'), targets.to('cpu')
     outputs = net(torch.squeeze(inputs, 1))
     loss = criterion(outputs, targets)

test_loss += loss.item()
     _, predicted = outputs.max(1)
     total += targets.size(0)
     correct += predicted.eq(targets).sum().item()

print(batch_idx, len(testloader), 'Loss: %.3f | Acc: %.3f%% (%d/%d)'
       % (test_loss/(batch_idx+1), 100.*correct/total, correct, total))

for epoch in range(200):
 train(epoch)
 test(epoch)

来源:https://blog.csdn.net/winycg/article/details/88937583

标签:Pytorch,LSTM,GRU
0
投稿

猜你喜欢

  • Python如何实现FTP功能

    2021-10-22 15:08:25
  • 详解PyQt5 事件处理机制

    2023-04-06 00:09:34
  • Python Series从0开始索引的方法

    2021-07-17 19:20:38
  • VScode中不同目录间python库函数的调用

    2021-03-16 00:24:38
  • python 匿名函数与三元运算学习笔记

    2023-04-01 16:03:48
  • MySQL防止delete命令删除数据的两种方法

    2024-01-13 10:18:41
  • 一文带你学会Python Flask框架设置响应头

    2023-04-16 03:11:37
  • 基于SQL Server中如何比较两个表的各组数据 图解说明

    2024-01-22 06:36:03
  • 番茄的js表单验证类

    2008-01-07 13:53:00
  • Python高级应用实例对比:高效计算大文件中的最长行的长度

    2021-11-26 05:36:35
  • JS实现标签滚动切换效果

    2023-08-24 00:35:37
  • python调用摄像头显示图像的实例

    2021-07-18 20:46:58
  • 浅淡BANNER设计

    2010-09-25 18:37:00
  • JavaScript中document.forms[0]与getElementByName区别

    2024-04-17 09:55:58
  • python调用stitcher类自动实现多个图像拼接融合功能

    2022-11-30 05:11:40
  • Python Socketserver实现FTP文件上传下载代码实例

    2022-10-10 11:03:04
  • python进阶之多线程对同一个全局变量的处理方法

    2023-09-29 19:03:58
  • SqlServer 多种分页方式 详解(含简单速度测试)

    2024-01-15 07:28:04
  • Java访问数据库实例详解

    2024-01-23 00:12:20
  • Python 语句的表达式和缩进

    2023-11-26 18:28:24
  • asp之家 网络编程 m.aspxhome.com