最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出

 更新時間:2022年05月11日 10:13:43   作者:Cyril_KI  
這篇文章主要為大家介紹了PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

LSTM介紹

關(guān)于LSTM的具體原理,可以參考:

http://m.fzitv.net/article/178582.htm

http://m.fzitv.net/article/178423.htm

系列文章:

PyTorch搭建雙向LSTM實現(xiàn)時間序列負(fù)荷預(yù)測

PyTorch搭建LSTM實現(xiàn)多變量多步長時序負(fù)荷預(yù)測

PyTorch搭建LSTM實現(xiàn)多變量時序負(fù)荷預(yù)測

PyTorch搭建LSTM實現(xiàn)時間序列負(fù)荷預(yù)測

LSTM參數(shù)

關(guān)于nn.LSTM的參數(shù),官方文檔給出的解釋為:

總共有七個參數(shù),其中只有前三個是必須的。由于大家普遍使用PyTorch的DataLoader來形成批量數(shù)據(jù),因此batch_first也比較重要。LSTM的兩個常見的應(yīng)用場景為文本處理和時序預(yù)測,因此下面對每個參數(shù)我都會從這兩個方面來進(jìn)行具體解釋。

  • input_size:在文本處理中,由于一個單詞沒法參與運(yùn)算,因此我們得通過Word2Vec來對單詞進(jìn)行嵌入表示,將每一個單詞表示成一個向量,此時input_size=embedding_size。
  • 比如每個句子中有五個單詞,每個單詞用一個100維向量來表示,那么這里input_size=100;
  • 在時間序列預(yù)測中,比如需要預(yù)測負(fù)荷,每一個負(fù)荷都是一個單獨(dú)的值,都可以直接參與運(yùn)算,因此并不需要將每一個負(fù)荷表示成一個向量,此時input_size=1。
  • 但如果我們使用多變量進(jìn)行預(yù)測,比如我們利用前24小時每一時刻的[負(fù)荷、風(fēng)速、溫度、壓強(qiáng)、濕度、天氣、節(jié)假日信息]來預(yù)測下一時刻的負(fù)荷,那么此時input_size=7。
  • hidden_size:隱藏層節(jié)點個數(shù)??梢噪S意設(shè)置。
  • num_layers:層數(shù)。nn.LSTMCell與nn.LSTM相比,num_layers默認(rèn)為1。
  • batch_first:默認(rèn)為False,意義見后文。

Inputs

關(guān)于LSTM的輸入,官方文檔給出的定義為:

可以看到,輸入由兩部分組成:input、(初始的隱狀態(tài)h_0,初始的單元狀態(tài)c_0)

其中input:

input(seq_len, batch_size, input_size)
  • seq_len:在文本處理中,如果一個句子有7個單詞,則seq_len=7;在時間序列預(yù)測中,假設(shè)我們用前24個小時的負(fù)荷來預(yù)測下一時刻負(fù)荷,則seq_len=24。
  • batch_size:一次性輸入LSTM中的樣本個數(shù)。在文本處理中,可以一次性輸入很多個句子;在時間序列預(yù)測中,也可以一次性輸入很多條數(shù)據(jù)。
  • input_size:見前文。

(h_0, c_0):

h_0(num_directions * num_layers, batch_size, hidden_size)
c_0(num_directions * num_layers, batch_size, hidden_size)

h_0和c_0的shape一致。

  • num_directions:如果是雙向LSTM,則num_directions=2;否則num_directions=1。
  • num_layers:見前文。
  • batch_size:見前文。
  • hidden_size:見前文。

Outputs

關(guān)于LSTM的輸出,官方文檔給出的定義為:

可以看到,輸出也由兩部分組成:otput、(隱狀態(tài)h_n,單元狀態(tài)c_n)

其中output的shape為:

output(seq_len, batch_size, num_directions * hidden_size)

h_n和c_n的shape保持不變,參數(shù)解釋見前文。

batch_first

如果在初始化LSTM時令batch_first=True,那么input和output的shape將由:

input(seq_len, batch_size, input_size)
output(seq_len, batch_size, num_directions * hidden_size)

變?yōu)椋?/p>

input(batch_size, seq_len, input_size)
output(batch_size, seq_len, num_directions * hidden_size)

即batch_size提前。

案例

簡單搭建一個LSTM如下所示:

class LSTM(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size, batch_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.output_size = output_size
        self.num_directions = 1 # 單向LSTM
        self.batch_size = batch_size
        self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
        self.linear = nn.Linear(self.hidden_size, self.output_size)
    def forward(self, input_seq):
        h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
        seq_len = input_seq.shape[1] # (5, 30)
        # input(batch_size, seq_len, input_size)
        input_seq = input_seq.view(self.batch_size, seq_len, 1)  # (5, 30, 1)
        # output(batch_size, seq_len, num_directions * hidden_size)
        output, _ = self.lstm(input_seq, (h_0, c_0)) # output(5, 30, 64)
        output = output.contiguous().view(self.batch_size * seq_len, self.hidden_size) # (5 * 30, 64)
        pred = self.linear(output) # pred(150, 1)
        pred = pred.view(self.batch_size, seq_len, -1) # (5, 30, 1)
        pred = pred[:, -1, :]  # (5, 1)
        return pred

其中定義模型的代碼為:

self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True)
self.linear = nn.Linear(self.hidden_size, self.output_size)

我們加上具體的數(shù)字:

self.lstm = nn.LSTM(self.input_size=1, self.hidden_size=64, self.num_layers=5, batch_first=True)
self.linear = nn.Linear(self.hidden_size=64, self.output_size=1)

再看前向傳播:

def forward(self, input_seq):
    h_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
    c_0 = torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device)
    seq_len = input_seq.shape[1]  # (5, 30)
    # input(batch_size, seq_len, input_size)
    input_seq = input_seq.view(self.batch_size, seq_len, 1)  # (5, 30, 1)
    # output(batch_size, seq_len, num_directions * hidden_size)
    output, _ = self.lstm(input_seq, (h_0, c_0))  # output(5, 30, 64)
    output = output.contiguous().view(self.batch_size * seq_len, self.hidden_size)  # (5 * 30, 64)
    pred = self.linear(output) # (150, 1)
    pred = pred.view(self.batch_size, seq_len, -1)  # (5, 30, 1)
    pred = pred[:, -1, :]  # (5, 1)
    return pred

假設(shè)用前30個預(yù)測下一個,則seq_len=30,batch_size=5,由于設(shè)置了batch_first=True,因此,輸入到LSTM中的input的shape應(yīng)該為:

input(batch_size, seq_len, input_size) = input(5, 30, 1)

但實際上,經(jīng)過DataLoader處理后的input_seq為:

input_seq(batch_size, seq_len) = input_seq(5, 30)

(5, 30)表示一共5條數(shù)據(jù),每條數(shù)據(jù)的維度都為30。為了匹配LSTM的輸入,我們需要對input_seq的shape進(jìn)行變換:

input_seq = input_seq.view(self.batch_size, seq_len, 1)  # (5, 30, 1)

然后將input_seq送入LSTM:

output, _ = self.lstm(input_seq, (h_0, c_0)) # output(5, 30, 64)

根據(jù)前文,output的shape為:

output(batch_size, seq_len, num_directions * hidden_size) = output(5, 30, 64)

全連接層的定義為:

self.linear = nn.Linear(self.hidden_size=64, self.output_size=1)

因此,我們需要將output的第二維度變換為64(150, 64):

output = output.contiguous().view(self.batch_size * seq_len, self.hidden_size) # (5 * 30, 64)

然后將output送入全連接層:

pred = self.linear(output) # pred(150, 1)

得到的預(yù)測值shape為(150, 1)。我們需要將其進(jìn)行還原,變成(5, 30, 1):

pred = pred.view(self.batch_size, seq_len, -1) # (5, 30, 1)

在用DataLoader處理了數(shù)據(jù)后,得到的input_seq和label的shape分別為:

input_seq(batch_size, seq_len) = input_seq(5, 30)label(batch_size, output_size) = label(5, 1)

由于輸出是輸入右移,我們只需要取pred第二維度(time)中的最后一個數(shù)據(jù):

pred = pred[:, -1, :] # (5, 1)

這樣,我們就得到了預(yù)測值,然后與label求loss,然后再反向更新參數(shù)即可。

時間序列預(yù)測的一個真實案例請見:PyTorch搭建LSTM實現(xiàn)時間序列預(yù)測(負(fù)荷預(yù)測)

以上就是PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出的詳細(xì)內(nèi)容,更多關(guān)于LSTM input輸入Linear輸出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)學(xué)生管理系統(tǒng)的示例代碼

    Python實現(xiàn)學(xué)生管理系統(tǒng)的示例代碼

    學(xué)生管理系統(tǒng)是一個常見的應(yīng)用程序,它可以幫助學(xué)校、教育機(jī)構(gòu)或教師管理學(xué)生的信息,本文將介紹如何利用Python開發(fā)一個學(xué)生管理系統(tǒng),需要的可以參考一下
    2023-07-07
  • python區(qū)塊鏈實現(xiàn)簡版網(wǎng)絡(luò)

    python區(qū)塊鏈實現(xiàn)簡版網(wǎng)絡(luò)

    這篇文章主要為大家介紹了python區(qū)塊鏈實現(xiàn)簡版網(wǎng)絡(luò)的詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python實現(xiàn)簡單反彈球游戲

    python實現(xiàn)簡單反彈球游戲

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)簡單反彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python+OpenCV人臉檢測原理及示例詳解

    Python+OpenCV人臉檢測原理及示例詳解

    這篇文章主要為大家詳細(xì)介紹了Python+OpenCV人臉檢測原理及示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Python提取視頻幀圖片實例代碼

    Python提取視頻幀圖片實例代碼

    大家好,本篇文章主要講的是Python提取視頻幀圖片實例代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python中隨機(jī)數(shù)生成random庫實戰(zhàn)

    Python中隨機(jī)數(shù)生成random庫實戰(zhàn)

    本文介紹了Python的random庫,介紹了生成隨機(jī)整數(shù)、浮點數(shù)、序列隨機(jī)抽樣等基本功能,以及設(shè)置隨機(jī)種子、控制概率分布等高級技巧,通過多個實用示例,感興趣的可以了解一下
    2024-11-11
  • Python數(shù)據(jù)庫自動化完整指南

    Python數(shù)據(jù)庫自動化完整指南

    本指南詳細(xì)講解如何使用Python操作MySQL、Oracle和Microsoft?SQL?Server數(shù)據(jù)庫,涵蓋常用庫、基礎(chǔ)操作、高級功能及完整代碼示例,需要的朋友可以參考下
    2025-03-03
  • python SQLAlchemy的Mapping與Declarative詳解

    python SQLAlchemy的Mapping與Declarative詳解

    這篇文章主要介紹了python SQLAlchemy的Mapping與Declarative詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 王純業(yè)的Python學(xué)習(xí)筆記 下載

    王純業(yè)的Python學(xué)習(xí)筆記 下載

    這篇文章主要介紹了王純業(yè)的Python學(xué)習(xí)筆記 下載
    2007-02-02
  • 詳解Python字典小結(jié)

    詳解Python字典小結(jié)

    這篇文章主要介紹了詳解Python字典小結(jié),詳細(xì)的介紹了什么是字典且創(chuàng)建字典和示例,非常具有實用價值,需要的朋友可以參考下
    2018-10-10

最新評論

怀安县| 余姚市| 海淀区| 长顺县| 普安县| 泰州市| 乌拉特前旗| 桂林市| 秦安县| 高要市| 隆化县| 鹿泉市| 枣庄市| 扶沟县| 德钦县| 浮山县| 普安县| 景洪市| 常德市| 江山市| 广平县| 甘泉县| 卫辉市| 福泉市| 舞钢市| 齐齐哈尔市| 金湖县| 长岛县| 南木林县| 曲靖市| 讷河市| 龙陵县| 遂昌县| 惠州市| 松滋市| 上林县| 新蔡县| 高邮市| 柳林县| 马公市| 黄梅县|