PyTorch學習之神經網路

2021-10-01 11:01:39 字數 4530 閱讀 3292

神經網路可以通過torch.nn包來構建,它是基於自動梯度來構建一些模型,乙個nn.module包括層和乙個方法forward(input),同時也會返回乙個輸出(output)。

下圖是乙個簡單的前饋神經網路lenet,乙個簡單的神經網路包括一下幾點:

:# super(net,self) 首先找到 net 的父類(就是類 nn.module),

# 然後把類 net 的物件轉換為類 fooparent 的物件

super

(net, self)

.__init__(

)#構建卷積

self.conv1 = nn.conv2d(1,

6,5)

# 輸入 1, 輸出 6, 卷積 5*5,即6個不同的5*5卷積

self.conv2 = nn.conv2d(6,

16,5)

# 輸入 6, 輸出 16, 卷積 5*5

#構建全連線 y = wx + b

self.fc1 = nn.linear(16*

5*5,

120)

# 因為有16張 5*5 map, 所以有 16*5*5 = 400個輸入,因此有120個400*1的向量

self.fc2 = nn.linear(

120,84)

# 84 個 120 * 1 個向量

self.fc3 = nn.linear(84,

10)# 10個 84 * 1 個向量

defforward

(self, x)

: x = f.max_pool2d(f.relu(self.conv1(x)),

(2,2

))# 2*2 的最大值池化, relu為啟用函式

x = f.max_pool2d(f.relu(self.conv2(x)),

2)# 如果池化視窗是矩形的,則可以只設定為2

x = x.view(-1

, self.num_flat_features(x)

)# view函式將張量x變形成一維的向量形式,作為全連線的輸入

x = f.relu(self.fc1(x)

) x = f.relu(self.fc2(x)

) x = self.fc3(x)

return x

defnum_flat_features

(self, x)

: size = x.size()[

1:]# 單張影象的size

num_features =

1for s in size:

num_features *= s

return num_features

net = net(

)print

(net)

# 輸出

# net(

# (conv1): conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))

# (conv2): conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))

# (fc1): linear(in_features=400, out_features=120, bias=true)

# (fc2): linear(in_features=120, out_features=84, bias=true)

# (fc3): linear(in_features=84, out_features=10, bias=true)

# )# 乙個模型的訓練引數可以通過呼叫 net.parameterss()返回

params =

list

(net.parameters())

print

(len

(params)

)print

(params[0]

.size())

# 輸出

# 10

# torch.size([6, 1, 5, 5])

#下面嘗試隨機生成乙個32*32的輸入。注意:期望的輸入維度是32*32

# 為了使用這個網路在mnist資料上使用,需要把資料集中的影象維度修改為32*32

input

= torch.randn(1,

1,32,

32)out = net(

input

)print

(out)

#輸出# tensor([[ 0.0469, 0.0975, 0.0686, 0.0793, 0.0673, 0.0325, -0.0455, -0.0428,

# # -0.0671, -0.0067]], grad_fn=)

#把所有引數梯度快取器置0, 用隨機的梯度來反向傳播

net.zero_grad(

)out.backward(torch.randn(1,

10))

上面的**定義了乙個神經而桑落,並且處理了輸入以及呼叫反向傳播。

下面開始,計算損失值和更新網路中的權重:

損失函式:乙個損失函式需要一對輸入:模型輸出和目標,然後計算乙個值來評估輸出距離目標有多遠。nn包中包含著一些不同的損失函式,乙個簡單的損失函式就是 nn.mseloss ,即均方誤差。

output = net(

input

)target = torch.randn(10)

# 目標值

target = target.view(1,

-1)# 將其變換成與輸出值相同的尺寸格式

criterion = nn.mseloss(

)# mseloss

loss = criterion(output, target)

#計算輸出與目標之間的損失函式

print

(loss)

#輸出#tensor(0.3130, grad_fn=)

反向傳播:為了使損失進行反向傳播,需要做的僅僅是使用loss.backward()。首先要清空現存的梯度,否則會和現存的梯度累計到一起

net.zero_grad(

)print

('conv1.bias.grad before backward'

)print

(net.conv1.bias.grad)

loss.backward(

)print

('conv1.bias.grad after backward'

)print

(net.conv1.bias.grad)

#輸出# conv1.bias.grad before backward

# tensor([0., 0., 0., 0., 0., 0.])

# conv1.bias.grad after backward

# tensor([-0.0040, -0.0041, 0.0244, -0.0020, -0.0054, -0.0084])

更新神經網路引數

最簡單的更新計算方式就是使用隨機梯度下降 weight = weight - learning_rate * gradient

python實現方式

learning_rate =

0.01

for f in net.parameters():

f.data.sub_(f.grad.data * learning_rate)

torch.optim中內建了多種權重更新規則,類似於sgd, nesterov-sgd,adam, rmsprop等。

使用方式如下:

import torch.optim as optim

# 建立優化器

optimizer = optim.sgd(net.parameters(

), lr=

0.01

)# 在訓練的迴圈中加入一下**

optimizer.zero_grad(

)# 將梯度置0

output = net(

input

)loss = criterion(output, target)

loss.backward(

)optimizer.step(

)# 更新權重

機器學習之神經網路

機器學習是一門致力於研究如何通過計算的手段,利用經驗來改善系統自身的效能。經驗通常以資料的形式存在,因此機器學習所研究的主要內容是關於在計算機上從資料中產生 模型 的演算法,即 學習演算法 有了學習演算法,將經驗資料提供給它,它就能基於這些資料產生模型 當面對新情況時,模型會給我們提供相應的判斷。一...

深度學習之神經網路

神經網路由輸入層 隱藏層 輸出層組成 1 單層神經網路 感知機 類似邏輯回歸,線性分類,全連線 沒有啟用函式 2 兩層神經網路 多層感知機 帶乙個隱層,非線性分類,全連線 3 多層神經網路 深度學習 全連線 4 卷積神經網路 cnn 非全連線 5 迴圈神經網路 rnn 處理序列資料 作非線性變換 s...

機器學習之神經網路NN

神經網路 neural network 以人腦中的神經網路為啟發而產生的,最著名對的演算法是backpropagation bp 演算法。可用來解決分類問題,也可用來解決回歸問題 詳情見前言 多層向前神經網路中使用了bp演算法 多層向前神經網路的組成,每一層由單元組成 圖中小圈圈 輸入層 由訓練集的...