欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch實(shí)現(xiàn)LSTM和GRU示例

 更新時(shí)間:2020年01月14日 10:29:08   作者:winycg  
今天小編就為大家分享一篇Pytorch實(shí)現(xiàn)LSTM和GRU示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

為了解決傳統(tǒng)RNN無(wú)法長(zhǎng)時(shí)依賴問(wèn)題,RNN的兩個(gè)變體LSTM和GRU被引入。

LSTM

Long Short Term Memory,稱為長(zhǎng)短期記憶網(wǎng)絡(luò),意思就是長(zhǎng)的短時(shí)記憶,其解決的仍然是短時(shí)記憶問(wèn)題,這種短時(shí)記憶比較長(zhǎng),能一定程度上解決長(zhǎng)時(shí)依賴。

上圖為L(zhǎng)STM的抽象結(jié)構(gòu),LSTM由3個(gè)門(mén)來(lái)控制,分別是輸入門(mén)、遺忘門(mén)和輸出門(mén)。輸入門(mén)控制網(wǎng)絡(luò)的輸入,遺忘門(mén)控制著記憶單元,輸出門(mén)控制著網(wǎng)絡(luò)的輸出。最為重要的就是遺忘門(mén),可以決定哪些記憶被保留,由于遺忘門(mén)的作用,使得LSTM具有長(zhǎng)時(shí)記憶的功能。對(duì)于給定的任務(wù),遺忘門(mén)能夠自主學(xué)習(xí)保留多少之前的記憶,網(wǎng)絡(luò)能夠自主學(xué)習(xí)。

具體看LSTM單元的內(nèi)部結(jié)構(gòu):

在每篇文章中,作者都會(huì)使用和標(biāo)準(zhǔn)LSTM稍微不同的版本,針對(duì)特定的任務(wù),特定的網(wǎng)絡(luò)結(jié)構(gòu)往往表現(xiàn)更好。

GRU

上述的過(guò)程的線性變換沒(méi)有使用偏置。隱藏狀態(tài)參數(shù)不再是標(biāo)準(zhǔn)RNN的4倍,而是3倍,也就是GRU的參數(shù)要比LSTM的參數(shù)量要少,但是性能差不多。

Pytorch

在Pytorch中使用nn.LSTM()可調(diào)用,參數(shù)和RNN的參數(shù)相同。具體介紹LSTM的輸入和輸出:

輸入: input, (h_0, c_0)

input:輸入數(shù)據(jù)with維度(seq_len,batch,input_size)

h_0:維度為(num_layers*num_directions,batch,hidden_size),在batch中的

初始的隱藏狀態(tài).

c_0:初始的單元狀態(tài),維度與h_0相同

輸出:output, (h_n, c_n)

output:維度為(seq_len, batch, num_directions * hidden_size)。

h_n:最后時(shí)刻的輸出隱藏狀態(tài),維度為 (num_layers * num_directions, batch, hidden_size)

c_n:最后時(shí)刻的輸出單元狀態(tài),維度與h_n相同。

LSTM的變量:

以MNIST分類(lèi)為例實(shí)現(xiàn)LSTM分類(lèi)

MNIST圖片大小為28×28,可以將每張圖片看做是長(zhǎng)為28的序列,序列中每個(gè)元素的特征維度為28。將最后輸出的隱藏狀態(tài) 作為抽象的隱藏特征輸入到全連接層進(jìn)行分類(lèi)。最后輸出的

導(dǎo)入頭文件:

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)
    # 此時(shí)可以從out中獲得最終輸出的狀態(tài)h
    # x = out[:, -1, :]
    x = h_n[-1, :, :]
    x = self.classifier(x)
    return x

訓(xùn)練和測(cè)試代碼:

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)

以上這篇Pytorch實(shí)現(xiàn)LSTM和GRU示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論