一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Pytorch實現LSTM和GRU示例

Pytorch實現LSTM和GRU示例

2020-04-24 10:32winycg Python

今天小編就為大家分享一篇Pytorch實現LSTM和GRU示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

為了解決傳統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示例 作為抽象的隱藏特征輸入到全連接層進行分類。最后輸出的

導入頭文件:

?
1
2
3
4
5
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
from torchvision import transforms
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

訓練和測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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實現LSTM和GRU示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/winycg/article/details/88937583

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 狠狠的撞进去嗯啊h女强男视频 | 男人的天堂在线观看视频不卡 | 丝袜护士强制脚足取精 | 精品亚洲麻豆1区2区3区 | 韩国甜性涩爱在线播放 | 免费视频完整版在线观看网站 | 国产欧美日韩视频在线观看一区二区 | 国产成人亚洲精品一区二区在线看 | 国产91在线精品狼人 | 色综色天天综合网 | 成人在线视频国产 | 99视频在线看观免费 | 精品一区二区三区视频日产 | 日本精a在线观看 | 国产成人精品免费视频大全五级 | 1024国产基地永久免费 | 亚洲高清在线精品一区 | 大陆男男gayxxxxvideo | 国产免费美女视频 | 2019年国产不卡在线刷新 | 国产精品久久久久这里只有精品 | 秀逼逼| 亚洲欧美日韩精品久久亚洲区 | 久久中文电影 | 极品美女aⅴ高清在线观看 极品ts赵恩静和直男激战啪啪 | 无套日出白浆在线播放 | 干露露视频 性感写真 | 97精品国产自在现线免费观看 | 4虎影视国产在线观看精品 4s4s4s4s色大众影视 | 91.prom在线观看国产 | 国内视频一区二区三区 | 欧美日本一道高清二区三区 | 男人的天堂久久 | 欧洲vodafonewifi日本 | 美女扒开两腿露出尿口的视频 | 加勒比伊人 | 逼毛片| 无人区1免费完整观看 | 国产肥臀| 羞羞视频麻豆 | 息与子中文字幕bd |