学习十分钟掌握Pytorch搭建神经网络的流程
要继承 nn.Module(import torch.nn as nn)
包含init和forward
init:定义卷积层 super继承
第一层 输入通道1 输出通道6 卷积核为5*5
输入x经过conv再经过激活函数F.relu()(import torch.nn.functional as F)再池化
注意:前后通道数的一致性
Class Net (nn.Module):
def __init__(self):
super().__init__()
self.conv1=nn.Conv2d(1,6,5)
self.conv2=nn.Conv2d(6,16,5)
def forward(self, x):
x=F.max_pool2d(F.relu(self.conv1(x)),2)
x=F.max_pool2d(F.relu(self.conv2(x)),2)
return x
定义Net实例
再传数据tensor类型
net=Net()
output=net(input)
神经网络只能决定每一层卷积层的权重。所以神经网络只能不停修改权重,比如y=wx+b,x是你给的,它只能改变w,b让最后的输出y尽可能接近你希望的y值,这样损失loss就越来越小。
通过下述方式实现对W的更新:
【1】 先算loss对于输入x的偏导,(当然网络好几层,这个x指的是每一层的输入,而不是最开始的输入input)
【2】 对【1】的结果再乘以一个步长(这样就相当于是得到一个对参数W的修改量)
【3】 用W减掉这个修改量,完成一次对参数W的修改。
1 损失函数
compute_loss=nn.MSELoss()
loss=compute_loss(target,output)
# 反向 得到对参数W一步的更新量
loss.backward()
2、3就是通过优化器来实现。让优化器来自动实现对网络权重W的更新。
所以在Net定义完以后,需要写一个优化器的定义(选SGD方式为例):
在每次迭代之前,先把optimizer里存的梯度清零一下(因为W已经更新过的“更新量”下一次就不需要用了)
from torch import optim
optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)
optimizer.zero_grad()
在loss.backward()反向传播以后,更新参数:
optimizer.step()
1.先定义网络:写网络Net的Class,声明网络的实例net=Net(),
2.定义优化器
optimizer=optim.xxx(net.parameters(),lr=xxx),
3.再定义损失函数(自己写class或者直接用官方的,compute_loss=nn.MSELoss()或者其他。
4.在定义完之后,开始一次一次的循环:
①先清空优化器里的梯度信息,optimizer.zero_grad();
②再将input传入,output=net(input) ,正向传播
③算损失,loss=compute_loss(target,output) ##这里target就是参考标准值GT,需要自己准备,和之前传入的input一一对应
④误差反向传播,loss.backward()
⑤更新参数,optimizer.step()