当前位置:   article > 正文

构建深度学习基本框架_深度学习框架搭建

深度学习框架搭建
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/634327
推荐阅读
相关标签
  

闽ICP备14008679号