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

Pytorch-LSTM輸入輸出參數(shù)方式

 更新時間:2022年07月11日 14:36:14   作者:奧卡姆的剃刀  
這篇文章主要介紹了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ù)的大小,也就是前面例子中每個單詞向量的長度
  • hidden_size – 隱藏層的大小(即隱藏層節(jié)點數(shù)量),輸出向量的維度等于隱藏節(jié)點數(shù)
  • num_layers – recurrent layer的數(shù)量,默認等于1。
  • bias – If False, then the layer does not use bias weights b_ih and b_hh. Default: True
  • batch_first – 默認為False,也就是說官方不推薦我們把batch放在第一維,這個與之前常見的CNN輸入有點不同,此時輸入輸出的各個維度含義為 (seq_length,batch,feature)。當然如果你想和CNN一樣把batch放在第一維,可將該參數(shù)設置為True,即 (batch,seq_length,feature),習慣上將batch_first 設置為True。
  • dropout – 如果非0,就在除了最后一層的其它層都插入Dropout層,默認為0。
  • bidirectional – 如果設置為 True, 則表示雙向 LSTM,默認為 False

2.輸入數(shù)據(jù)(以batch_first=True,單層單向為例)

假設輸入數(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

備注:先以簡單的num_layers=1和bidirectional=1為例,后面會講到num_layers與bidirectional的LSTM網(wǎng)絡具體構(gòu)造。

下在面代碼的中:

lstm_input是輸入數(shù)據(jù),隱層初始輸入h_init和記憶單元初始輸入c_init的解釋如下:

h_init維度形狀為 (num_layers * num_directions, batch, hidden_size):

  • 第一個參數(shù)的含義num_layers * num_directions, 即LSTM的層數(shù)乘以方向數(shù)量。這個方向數(shù)量是由前面介紹的bidirectional決定,如果為False,則等于1;反之等于2(可以結(jié)合下圖理解num_layers * num_directions的含義)。
  • batch:批數(shù)據(jù)量大小
  • hidden_size: 隱藏層節(jié)點數(shù)

c_init維度形狀也為(num_layers * num_directions, batch, hidden_size),各參數(shù)含義與h_init相同。因為本質(zhì)上,h_init與c_init只是在不同時刻的不同表達而已。

備注:如果沒有傳入,h_init和c_init,根據(jù)源代碼來看,這兩個參數(shù)會默認為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)絡
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ù)   -- 每個batch對應一個隱層
c_init = Variable(torch.randn(1, lstm_input.size(0), hidden_size))  # 構(gòu)建c輸出參數(shù)   -- 每個batch對應一個隱層
out, (h, c) = lstm_seq(lstm_input, (h_init, c_init))  # 將輸入數(shù)據(jù)和初始化隱層、記憶單元信息傳入
 
print(lstm_seq.weight_ih_l0.shape) # 對應的輸入學習參數(shù)
print(lstm_seq.weight_hh_l0.shape) # 對應的隱層學習參數(shù)
print(out.shape, h.shape, c.shape)

輸出結(jié)果如下:

輸出結(jié)果解釋如下:

(1)lstm_seq.weight_ih_l0.shape的結(jié)果為:torch.Size([16, 28]),表示對應的輸入到隱層的學習參數(shù):(4*hidden_size, input_size)。

(2)lstm_seq.weight_hh_l0.shape的結(jié)果為:torch.Size([16, 4]),表示對應的隱層到隱層的學習參數(shù):(4*hidden_size, num_directions * hidden_size) 

(3)out.shape的輸出結(jié)果:torch.Size([10,3, 4]),表示隱層到輸出層學習參數(shù),即(batch,time_steps, num_directions * hidden_size),維度和輸入數(shù)據(jù)類似,會根據(jù)batch_first是否為True進行對應的輸出結(jié)果,(如果代碼中,batch_first=False,則out.shape的結(jié)果會變?yōu)椋簍orch.Size([3, 10, 4])),

這個輸出tensor包含了LSTM模型最后一層每個time_step的輸出特征,比如說LSTM有兩層,那么最后輸出的是,表示第二層LSTM每個time step對應的輸出;另外如果前面對輸入數(shù)據(jù)使用了torch.nn.utils.rnn.PackedSequence,那么輸出也會做同樣的操作編程packed sequence;對于unpacked情況,我們可以對輸出做如下處理來對方向作分離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),只會輸出最后一個time step的隱狀態(tài)結(jié)果(如下圖所示)

c.shape的輸出結(jié)果是: torch.Size([1, 10, 4]),表示隱層到輸出層的參數(shù),c_n :(num_layers * num_directions, batch, hidden_size),同樣只會輸出最后一個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)絡
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))  # 計算
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的代碼,但是對于nn.LSTM函數(shù)中的有些參數(shù)還是不明白其具體含義,學習過后在此記錄。

為了方便說明,我們先解釋函數(shù)參數(shù)的作用,接著對應圖片來說明每個參數(shù)的具體含義。

torch.nn.LSTM函數(shù)

LSTM的函數(shù)

class torch.nn.LSTM(args, *kwargs)
	# 主要參數(shù)
	# input_size – 輸入的特征維度
	# hidden_size – 隱狀態(tài)的特征維度
	# num_layers – 層數(shù)(和時序展開要區(qū)分開)
	# bias – 如果為False,那么LSTM將不會使用偏置,默認為True。
	# batch_first – 如果為True,那么輸入和輸出Tensor的形狀為(batch, seq_len, input_size)
	# dropout – 如果非零的話,將會在RNN的輸出上加個dropout,最后一層除外。
	# bidirectional – 如果為True,將會變成一個雙向RNN,默認為False。

LSTM的輸入維度(seq_len, batch, input_size) 如果batch_first為True,則輸入形狀為(batch, seq_len, input_size)

  • seq_len是文本的長度;
  • batch是批次的大小;
  • input_size是每個輸入的特征緯度(一般是每個字/單詞的向量表示;

LSTM的輸出維度(seq_len, batch, hidden_size * num_directions)

  • seq_len是文本的長度;
  • batch是批次的大小;
  • hidden_size是定義的隱藏層長度
  • num_directions指的則是如果是普通LSTM該值為1; Bi-LSTM該值為2

當然,僅僅用文本來說明則讓人感到很懵逼,所以我們使用圖片來說明。

圖解LSTM函數(shù)

我們常見的LSTM的圖示是這樣的:

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

input_size: 圖1中 xi與圖2中綠色節(jié)點對應,而綠色節(jié)點的長度等于input_size(一般是每個字/單詞的向量表示)。

hidden_size: 圖2中黃色節(jié)點的數(shù)量

num_layers: 圖2中黃色節(jié)點的層數(shù)(該圖為1)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論