赞
踩
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()#参数的更新通过一行标准代码执行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。