本文是對隧道](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。需要對輸入資料體進行零填充,保證輸出和輸入一樣的空間大小 對輸入資料空間進行下取樣 不使用的話,會導致影象邊緣資訊過快地損失掉 沒有人能在一開始就想清楚,只有開始做了,你...