pytorch學習 構建卷積神經網路

2021-09-25 22:33:53 字數 4581 閱讀 3107

本文是對隧道](https:// .org/tutorials/beginner/blitz/neural_networks_tutorial.html#sphx-glr-beginner-blitz-neural-networks-tutorial-py)

的總結。其中**部分按照自己的習慣有所變動。

構建神經網路主要使用torch.nn包。torch.nn.module包含幾乎所有的必要函式。

神經網路通常包含如下幾個步驟:

1.初始化權重引數(通常使用隨機初始化的方式)

2.處理資料集

3.將資料載入進網路模型

4.前向傳播

5.計算損失

6.反向傳播,更新權重

#構建網路

class

net(torch.nn.module)

:def

__init__

(self)

:super

(net, self)

.__init__(

)#卷積層

self.conv1 = torch.nn.sequential(

#sequential函式將各個模組按序組合

torch.nn.conv2d(1,

6,3)

,#3*3卷積核#2d卷積層的輸入data維數是 batchsize*channel*height*width

torch.nn.relu(),

#線性修正單元

torch.nn.maxpool2d(2)

#2*2最大池化

) self.conv2 = torch.nn.sequential(

torch.nn.conv2d(6,

16,3)

, torch.nn.relu(),

torch.nn.maxpool2d(2)

) self.fc1 = torch.nn.sequential(

torch.nn.linear(16*

6*6,

120)

, torch.nn.relu())

self.fc2 = torch.nn.sequential(

torch.nn.linear(

120,84)

, torch.nn.relu())

self.fc3 = torch.nn.sequential(

torch.nn.linear(84,

10))#前向傳播

defforward

(self, x)

: x = self.conv1(x)

x = self.conv2(x)

x = x.view(x.size(0)

,-1)

x = self.fc1(x)

x = self.fc2(x)

x = self.fc3(x)

return x

torch.nn只支援小批量。整個torch.nn包只支援小批量樣本的輸入,而不是單個樣本。

例如,神經網路conv2d將接收nsamples x nchannels x height x width的4d張量。

如果只有乙個樣本,只需使用input.unsqueeze(0)新增乙個偽批處理維度。

input

= torch.randn(1,

1,32,

32)#生成輸入資料

#batchsize=1 channel=1 height=32 width=32

由於2d卷積層的輸入data維數是batchsizechannelheight*width,所以有(1,1,32,32)

net = net(

)#例項化物件

learning_rate =

0.01

#學習率

loss_fc = torch.nn.mseloss(

)#損失函式

optimizer = torch.optim.sgd(params=net.parameters(

), lr=learning_rate)

#優化函式

其中torch.nn.mseloss()和torch.optim.sgd()**性回歸模型中已經提到,這裡不再贅述。

#訓練

output_pred = net(

input

)#**值

output = torch.randn(10)

#真實值

loss = loss_fc(output_pred, output)

print

(loss)

optimizer.zero_grad(

)# 如果不置零,variable 的梯度在每次 backward 的時候都會累加。

loss.backward(

)# 得到grad,給variable.grad賦值

optimizer.step(

)#variable.data -= learning_rate*variable.grad

完整**

import torch

import torch.nn

import torch.nn.functional

import torch.optim

#構建網路

class

net(torch.nn.module)

:def

__init__

(self)

:super

(net, self)

.__init__(

)#卷積層

self.conv1 = torch.nn.sequential(

#sequential函式將各個模組按序組合

torch.nn.conv2d(1,

6,3)

,#3*3卷積核#2d卷積層的輸入data維數是 batchsize*channel*height*width

torch.nn.relu(),

#線性修正單元

torch.nn.maxpool2d(2)

#2*2最大池化

) self.conv2 = torch.nn.sequential(

torch.nn.conv2d(6,

16,3)

, torch.nn.relu(),

torch.nn.maxpool2d(2)

) self.fc1 = torch.nn.sequential(

torch.nn.linear(16*

6*6,

120)

, torch.nn.relu())

self.fc2 = torch.nn.sequential(

torch.nn.linear(

120,84)

, torch.nn.relu())

self.fc3 = torch.nn.sequential(

torch.nn.linear(84,

10))#前向傳播

defforward

(self, x)

: x = self.conv1(x)

x = self.conv2(x)

x = x.view(x.size(0)

,-1)

x = self.fc1(x)

x = self.fc2(x)

x = self.fc3(x)

return x

input

= torch.randn(1,

1,32,

32)#生成輸入資料

#batchsize=1 channel=1 height=32 width=32

net = net(

)#例項化物件

learning_rate =

0.01

#學習率

loss_fc = torch.nn.mseloss(

)#損失函式

optimizer = torch.optim.sgd(params=net.parameters(

), lr=learning_rate)

#優化函式

#訓練output_pred = net(

input

)#**值

output = torch.randn(10)

#真實值

loss = loss_fc(output_pred, output)

print

(loss)

optimizer.zero_grad(

)# 如果不置零,variable 的梯度在每次 backward 的時候都會累加。

loss.backward(

)# 得到grad,i.e.給variable.grad賦值

optimizer.step(

)#variable.data -= learning_rate*variable.grad

深度學習pytorch 卷積神經網路

def corr2d x,k h,w k.shape y torch.zeros x.shape 0 h 1,x.shape 1 w 1 for i in range y.shape 0 for j in range y.shape 1 y i,j x i i h,j j w k sum retur...

卷積神經網路 pytorch

vocab args.vocab size 已知詞的數量 dim args.embed dim 每個詞向量長度 cla args.class num 類別數 ci 1 輸入的channel數 knum args.kernel num 每種卷積核的數量 ks args.kernel sizes 卷積核...

Pytorch 卷積神經網路

一般而言,輸入層的大小應該能夠被2整除很多次,常用32,64,96,224 盡可能使用小尺寸的濾波器,例如3 3,滑動步長選擇1。需要對輸入資料體進行零填充,保證輸出和輸入一樣的空間大小 對輸入資料空間進行下取樣 不使用的話,會導致影象邊緣資訊過快地損失掉 沒有人能在一開始就想清楚,只有開始做了,你...