<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          LSTM模型結(jié)構(gòu)的可視化

          共 5791字,需瀏覽 12分鐘

           ·

          2022-04-12 22:21

          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達(dá)


          來自 | 知乎? 作者 | master蘇

          鏈接 | https://zhuanlan.zhihu.com/p/139617364
          最近在學(xué)習(xí)LSTM應(yīng)用在時間序列的預(yù)測上,但是遇到一個很大的問題就是LSTM在傳統(tǒng)BP網(wǎng)絡(luò)上加上時間步后,其結(jié)構(gòu)就很難理解了,同時其輸入輸出數(shù)據(jù)格式也很難理解,網(wǎng)絡(luò)上有很多介紹LSTM結(jié)構(gòu)的文章,但是都不直觀,對初學(xué)者是非常不友好的。我也是苦苦冥思很久,看了很多資料和網(wǎng)友分享的LSTM結(jié)構(gòu)圖形才明白其中的玄機。

          本文內(nèi)容如下:

          1、傳統(tǒng)的BP網(wǎng)絡(luò)和CNN網(wǎng)絡(luò)
          2、LSTM網(wǎng)絡(luò)
          3、LSTM的輸入結(jié)構(gòu)
          4、pytorch中的LSTM
          4.1 pytorch中定義的LSTM模型
          4.2 喂給LSTM的數(shù)據(jù)格式
          4.3 LSTM的output格式
          5、LSTM和其他網(wǎng)絡(luò)組合


          傳統(tǒng)的BP網(wǎng)絡(luò)和CNN網(wǎng)絡(luò)


          BP網(wǎng)絡(luò)和CNN網(wǎng)絡(luò)沒有時間維,和傳統(tǒng)的機器學(xué)習(xí)算法理解起來相差無幾,CNN在處理彩色圖像的3通道時,也可以理解為疊加多層,圖形的三維矩陣當(dāng)做空間的切片即可理解,寫代碼的時候照著圖形一層層疊加即可。如下圖是一個普通的BP網(wǎng)絡(luò)和CNN網(wǎng)絡(luò)。
          BP網(wǎng)絡(luò)
          CNN網(wǎng)絡(luò)
          圖中的隱含層、卷積層、池化層、全連接層等,都是實際存在的,一層層前后疊加,在空間上很好理解,因此在寫代碼的時候,基本就是看圖寫代碼,比如用keras就是:
          # 示例代碼,沒有實際意義model = Sequential()model.add(Conv2D(32, (3, 3), activation='relu'))  # 添加卷積層model.add(MaxPooling2D(pool_size=(2, 2)))         # 添加池化層model.add(Dropout(0.25))                          # 添加dropout層
          model.add(Conv2D(32, (3, 3), activation='relu')) # 添加卷積層model.add(MaxPooling2D(pool_size=(2, 2))) # 添加池化層model.add(Dropout(0.25)) # 添加dropout層
          .... # 添加其他卷積操作
          model.add(Flatten()) # 拉平三維數(shù)組為2維數(shù)組model.add(Dense(256, activation='relu')) 添加普通的全連接層model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))
          .... # 訓(xùn)練網(wǎng)絡(luò)

          LSTM網(wǎng)絡(luò)


          當(dāng)我們在網(wǎng)絡(luò)上搜索看LSTM結(jié)構(gòu)的時候,看最多的是下面這張圖:
          RNN網(wǎng)絡(luò)
          這是RNN循環(huán)神經(jīng)網(wǎng)絡(luò)經(jīng)典的結(jié)構(gòu)圖,LSTM只是對隱含層節(jié)點A做了改進(jìn),整體結(jié)構(gòu)不變,因此本文討論的也是這個結(jié)構(gòu)的可視化問題。
          中間的A節(jié)點隱含層,左邊是表示只有一層隱含層的LSTM網(wǎng)絡(luò),所謂LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)就是在時間軸上的循環(huán)利用,在時間軸上展開后得到右圖。
          看左圖,很多同學(xué)以為LSTM是單輸入、單輸出,只有一個隱含神經(jīng)元的網(wǎng)絡(luò)結(jié)構(gòu),看右圖,以為LSTM是多輸入、多輸出,有多個隱含神經(jīng)元的網(wǎng)絡(luò)結(jié)構(gòu),A的數(shù)量就是隱含層節(jié)點數(shù)量。
          WTH?思維轉(zhuǎn)不過來啊。這就是傳統(tǒng)網(wǎng)絡(luò)和空間結(jié)構(gòu)的思維。
          實際上,右圖中,我們看Xt表示序列,下標(biāo)t是時間軸,所以,A的數(shù)量表示的是時間軸的長度,是同一個神經(jīng)元在不同時刻的狀態(tài)(Ht),不是隱含層神經(jīng)元個數(shù)。
          我們知道,LSTM網(wǎng)絡(luò)在訓(xùn)練時會使用上一時刻的信息,加上本次時刻的輸入信息來共同訓(xùn)練。
          舉個簡單的例子:在第一天我生病了(初始狀態(tài)H0),然后吃藥(利用輸入信息X1訓(xùn)練網(wǎng)絡(luò)),第二天好轉(zhuǎn)但是沒有完全好(H1),再吃藥(X2),病情得到好轉(zhuǎn)(H2),如此循環(huán)往復(fù)知道病情好轉(zhuǎn)。因此,輸入Xt是吃藥,時間軸T是吃多天的藥,隱含層狀態(tài)是病情狀況。因此我還是我,只是不同狀態(tài)的我。
          實際上,LSTM的網(wǎng)絡(luò)是這樣的:
          LSTM網(wǎng)絡(luò)結(jié)構(gòu)
          上面的圖表示包含2個隱含層的LSTM網(wǎng)絡(luò),在T=1時刻看,它是一個普通的BP網(wǎng)絡(luò),在T=2時刻看也是一個普通的BP網(wǎng)絡(luò),只是沿時間軸展開后,T=1訓(xùn)練的隱含層信息H,C會被傳遞到下一個時刻T=2,如下圖所示。上圖中向右的五個常常的箭頭,所的也是隱含層狀態(tài)在時間軸上的傳遞。
          注意,圖中H表示隱藏層狀態(tài),C是遺忘門,后面會講解它們的維度。

          ?LSTM的輸入結(jié)構(gòu)


          為了更好理解LSTM結(jié)構(gòu),還必須理解LSTM的數(shù)據(jù)輸入情況。仿照3通道圖像的樣子,在加上時間軸后的多樣本的多特征的不同時刻的數(shù)據(jù)立方體如下圖所示:
          三維數(shù)據(jù)立方體
          右邊的圖是我們常見模型的輸入,比如XGBOOST,lightGBM,決策樹等模型,輸入的數(shù)據(jù)格式都是這種(N*F)的矩陣,而左邊是加上時間軸后的數(shù)據(jù)立方體,也就是時間軸上的切片,它的維度是(N*T*F),第一維度是樣本數(shù),第二維度是時間,第三維度是特征數(shù),如下圖所示:
          這樣的數(shù)據(jù)立方體很多,比如天氣預(yù)報數(shù)據(jù),把樣本理解成城市,時間軸是日期,特征是天氣相關(guān)的降雨風(fēng)速PM2.5等,這個數(shù)據(jù)立方體就很好理解了。在NLP里面,一句話會被embedding成一個矩陣,詞與詞的順序是時間軸T,索引多個句子的embedding三維矩陣如下圖所示:


          pytorch中的LSTM


          4.1 pytorch中定義的LSTM模型

          pytorch中定義的LSTM模型的參數(shù)如下
          class torch.nn.LSTM(*args, **kwargs)參數(shù)有:    input_sizex的特征維度    hidden_size:隱藏層的特征維度    num_layerslstm隱層的層數(shù),默認(rèn)為1    biasFalsebihbih=0和bhhbhh=0. 默認(rèn)為True    batch_first:True則輸入輸出的數(shù)據(jù)格式為 (batch, seq, feature)    dropout:除最后一層,每一層的輸出都進(jìn)行dropout,默認(rèn)為: 0    bidirectional:True則為雙向lstm默認(rèn)為False

          結(jié)合前面的圖形,我們一個個看。
          (1)input_size:x的特征維度,就是數(shù)據(jù)立方體中的F,在NLP中就是一個詞被embedding后的向量長度,如下圖所示:
          (2)hidden_size:隱藏層的特征維度(隱藏層神經(jīng)元個數(shù)),如下圖所示,我們有兩個隱含層,每個隱藏層的特征維度都是5。注意,非雙向LSTM的輸出維度等于隱藏層的特征維度。
          (3)num_layers:lstm隱層的層數(shù),上面的圖我們定義了2個隱藏層。
          (4)batch_first:用于定義輸入輸出維度,后面再講。
          (5)bidirectional:是否是雙向循環(huán)神經(jīng)網(wǎng)絡(luò),如下圖是一個雙向循環(huán)神經(jīng)網(wǎng)絡(luò),因此在使用雙向LSTM的時候我需要特別注意,正向傳播的時候有(Ht, Ct),反向傳播也有(Ht', Ct'),前面我們說了非雙向LSTM的輸出維度等于隱藏層的特征維度,而雙向LSTM的輸出維度是隱含層特征數(shù)*2,而且H,C的維度是時間軸長度*2。


          4.2 喂給LSTM的數(shù)據(jù)格式

          pytorch中LSTM的輸入數(shù)據(jù)格式默認(rèn)如下:
          input(seq_len, batch, input_size)參數(shù)有:    seq_len:序列長度,在NLP中就是句子長度,一般都會用pad_sequence補齊長度    batch:每次喂給網(wǎng)絡(luò)的數(shù)據(jù)條數(shù),在NLP中就是一次喂給網(wǎng)絡(luò)多少個句子    input_size:特征維度,和前面定義網(wǎng)絡(luò)結(jié)構(gòu)的input_size一致。
          前面也說到,如果LSTM的參數(shù) batch_first=True,則要求輸入的格式是:
          input(batch, seq_len, input_size)
          剛好調(diào)換前面兩個參數(shù)的位置。其實這是比較好理解的數(shù)據(jù)形式,下面以NLP中的embedding向量說明如何構(gòu)造LSTM的輸入。
          之前我們的embedding矩陣如下圖:
          如果把batch放在第一位,則三維矩陣的形式如下:
          其轉(zhuǎn)換過程如下圖所示:
          看懂了嗎,這就是輸入數(shù)據(jù)的格式,是不是很簡單。
          LSTM的另外兩個輸入是 h0?和 c0,可以理解成網(wǎng)絡(luò)的初始化參數(shù),用隨機數(shù)生成即可。
          h0(num_layers * num_directions, batch, hidden_size)c0(num_layers * num_directions, batch, hidden_size)參數(shù):    num_layers:隱藏層數(shù)    num_directions:如果是單向循環(huán)網(wǎng)絡(luò),則num_directions=1,雙向則num_directions=2    batch:輸入數(shù)據(jù)的batch    hidden_size:隱藏層神經(jīng)元個數(shù)
          注意,如果我們定義的input格式是:
          input(batch, seq_len, input_size)
          則H和C的格式也是要變的:
          h0(batc,num_layers * num_directions, h, hidden_size)c0(batc,num_layers * num_directions, h, hidden_size)


          4.3 LSTM的output格式

          LSTM的輸出是一個tuple,如下:
          output,(ht, ct) = net(input)    output: 最后一個狀態(tài)的隱藏層的神經(jīng)元輸出    ht:最后一個狀態(tài)的隱含層的狀態(tài)值    ct:最后一個狀態(tài)的隱含層的遺忘門值
          output的默認(rèn)維度是:
          output(seq_len, batch, hidden_size * num_directions)ht(num_layers * num_directions, batch, hidden_size)ct(num_layers * num_directions, batch, hidden_size)
          和input的情況類似,如果我們前面定義的input格式是:
          input(batch, seq_len, input_size)
          則ht和ct的格式也是要變的:
          ht(batc,num_layers * num_directions, h, hidden_size)ct(batc,num_layers * num_directions, h, hidden_size)
          說了這么多,我們回過頭來看看ht和ct在哪里,請看下圖:
          output在哪里?請看下圖:

          ???LSTM和其他網(wǎng)絡(luò)組合


          還記得嗎,output的維度等于隱藏層神經(jīng)元的個數(shù),即hidden_size,在一些時間序列的預(yù)測中,會在output后,接上一個全連接層,全連接層的輸入維度等于LSTM的hidden_size,之后的網(wǎng)絡(luò)處理就和BP網(wǎng)絡(luò)相同了,如下圖:
          用pytorch實現(xiàn)上面的結(jié)構(gòu):
          import torchfrom torch import nn
          class RegLSTM(nn.Module): def __init__(self): super(RegLSTM, self).__init__() # 定義LSTM self.rnn = nn.LSTM(input_size, hidden_size, hidden_num_layers) # 定義回歸層網(wǎng)絡(luò),輸入的特征維度等于LSTM的輸出,輸出維度為1 self.reg = nn.Sequential( nn.Linear(hidden_size, 1) )
          def forward(self, x): x, (ht,ct) = self.rnn(x) seq_len, batch_size, hidden_size= x.shape x = y.view(-1, hidden_size) x = self.reg(x) x = x.view(seq_len, batch_size, -1) return x
          當(dāng)然,有些模型則是將輸出當(dāng)做另一個LSTM的輸入,或者使用隱藏層ht,ct的信息進(jìn)行建模,不一而足。
          好了,以上就是我對LSTM的一些學(xué)習(xí)心得,看完記得關(guān)注點贊。

          小白團(tuán)隊出品:零基礎(chǔ)精通語義分割↓

          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  北条麻妃二区三区 | 欧美精品| 免费观看黄色毛片 | 色秘 乱码一区二区三区男奴-百度 | 香蕉社区在线观看 |