深度學習筆記4torch的rnn

2021-07-23 05:54:47 字數 2520 閱讀 6037

**:本節**位址

require 'rnn'
require 'gnuplot'

batchsize=8 --mini batch

rho=100 --back propagation through time

hiddensize = 20

r=nn.recurent(

hiddensize,nn.linear(1,hiddensize),

nn.linear(hiddensize,hiddensize),nn.sigmoid(),

rho)--1. 本層中包含的節點個數,為hiddensize

--2. 前一層(也就是輸入層)到本層的連線。這裡是乙個輸入為1,輸出為hiddensize的線性連線。

--3. 本層節點到自身的反饋連線。這裡是乙個輸入為hiddensize,輸出也是hiddensize的線性連線。

--4. 本層輸入和反饋連線所用的啟用函式。這裡用的是sigmoid。

--5. back propagation through time所進行的最大的次數。這裡是rho = 100

rnn=nn.sequential()

rnn:add(nn.sequencer(r))

rnn:add(nn.sequencer(nn.linear(hiddensize,1)))

rnn:add(nn.sequencer(nn.sigmoid()))

--首先定義乙個容器,然後新增剛才定義好的隱藏層r。隨後新增隱藏層到輸出層的連線,在這裡用的是輸入為20,輸出為1的線性連線。最後接上一層sigmoid函式。

--這裡在定義網路的時候,每個具體的模組都是用nn.sequencer的括號給括起來的。nn.sequencer是乙個修飾模組。所有經過nn.sequencer包裝過的模組都變得可以接受序列的輸入。

--舉個例子來說,假設有乙個模組本來能夠接受乙個2維的tensor作為輸入,並輸出另乙個2維的tensor。如果我們想把一系列的2維tensor依次輸入給這個模組,需要寫乙個for迴圈來實現。有了nn.sequencer的修飾就不用這麼麻煩了。只需要把這一系列的2維tensor統一放到乙個大的table裡,然後一次性的丟給nn.sequencer就行了。nn.sequencer會把table中的tensor依次放入網路,並將網路輸出的tensor也依次放入乙個大的table中返回給你。

criterion=nn.sequencercriterion(nn.msecriterion())

batchloader = require 'minibatchloader'

loader = batchloader.create(batchsize)

lr = 0.01

i = 1

for n=1,6000 do

-- prepare inputs and targets

local inputs, targets = loader:next_batch()

local outputs = rnn:forward(inputs)

local err = criterion:forward(outputs, targets)

print(i, err/rho)

i = i + 1

local gradoutputs = criterion:backward(outputs, targets)

rnn:backward(inputs, gradoutputs)

rnn:updateparameters(lr)

rnn:zerogradparameters()

end--需要重點說明的是輸入和輸出資料的格式。我使用了minibatchloader(同目錄下的minibatchloader.lua檔案)來從data.t7中讀取資料,每次讀取8個序列,每個序列的時間長度是100。那麼**中inputs的型別是table,這個table中有100個元素,每個元素是乙個2維8列1行的tensor。在訓練的時候,mini batch中8個序列中的每乙個的第乙個資料一起進入網路,接下來是8個排在第二的資料一起輸入,如此迭代。

--當訓練完成之後,用其中的組輸入放進網路觀察其輸出:

inputs, targets = loader:next_batch()

outputs = rnn:forward(inputs)

x={}

y={}

for i=1,100 do

table.insert(x,inputs[i])

table.insert(y,outputs[i])

endx = torch.tensor(x)

y = torch.tensor(y)

gnuplot.pngfigure('timer.png')

gnuplot.plot(,)

gnuplot.plotflush()

github原始碼裡面有兩個lua檔案,這兩個檔案需要先執行。在itorch notebook上,我們需要把**貼上過來,直接先執行即可。

深度學習筆記3torch實現多層感知器

網路結構1 3 3 1,隱含層為兩層,每層都有3個神經元,輸入層和輸出層都有乙個神經元 model nn.sequential model現在是乙個容器,要往這個容器中新增神經網路層 輸入層 隱含層 輸出層 來構成多層感知器 神經網路 容器要新增的第一層為輸入層,1個輸入,3個輸出 model ad...

《c語言深度剖析》學習筆記4

第五章 記憶體管理 5.1 野指標 定義指標變數的同時,最好初始化為null,用完指標之後,也將指標變數的值設定為null.5.2 棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數。靜態區的內容在整個程式的生命週期內都存在,有編譯器編譯時分配。棧 儲存區域性變數。棧上的內容只在函式的範圍...

深度學習筆記之Andrew Ng(4)

week4 最後一周的內容,講的還是神經網路部分。但是公升級成為了多層的深度神經網路,那麼本質上,神經網路的原理還是不變的,那麼在加深了神經網路的layer之後,我們在計算上,出現了一些不同。先上圖 如圖我們看到的是乙個四層hidden layer的神經網路,那麼這個教程主要圍繞如包括四層隱含層的神...