學習pytorch(四)簡單RNN舉例

2021-10-19 08:50:14 字數 3271 閱讀 3538

import torch

#簡單rnn學習舉例。

# rnn(迴圈神經網路)是把乙個線性層重複使用,適合訓練序列型的問題。單詞是乙個序列,序列的每個元素是字母。序列中的元素可以是任意維度的。實際訓練中,

# 可以首先把序列中的元素變為合適的維度,再交給rnn層。

#學習 將hello 轉為 ohlol。

dict=[

'e',

'h',

'l',

'o']

#字典。有4個字母

x_data=[1

,0,2

,2,3

]#輸入hello在字典中的引索

x_data=torch.longtensor(x_data)

#後面要用到把引索轉化為高維向量的工具,那個工具要求輸入是longtensor而不是預設的floattensor

y_data=torch.longtensor([3

,1,2

,3,2

])#後面用到的交叉熵損失要求輸入是一維longtensor。longtensor的型別是長整型。

# 上邊提到的把引索轉為高維向量的工具,可以理解為編碼器。引索是標量,編出的碼可以是任意維度的向量,在這個例子中

# 把從字典長度為4(只有4個不同的字母的字典)的字典中取出的5個字母hello構成乙個序列,編碼為5個(乙個樣本,這個樣本有5個元素,也就是

# batch_size=1,seqlen(序列長度)=5,1*5=5)10維向量(bedding_size=10)。

# 然後通過rnn層,降維為5個8維向量(hidding_size=8)。rnn層的輸入形狀是樣本數*序列長度*元素維度,(本例中是1*5*10)rnn的輸入有兩個,這裡我們關心第乙個輸出

# 它的形狀為樣本數*序列長度*輸出元素維度(本例中為1*5*8)。

# 然後把rnn層的輸出視為(樣本數*序列長度)*輸出元素維度(本例:5*8)的向量交給全連線層降維為5*4。4是因為這是個多分類問題,輸入的每個字母對應哪個分類。

# 這裡輸出分類類別只有4個。(num_class=4)

# 把得到5*4張量交給交叉熵損失計算**與目標的損失。(後面的工作就是多分類的工作了)。

class

rnnmodel

(torch.nn.module)

:def

__init__

(self,dictionary_size,num_class)

:super

(rnnmodel, self)

.__init__(

) self.hidden_size=

8 self.bedding_size=

10 self.dictionary_size=dictionary_size

self.num_class=num_class

self.embeddinger=torch.nn.embedding(self.dictionary_size,self.bedding_size)

#把5個引索轉化為5個張量。並繼承輸入的維度。(本例中繼承batch_size*seglen),

# 輸出為batch_size*seglen*bedding_size

self.rnn=torch.nn.rnn(input_size=self.bedding_size,hidden_size=self.hidden_size,num_layers=

1,batch_first=

true

)# 指定batch_fisrt=true,則要求輸入維度為batch_size*seglen*input_size,否則,要求輸入為seglen*input_size。

# 指定batch_fisrt=true要求的輸入形狀更方便與構建資料集。資料集的原始維度就是這樣的。

# batch_fisrt預設為false ,之所以為false,是因為seglen*input_size這樣的形狀更有利於rnn的實現。

self.linear=torch.nn.linear(self.hidden_size,self.num_class)

#10維降為4維。

defforward

(self,x)

:#x 的形狀為(樣本數,序列長度)

h0=torch.zeros(

1,x.size(0)

,self.hidden_size)

#rnn要有兩個輸入,x為資料,h為序列中上乙個元素計算的結果。由於第乙個元素沒有

#上乙個元素,所以要指定乙個初始值。如果沒有先驗資料,一般設定為全0。它的形狀為num_layer*batch_size*hidden_size。num_layers是什麼,本人很懶不想畫圖,其他部落格對這個的解釋

#非常清晰。

x=self.embeddinger(x)

x,_=self.rnn(x,h0)

#x的形狀為(樣本數,序列長度,每個單元的維度)

x=x.view(-1

,self.hidden_size)

#合併前兩個維度,放入全連線層計算。如果需要,計算完之後再拆分。

x=self.linear(x)

return x

if __name__==

'__main__'

: model=rnnmodel(4,

4)criterion=torch.nn.crossentropyloss(

) optimizer=torch.optim.adam(model.parameters(

),lr=

0.1)

x_data=x_data.view(-1

,5) y_data=y_data.view(-1

)for epoch in

range(15

):y_hat=model(x_data)

_,index=torch.

max(y_hat,1)

index=index.data.numpy(

) loss=criterion(y_hat,y_data)

print

(epoch,

' loss:'

, loss.item(),

'guess:',''

.join(

[dict

[x]for x in index]))

optimizer.zero_grad(

) loss.backward(

) optimizer.step(

)

pytorch 實戰學習 二 RNN

1,pycharm 的設定 引數設定 執行.py檔案帶引數,例如argument 2,argparse.argumentparser 用法解析 3,torch.nn.utils nn utils 4,python資料視覺化庫 seaborn 5,1.檢視自己的虛擬環境 conda info envs...

讀PyTorch原始碼學習RNN

torch.nn.rnn,實現的是jeffrey elman在1990年提出的 recurrent neural network srnn 它還有乙個更為廣泛的稱呼 elman network。torch.nn.lstm,實現的是1997年的lstm torch.nn.gru,實現的是2014年的g...

RNN 《動手學深度學習pytorch》

rnn存在的問題 梯度較容易出現衰減或 bptt 改進 gru 控迴圈神經 絡 捕捉時間序列中時間步距離較 的依賴關係 長短期記憶long short term memory 遺忘門 控制上一時間步的記憶細胞 輸入門 控制當前時間步的輸入 輸出門 控制從記憶細胞到隱藏狀態 記憶細胞 種特殊的隱藏狀態...