亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyTorch中LSTM的輸入和輸出實例分析

發布時間:2022-07-27 09:31:54 來源:億速云 閱讀:334 作者:iii 欄目:開發技術

這篇文章主要介紹“PyTorch中LSTM的輸入和輸出實例分析”,在日常操作中,相信很多人在PyTorch中LSTM的輸入和輸出實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PyTorch中LSTM的輸入和輸出實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

LSTM參數

官方文檔給出的解釋為:

PyTorch中LSTM的輸入和輸出實例分析

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

  • input_size:在文本處理中,由于一個單詞沒法參與運算,因此我們得通過Word2Vec來對單詞進行嵌入表示,將每一個單詞表示成一個向量,此時input_size=embedding_size。比如每個句子中有五個單詞,每個單詞用一個100維向量來表示,那么這里input_size=100;在時間序列預測中,比如需要預測負荷,每一個負荷都是一個單獨的值,都可以直接參與運算,因此并不需要將每一個負荷表示成一個向量,此時input_size=1。 但如果我們使用多變量進行預測,比如我們利用前24小時每一時刻的[負荷、風速、溫度、壓強、濕度、天氣、節假日信息]來預測下一時刻的負荷,那么此時input_size=7

  • hidden_size:隱藏層節點個數。可以隨意設置。

  • num_layers:層數。nn.LSTMCell與nn.LSTM相比,num_layers默認為1。

  • batch_first:默認為False,意義見后文。

Inputs

關于LSTM的輸入,官方文檔給出的定義為:

PyTorch中LSTM的輸入和輸出實例分析

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

其中input:

input(seq_len, batch_size, input_size)
  • seq_len:在文本處理中,如果一個句子有7個單詞,則seq_len=7;在時間序列預測中,假設我們用前24個小時的負荷來預測下一時刻負荷,則seq_len=24。

  • batch_size:一次性輸入LSTM中的樣本個數。在文本處理中,可以一次性輸入很多個句子;在時間序列預測中,也可以一次性輸入很多條數據。

  • 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

關于LSTM的輸出,官方文檔給出的定義為:

PyTorch中LSTM的輸入和輸出實例分析

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

其中output的shape為:

output(seq_len, batch_size, num_directions * hidden_size)

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

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)

變為:

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):
        batch_size, seq_len = input_seq[0], input_seq[1]
        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)
        # output(batch_size, seq_len, num_directions * hidden_size)
        output, _ = self.lstm(input_seq, (h_0, c_0)) # output(5, 30, 64)
        pred = self.linear(output)  # (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)

我們加上具體的數字:

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):
    batch_size, seq_len = input_seq[0], input_seq[1]
    h_0 = torch.randn(self.num_directions * self.num_layers, batch_size, self.hidden_size).to(device)
    c_0 = torch.randn(self.num_directions * self.num_layers, batch_size, self.hidden_size).to(device)
    # input(batch_size, seq_len, input_size)
    # output(batch_size, seq_len, num_directions * hidden_size)
    output, _ = self.lstm(input_seq, (h_0, c_0))  # output(5, 30, 64)
    pred = self.linear(output) # (5, 30, 1)
    pred = pred[:, -1, :]  # (5, 1)
    return pred

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

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

經過DataLoader處理后的input_seq為:

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

然后將input_seq送入LSTM:

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

根據前文,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送入全連接層:

pred = self.linear(output)  # pred(5, 30, 1)

得到的預測值shape為(5, 30, 1),由于輸出是輸入右移,我們只需要取pred第二維度(time)中的最后一個數據:

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

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

到此,關于“PyTorch中LSTM的輸入和輸出實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南澳县| 荥经县| 肇东市| 略阳县| 瓦房店市| 偃师市| 东山县| 藁城市| 奎屯市| 涪陵区| 巴塘县| 谷城县| 武安市| 怀宁县| 鹤庆县| 临漳县| 来安县| 香格里拉县| 兴化市| 平昌县| 麦盖提县| 临江市| 高邮市| 五河县| 襄城县| 崇信县| 客服| 甘肃省| 遂昌县| 定州市| 康马县| 平度市| 克什克腾旗| 福安市| 麦盖提县| 迁安市| 安顺市| 舞阳县| 昌吉市| 田东县| 太湖县|