pytorch构建一个神经网络
1.主要工具在torch.nn工具包中,nn依赖于autograd来定义模型,并对其自动求导
1.激活函数作用:提高泛化能力,减少参数,引入非线性
2.torch.nn构建的神经网络只支持mini-batches输入,不支持单一样本。如果输入单一样本,则需要如果输入torch.unsqueeze(0),将3d扩充到4Dtensor
nn.Conv2d需要一个4D的tensor(nsample,nchannel,height,width)。
torch.unsqueeze(input, dim)#通常用于改变张量的形状,增加维度。unsqueeze 函数的作用是在指定的位置(通常是在指定的维度)上增加一个维度。
3.基于梯度下降的的优化算法是需要多个轮次的迭代训练
2.基本流程:
定义一个可学习参数的神经网络
遍历所有数据集
处理数据使其流经神经网络
计算损失值
将网络参数的梯度进行反向传播
以一定的规则更新网络的权重
3.构建一个简单的类
class 类名(nn.module):
def __init__(self):#定义初始化函数
super (类名,self).__init__
self.conv1=nn.Conv2d(1,6,3)#输入通道,输出通道,卷积核
def forward(self,参数):#定义前向传播函数
x=self.conv1(x)
return x
需要实例化类net=类名()
4.模型参数都可以通过net.paramenter()来获得
paras=list(net.parameter())
print(len(paras))
print(paras[0].size())
5.损失函数
计算出一个数值评估模型输出与目标之间的差距大小。
torch.nn中有很多的损失函数可以使用,比如nn.MSEloss计算均方差来评估输入与目标值之间的差距
eg:
output=net(input)
target=torch.randn(10)
target=target.view(1,-1)
loss_fun=nn.MSEloss()
loss=loss_fun(input,target)
6.反向传播
1.input=torch.rand(1,1,32,32)
out=net(input)
有输出张量,就可以执行梯度归零和反向传播
net.zeros_grad()#一定要梯度清零
out.backward(torch.randn(1,10))
2.整个操作就是loss.backward(),执行之前,要进行梯度清零,否则梯度会在不同批次数据之间被累加
net.zero_grad()
loss.backward()
3.反向传播一般是损失函数的反向传播
1.关于方向传播的链条:跟踪loss反向传播的方向,使用grad_fn属性打印,可以看见完整的计算图
input->conv2d
->MSEloss
->loss
2.当调用loss.backward()时,整张计算图将对loss进行自动求导,所有属性require_grad=Ture的tensors都将参与梯度求导运算,并将梯度累加到tensor中的.grad属性中
print(loss.grad_fn)#MSEloss;loss.grad_fn 属性来访问损失函数的计算图
print(loss.grad_fn.next_functions[0][0])#conv2d;访问 loss.grad_fn 的下一个函数的第一个输入张量的梯度函数
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])#卷积之前还有什么操作就是什么
7.更新网络参数(优化算法)
1.最简单是SGD(随机梯度下降)
2.weight=weight-learning*gradient
3.基本完整例子
import torch.optim as optim
optimizer= optimal.SGD(net.parameter(),Ir=0.01)#通过optim创建优化器
optimizer.zero_grad()#将优化器梯度清零
out=net(input)
loss=loss_fun(out,target)
loss.backward()#对损失函数进行反向传播
optimizer.step()#参数的更新通过一行标准代码执行
10-23
3437