Pytorch-LSTM輸入輸出參數(shù)方式
1.Pytorch中的LSTM中輸入輸出參數(shù)
nn.lstm是繼承nn.RNNBase,初始化的定義如下:
class RNNBase(Module):
...
def __init__(self, mode, input_size, hidden_size,
num_layers=1, bias=True, batch_first=False,
dropout=0., bidirectional=False):以下是Pytorch中的參數(shù)及其含義,解釋如下:
input_size– 輸入數(shù)據(jù)的大小,也就是前面例子中每個(gè)單詞向量的長(zhǎng)度hidden_size– 隱藏層的大?。措[藏層節(jié)點(diǎn)數(shù)量),輸出向量的維度等于隱藏節(jié)點(diǎn)數(shù)num_layers– recurrent layer的數(shù)量,默認(rèn)等于1。bias– If False, then the layer does not use bias weights b_ih and b_hh. Default: Truebatch_first– 默認(rèn)為False,也就是說官方不推薦我們把batch放在第一維,這個(gè)與之前常見的CNN輸入有點(diǎn)不同,此時(shí)輸入輸出的各個(gè)維度含義為 (seq_length,batch,feature)。當(dāng)然如果你想和CNN一樣把batch放在第一維,可將該參數(shù)設(shè)置為True,即 (batch,seq_length,feature),習(xí)慣上將batch_first 設(shè)置為True。dropout– 如果非0,就在除了最后一層的其它層都插入Dropout層,默認(rèn)為0。bidirectional– 如果設(shè)置為 True, 則表示雙向 LSTM,默認(rèn)為 False
2.輸入數(shù)據(jù)(以batch_first=True,單層單向?yàn)槔?/h2>
假設(shè)輸入數(shù)據(jù)信息如下:
- 輸入維度 = 28
nn.lstm中的API輸入?yún)?shù)如下:
time_steps= 3 batch_first = True batch_size = 10 hidden_size =4 num_layers = 1 bidirectional = False
備注:先以簡(jiǎn)單的num_layers=1和bidirectional=1為例,后面會(huì)講到num_layers與bidirectional的LSTM網(wǎng)絡(luò)具體構(gòu)造。
下在面代碼的中:
lstm_input是輸入數(shù)據(jù),隱層初始輸入h_init和記憶單元初始輸入c_init的解釋如下:
h_init:維度形狀為 (num_layers * num_directions, batch, hidden_size):
- 第一個(gè)參數(shù)的含義num_layers * num_directions, 即LSTM的層數(shù)乘以方向數(shù)量。這個(gè)方向數(shù)量是由前面介紹的bidirectional決定,如果為False,則等于1;反之等于2(可以結(jié)合下圖理解num_layers * num_directions的含義)。
batch:批數(shù)據(jù)量大小hidden_size: 隱藏層節(jié)點(diǎn)數(shù)
c_init:維度形狀也為(num_layers * num_directions, batch, hidden_size),各參數(shù)含義與h_init相同。因?yàn)楸举|(zhì)上,h_init與c_init只是在不同時(shí)刻的不同表達(dá)而已。
備注:如果沒有傳入,h_init和c_init,根據(jù)源代碼來(lái)看,這兩個(gè)參數(shù)會(huì)默認(rèn)為0。
import torch from torch.autograd import Variable from torch import nn input_size = 28 hidden_size = 4 lstm_seq = nn.LSTM(input_size, hidden_size, num_layers=1,batch_first=True) # 構(gòu)建LSTM網(wǎng)絡(luò) lstm_input = Variable(torch.randn(10, 3, 28)) # 構(gòu)建輸入 h_init = Variable(torch.randn(1, lstm_input.size(0), hidden_size)) # 構(gòu)建h輸入?yún)?shù) -- 每個(gè)batch對(duì)應(yīng)一個(gè)隱層 c_init = Variable(torch.randn(1, lstm_input.size(0), hidden_size)) # 構(gòu)建c輸出參數(shù) -- 每個(gè)batch對(duì)應(yīng)一個(gè)隱層 out, (h, c) = lstm_seq(lstm_input, (h_init, c_init)) # 將輸入數(shù)據(jù)和初始化隱層、記憶單元信息傳入 print(lstm_seq.weight_ih_l0.shape) # 對(duì)應(yīng)的輸入學(xué)習(xí)參數(shù) print(lstm_seq.weight_hh_l0.shape) # 對(duì)應(yīng)的隱層學(xué)習(xí)參數(shù) print(out.shape, h.shape, c.shape)
輸出結(jié)果如下:

輸出結(jié)果解釋如下:
(1)lstm_seq.weight_ih_l0.shape的結(jié)果為:torch.Size([16, 28]),表示對(duì)應(yīng)的輸入到隱層的學(xué)習(xí)參數(shù):(4*hidden_size, input_size)。
(2)lstm_seq.weight_hh_l0.shape的結(jié)果為:torch.Size([16, 4]),表示對(duì)應(yīng)的隱層到隱層的學(xué)習(xí)參數(shù):(4*hidden_size, num_directions * hidden_size)
(3)out.shape的輸出結(jié)果:torch.Size([10,3, 4]),表示隱層到輸出層學(xué)習(xí)參數(shù),即(batch,time_steps, num_directions * hidden_size),維度和輸入數(shù)據(jù)類似,會(huì)根據(jù)batch_first是否為True進(jìn)行對(duì)應(yīng)的輸出結(jié)果,(如果代碼中,batch_first=False,則out.shape的結(jié)果會(huì)變?yōu)椋簍orch.Size([3, 10, 4])),
這個(gè)輸出tensor包含了LSTM模型最后一層每個(gè)time_step的輸出特征,比如說LSTM有兩層,那么最后輸出的是
,表示第二層LSTM每個(gè)time step對(duì)應(yīng)的輸出;另外如果前面對(duì)輸入數(shù)據(jù)使用了torch.nn.utils.rnn.PackedSequence,那么輸出也會(huì)做同樣的操作編程packed sequence;對(duì)于unpacked情況,我們可以對(duì)輸出做如下處理來(lái)對(duì)方向作分離output.view(seq_len, batch, num_directions, hidden_size), 其中前向和后向分別用0和1表示。
h.shape輸出結(jié)果是: torch.Size([1, 10, 4]),表示隱層到輸出層的參數(shù),h_n:(num_layers * num_directions, batch, hidden_size),只會(huì)輸出最后一個(gè)time step的隱狀態(tài)結(jié)果(如下圖所示)
c.shape的輸出結(jié)果是: torch.Size([1, 10, 4]),表示隱層到輸出層的參數(shù),c_n :(num_layers * num_directions, batch, hidden_size),同樣只會(huì)輸出最后一個(gè)time step的cell狀態(tài)結(jié)果(如下圖所示)

3.輸入數(shù)據(jù)(以batch_first=True,雙層雙向)
'''
batch_first = True : 輸入形式:(batch, seq, feature)
bidirectional = True
num_layers = 2
'''
num_layers = 2
bidirectional_set = True
bidirectional = 2 if bidirectional_set else 1
input_size = 28
hidden_size = 4
lstm_seq = nn.LSTM(input_size, hidden_size, num_layers=num_layers,bidirectional=bidirectional_set,batch_first=True) # 構(gòu)建LSTM網(wǎng)絡(luò)
lstm_input = Variable(torch.randn(10, 3, 28)) # 構(gòu)建輸入
h_init = Variable(torch.randn(num_layers*bidirectional, lstm_input.size(0), hidden_size)) # 構(gòu)建h輸入?yún)?shù)
c_init = Variable(torch.randn(num_layers*bidirectional, lstm_input.size(0), hidden_size)) # 構(gòu)建c輸出參數(shù)
out, (h, c) = lstm_seq(lstm_input, (h_init, c_init)) # 計(jì)算
print(lstm_seq.weight_ih_l0.shape)
print(lstm_seq.weight_hh_l0.shape)
print(out.shape, h.shape, c.shape)輸出結(jié)果如下:

Pytorch-LSTM函數(shù)參數(shù)解釋 圖解
最近在寫有關(guān)LSTM的代碼,但是對(duì)于nn.LSTM函數(shù)中的有些參數(shù)還是不明白其具體含義,學(xué)習(xí)過后在此記錄。
為了方便說明,我們先解釋函數(shù)參數(shù)的作用,接著對(duì)應(yīng)圖片來(lái)說明每個(gè)參數(shù)的具體含義。
torch.nn.LSTM函數(shù)
LSTM的函數(shù)
class torch.nn.LSTM(args, *kwargs) # 主要參數(shù) # input_size – 輸入的特征維度 # hidden_size – 隱狀態(tài)的特征維度 # num_layers – 層數(shù)(和時(shí)序展開要區(qū)分開) # bias – 如果為False,那么LSTM將不會(huì)使用偏置,默認(rèn)為True。 # batch_first – 如果為True,那么輸入和輸出Tensor的形狀為(batch, seq_len, input_size) # dropout – 如果非零的話,將會(huì)在RNN的輸出上加個(gè)dropout,最后一層除外。 # bidirectional – 如果為True,將會(huì)變成一個(gè)雙向RNN,默認(rèn)為False。
LSTM的輸入維度為 (seq_len, batch, input_size) 如果batch_first為True,則輸入形狀為(batch, seq_len, input_size)
seq_len是文本的長(zhǎng)度;batch是批次的大小;input_size是每個(gè)輸入的特征緯度(一般是每個(gè)字/單詞的向量表示;
LSTM的輸出維度為 (seq_len, batch, hidden_size * num_directions)
seq_len是文本的長(zhǎng)度;batch是批次的大小;hidden_size是定義的隱藏層長(zhǎng)度num_directions指的則是如果是普通LSTM該值為1; Bi-LSTM該值為2
當(dāng)然,僅僅用文本來(lái)說明則讓人感到很懵逼,所以我們使用圖片來(lái)說明。
圖解LSTM函數(shù)
我們常見的LSTM的圖示是這樣的:

但是這張圖很具有迷惑性,讓我們不易理解LSTM各個(gè)參數(shù)的意義。具體將上圖中每個(gè)單元展開則為下圖所示:

input_size: 圖1中 xi與圖2中綠色節(jié)點(diǎn)對(duì)應(yīng),而綠色節(jié)點(diǎn)的長(zhǎng)度等于input_size(一般是每個(gè)字/單詞的向量表示)。
hidden_size: 圖2中黃色節(jié)點(diǎn)的數(shù)量
num_layers: 圖2中黃色節(jié)點(diǎn)的層數(shù)(該圖為1)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python關(guān)于excel多個(gè)sheet的導(dǎo)入導(dǎo)出方式
這篇文章主要介紹了python關(guān)于excel多個(gè)sheet的導(dǎo)入導(dǎo)出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié)
plt.boxplot函數(shù)用于繪制箱線圖,本文介紹了Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法
這篇文章主要介紹了3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法,文章圍繞Python的相關(guān)資料展開對(duì)實(shí)現(xiàn)進(jìn)度條的介紹,需要的小伙伴可以參考一下2022-04-04
Python實(shí)現(xiàn)字典序列ChainMap
容器數(shù)據(jù)類型包括數(shù)組list,字典dict以及元組tuple等。本篇主要介紹了ChainMap字典序列的使用,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理基本操作電影影評(píng)分析
本文是Python機(jī)器學(xué)習(xí)NLP自然語(yǔ)言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語(yǔ)言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語(yǔ)言處理基本操電影影評(píng)分析2021-09-09
python刪除文件夾中具有相同后綴類型文件的實(shí)戰(zhàn)演練
在平時(shí)卸載軟件的時(shí)候會(huì)殘留許多文件和空文件夾,下面這篇文章主要給大家介紹了關(guān)于python刪除文件夾中具有相同后綴類型文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法
這篇文章主要介紹了Python發(fā)起請(qǐng)求提示UnicodeEncodeError錯(cuò)誤代碼解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
pytorch模型轉(zhuǎn)換為onnx可視化(使用netron)
netron 是一個(gè)非常好用的網(wǎng)絡(luò)結(jié)構(gòu)可視化工具,但是netron對(duì)pytorch模型的支持還不成熟,這篇文章主要介紹了pytorch模型轉(zhuǎn)換為onnx,并使用netron可視化,需要的朋友可以參考下2023-05-05
Python使用pandas導(dǎo)入xlsx格式的excel文件內(nèi)容操作代碼
這篇文章主要介紹了Python使用pandas導(dǎo)入xlsx格式的excel文件內(nèi)容,基本導(dǎo)入是在Python中使用pandas導(dǎo)入.xlsx文件的方法是read_excel(),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12

