Pytorch中RNN入门思想及实现
生活随笔
收集整理的這篇文章主要介紹了
Pytorch中RNN入门思想及实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
RNN循環(huán)神經(jīng)網(wǎng)絡(luò)
整體思想:
將整個(gè)序列劃分成多個(gè)時(shí)間步,將每一個(gè)時(shí)間步的信息依次輸入模型,同時(shí)將模型輸出的結(jié)果傳給下一個(gè)時(shí)間步,也就是說后面的結(jié)果受前面輸入的影響。
RNN的實(shí)現(xiàn)公式:
個(gè)人思路:
首先設(shè)置一個(gè)初始權(quán)重h(一般情況下設(shè)置為全0矩陣),將h(0)與權(quán)重W相乘在加上輸入X(0)與權(quán)重U相乘再加上偏差值b(本文設(shè)為0)的和通過tanh這個(gè)激活函數(shù)后的結(jié)果為第二層的h(1),依次類推。各層h(除了h(0)和最后一個(gè)輸出的h(n)以外)組成的向量既為輸出結(jié)果,h(n)為預(yù)測隱含層結(jié)果。
Pytorch模型下RNN代碼實(shí)現(xiàn):
import torch import torch.nn as nn import numpy as np""" 實(shí)現(xiàn)簡單的神經(jīng)網(wǎng)絡(luò) 使用pytorch實(shí)現(xiàn)RNN 不考慮偏差值 """ class TorchRNN(nn.Module):def __init__(self, input_size, hidden_size):super(TorchRNN, self).__init__()self.layer = nn.RNN(input_size, hidden_size, bias=False, batch_first=True)def forward(self, x):return self.layer(x)x = np.array([[1, 2, 3], [3, 4, 5], [5, 6, 7]]) #網(wǎng)絡(luò)輸入#torch實(shí)驗(yàn) hidden_size = 4 #隱單元是4維 1×4矩陣 torch_model = TorchRNN(3, hidden_size) #輸入是3維,因此輸出應(yīng)為3×4矩陣 #print(len(torch_model.state_dict())) w_ih = torch_model.state_dict()["layer.weight_ih_l0"] #獲得隨機(jī)初始化的權(quán)重U w_hh = torch_model.state_dict()["layer.weight_hh_l0"] #獲得隨機(jī)初始化的權(quán)重Wtorch_x = torch.FloatTensor([x]) output, h = torch_model.forward(torch_x) print(output.detach().numpy(), "torch模型預(yù)測結(jié)果") #這里的輸出第一行是第一個(gè)輸入值之后得到的h,以此類推 #print(h.detach().numpy(), "torch模型預(yù)測隱含層結(jié)果") #預(yù)測隱含層結(jié)果就是最后一個(gè)輸入值得到的h在自定義模型中的RNN的代碼實(shí)現(xiàn):
""" 手動(dòng)實(shí)現(xiàn)簡單的神經(jīng)網(wǎng)絡(luò) 手動(dòng)實(shí)現(xiàn)RNN 需要將該代碼放入pytorch模型中才能運(yùn)行 對比理解過程 """ #自定義RNN模型 class DiyModel:def __init__(self, w_ih, w_hh, hidden_size):self.w_ih = w_ihself.w_hh = w_hhself.hidden_size = hidden_sizedef forward(self, x):ht = np.zeros((self.hidden_size)) #初始化h為全0矩陣output = []for xt in x:ux = np.dot(self.w_ih, xt) #函數(shù)實(shí)現(xiàn)wh = np.dot(self.w_hh, ht) #函數(shù)實(shí)現(xiàn)ht_next = np.tanh(ux + wh) #函數(shù)實(shí)現(xiàn)output.append(ht_next) #放入output列表中ht = ht_next #h向下更新return np.array(output), htdiy_model = DiyModel(w_ih, w_hh, hidden_size) output, h = diy_model.forward(x) print(output, "diy模型預(yù)測結(jié)果") # print(h, "diy模型預(yù)測隱含層結(jié)果")因?yàn)樽远x模型中需要得到跟pytorch模型中的輸入和隨機(jī)初始化的W和,如果需要運(yùn)行需將自定義模型代碼放在pytorch模型的下面運(yùn)行。同樣不考慮偏差值。
結(jié)果如下:
可以看到兩者運(yùn)行結(jié)果相同,說明運(yùn)算邏輯沒有問題。
總結(jié)
以上是生活随笔為你收集整理的Pytorch中RNN入门思想及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么总做梦梦到老公出轨
- 下一篇: 梦到老虎吃人预示着什么