构建深度学习基本框架

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()#参数的更新通过一行标准代码执行     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值