【python學習筆記】pytorch中的nn.LSTM


本文參考了:
pytorch中的nn.LSTM模塊參數詳解
人人都能看懂的LSTM
torch.nn.LSTM()函數維度詳解

lstm示意圖

右側為LSTM示意圖

lstm示意圖

torch.nn.lstm(input_size,hidden_size,num_layers,bias,batch_first,dropout,bidirectional)

參數

  • input_size:輸入的維度=embedding_size
  • hidden_size:h的維度
  • num_layers:堆疊LSTM的層數,默認值為1
  • bias:隱層狀態是否帶bias,默認為true。bias是偏置值,或者偏移值。沒有偏置值就是以0為中軸,或以0為起點。
  • batch_first:如果設置為 True,則輸入數據的維度中第一個維度就 是 batch 值,默認為 False。更詳細的在Pytorch的參數“batch_first”的理解
  • dropout:默認值0。是否在除最后一個 RNN 層外的其他 RNN 層后面加 dropout 層。輸入值是 0-1 之間的小數,表示概率。0表示0概率dripout,即不dropout
  • bidirectional:是否雙向傳播,默認值為False

dropout

dropout:dropout顧名思義就是被拿掉的意思,正因為我們在神經網絡當中拿掉了一些神經元,所以才叫做dropout層。為了防止過擬合。

在進行第一個batch的訓練時,有以下步驟:

  • 設定每一個神經網絡層進行dropout的概率

  • 根據相應的概率拿掉一部分的神經元,然后開始訓練,更新沒有被拿掉神經元以及權重的參數,將其保留

  • 參數全部更新之后,又重新根據相應的概率拿掉一部分神經元,然后開始訓練,如果新用於訓練的神經元已經在第一次當中訓練過,那么我們繼續更新它的參數。而第二次被剪掉的神經元,同時第一次已經更新過參數的,我們保留它的權重,不做修改,直到第n次batch進行dropout時沒有將其刪除。

#num_layers

import torch.nn as nn
import torch
x = torch.rand(10,24,100)

#torch.nn.lstm(input_size=100,hidden_size=16,num_layers=2)
#輸入維度100,h維度16,lstm層數2
#以訓練句子為例子,假如每個詞是100維的向量,每個句子含有24個單詞,一次訓練10個句子。
#那么batch_size=10,seq=24,input_size=100。(seq指的是句子的長度,input_size作為一個x_t的輸入) 
lstm = nn.LSTM(100,16,num_layers=2)
output,(h,c) = lstm(x)
print(output.size())
print(h.size())
print(c.size())
torch.Size([10, 24, 16])
torch.Size([2, 24, 16])
torch.Size([2, 24, 16])
#num_layers,bidirectional

import torch.nn as nn
import torch
x = torch.rand(10,24,100)
lstm = nn.LSTM(100,16,bidirectional=True)
output,(h,c) = lstm(x)
print(output.size())
print(h.size())
print(c.size())
torch.Size([10, 24, 32])
torch.Size([2, 24, 16])
torch.Size([2, 24, 16])
import torch.nn as nn
import torch
x = torch.rand(10,24,100) #batch,seq,input_size
h0 = torch.rand(1,24,16)# num_layers*num_directions, batch, hidden_size
c0 = torch.rand(1,24,16)
lstm = nn.LSTM(100,16)
output,(h,c) = lstm(x,(h0,c0))
print(output.size())
print(h.size())
print(c.size())
torch.Size([10, 24, 16])
torch.Size([1, 24, 16])
torch.Size([1, 24, 16])

最后附上參數維度:

解釋一下,第一行是構建lstm時的輸入維度,后邊幾行是lstm用到的參數由輸入維度推出來的維度

如果是雙向num_directions=2,否則num_directions=1

參數 維度1 維度2 維度3
lstm=nn.LSTM input_size hidden_size num_layers
x seq_len batch input_size
h0 num_layers×num_directions batch hidden_size
c0 num_layers×num_directions batch hidden_size
output seq_len batch num_directions×hidden_size
hn num_layers×num_directions batch hidden_size
cn num_layers×num_directions batch hidden_size


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM