<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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中的引數及其含義,解釋如下:
input_size
– 輸入資料的大小,也就是前面例子中每個單詞向量的長度hidden_size
– 隱藏層的大小(即隱藏層節點數量),輸出向量的維度等於隱藏節點數num_layers
– recurrent layer的數量,預設等於1。bias
– If False, then the layer does not use bias weights b_ih and b_hh. Default: Truebatch_first
– 預設為False,也就是說官方不推薦我們把batch放在第一維,這個與之前常見的CNN輸入有點不同,此時輸入輸出的各個維度含義為 (seq_length,batch,feature)。當然如果你想和CNN一樣把batch放在第一維,可將該引數設定為True,即 (batch,seq_length,feature),習慣上將batch_first 設定為True。dropout
– 如果非0,就在除了最後一層的其它層都插入Dropout層,預設為0。bidirectional
– 如果設定為 True, 則表示雙向 LSTM,預設為 False假設輸入資料資訊如下:
nn.lstm中的API輸入引數如下:
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網路具體構造。
下在面程式碼的中:
lstm_input是輸入資料,隱層初始輸入h_init和記憶單元初始輸入c_init的解釋如下:
h_init
:維度形狀為 (num_layers * num_directions, batch, hidden_size):
batch
:批資料量大小hidden_size
: 隱藏層節點數c_init
:維度形狀也為(num_layers * num_directions, batch, hidden_size),各引數含義與h_init相同。因為本質上,h_init與c_init只是在不同時刻的不同表達而已。
備註:如果沒有傳入,h_init和c_init,根據原始碼來看,這兩個引數會預設為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) # 構建LSTM網路 lstm_input = Variable(torch.randn(10, 3, 28)) # 構建輸入 h_init = Variable(torch.randn(1, lstm_input.size(0), hidden_size)) # 構建h輸入引數 -- 每個batch對應一個隱層 c_init = Variable(torch.randn(1, lstm_input.size(0), hidden_size)) # 構建c輸出引數 -- 每個batch對應一個隱層 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)
輸出結果如下:
輸出結果解釋如下:
(1)lstm_seq.weight_ih_l0.shape的結果為:torch.Size([16, 28]),表示對應的輸入到隱層的學習引數:(4*hidden_size, input_size)。
(2)lstm_seq.weight_hh_l0.shape的結果為:torch.Size([16, 4]),表示對應的隱層到隱層的學習引數:(4*hidden_size, num_directions * hidden_size)
(3)out.shape的輸出結果:torch.Size([10,3, 4]),表示隱層到輸出層學習引數,即(batch,time_steps, num_directions * hidden_size),維度和輸入資料類似,會根據batch_first是否為True進行對應的輸出結果,(如果程式碼中,batch_first=False,則out.shape的結果會變為:torch.Size([3, 10, 4])),
這個輸出tensor包含了LSTM模型最後一層每個time_step的輸出特徵,比如說LSTM有兩層,那麼最後輸出的是,表示第二層LSTM每個time step對應的輸出;另外如果前面對輸入資料使用了torch.nn.utils.rnn.PackedSequence,那麼輸出也會做同樣的操作程式設計packed sequence;對於unpacked情況,我們可以對輸出做如下處理來對方向作分離output.view(seq_len, batch, num_directions, hidden_size), 其中前向和後向分別用0和1表示。
h.shape輸出結果是: torch.Size([1, 10, 4]),表示隱層到輸出層的引數,h_n:(num_layers * num_directions, batch, hidden_size),只會輸出最後一個time step的隱狀態結果(如下圖所示)
c.shape的輸出結果是: torch.Size([1, 10, 4]),表示隱層到輸出層的引數,c_n :(num_layers * num_directions, batch, hidden_size),同樣只會輸出最後一個time step的cell狀態結果(如下圖所示)
''' 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) # 構建LSTM網路 lstm_input = Variable(torch.randn(10, 3, 28)) # 構建輸入 h_init = Variable(torch.randn(num_layers*bidirectional, lstm_input.size(0), hidden_size)) # 構建h輸入引數 c_init = Variable(torch.randn(num_layers*bidirectional, lstm_input.size(0), hidden_size)) # 構建c輸出引數 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)
輸出結果如下:
最近在寫有關LSTM的程式碼,但是對於nn.LSTM函數中的有些引數還是不明白其具體含義,學習過後在此記錄。
為了方便說明,我們先解釋函數引數的作用,接著對應圖片來說明每個引數的具體含義。
LSTM的函數
class torch.nn.LSTM(args, *kwargs) # 主要引數 # input_size – 輸入的特徵維度 # hidden_size – 隱狀態的特徵維度 # num_layers – 層數(和時序展開要區分開) # 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的圖示是這樣的:
但是這張圖很具有迷惑性,讓我們不易理解LSTM各個引數的意義。具體將上圖中每個單元展開則為下圖所示:
input_size
: 圖1中 xi與圖2中綠色節點對應,而綠色節點的長度等於input_size(一般是每個字/單詞的向量表示)。
hidden_size
: 圖2中黃色節點的數量
num_layers
: 圖2中黃色節點的層數(該圖為1)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45