卷积神经网络学习(搭建模型)

  • 神经网络有输入和输出,输入是二维像素阵列(图片),输出是这个图片是什么

    • 原图在与卷积核卷积之后,变成新的矩阵,(相当于是卷积核将原图的特征提取之后反应在了新图像上)
    • 卷积(convolution)
      • 卷积思想是用一个较小的卷积核对图像进行局部提取,以此可以增加参数的共享,减少随着神经网络的加深,节点数变多而带来的巨大计算量(提取输入图片的信息)
    • 池化(pooling)
      • 由于一些图片的特征特别多,如果要扫描和大量卷积,这将会非常难以计算(计算量空前巨大),为此,引入了池化,把得到的特征图进行缩小(将大量矩阵缩小为一个数)
        • 最大池化(一般都是这个)
        • 平均池化
      • 缩小了图片,但保留了原图的所有特征(采用的是一种过滤的方法,去除冗余的信息,可以减少神经网络节点,加快计算速度。)对卷积层中提取的特征进行挑选
        • 作用
          • 1.选择不受干扰的图像信息
          • 2.对图像进行降维,提高后续特征的感受
          • 3.因为池化层是不进行反向传播的,而且池化层减少了特征图的变量数,所以池化层可以减少计算量
    • ReLUs激活函数(ReLU)
      • 将数字中小于零的全部都变成0(零便于计算)
        • 激活函数:对于人工神经系统模型的学习,理解复杂的非线性函数有十分重要的作用(它们将非线性特征引入到了网络中)
          • 使用激活函数总结
            • 激活函数对模型学习,理解复杂的非线性函数有重要作用
            • 可以引入非线性因素。提高从数据中学习复杂函数的映射能力。
    • 先卷积,然后激活函数,然后池化(三个步骤可以反复进行)
    • 全连接层
      • 将最终池化后的像素铺成一排,乘以相应的权重并相加,得到事物概率,还可以有多层(输入层,隐藏层,输出层)
        • 全连接层将池化层的所有矩阵转化成了一维的特征大向量。一般放在卷积神经网络结构的最后,用于对图片进行分类,到了全连接层,神经网络就要准备输出结果了
    • 反向传播
      • 神经网络先得出一个结果,然后把这个结果和真实的结果相比较
        • 前向传播和反向传播
          • 神经网络的计算主要是这两种:前向传播作用于每一层的输入,通过逐层计算得到计算结果。反向传播:作用于网络的输出,通过计算梯度由深到浅更新网络参数
            • 前向传播是我们通过预先设定好的卷积层,池化层等,按照规定的网络结构一层层的前向计算,得到预测的结果。
            • 反向传播是为了将设定的网络中众多参数一步步调整,使得预期的结果贴近真实值。(显然,参数应该向着目标损失函数下降最快的方向更新,即朝着梯度方向更新。)
    • 损失函数
      • 将神经网络的结果与真实结果的误差进行计算,,这就是损失函数。(我们的目的是将损失函数降到最低,通过无数次训练,使得神经网络自行选择得到最合适的卷积核)
    • 初始参数(超参数)
      • 事先就准备好卷积核的尺寸和数目。。。池化,全链接等等
        • 在机器学习中,超参数是学习阶段设置值的参数,而不是通过训练得到的参数数据(通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数以提高学习的性能和效果。)
          • 设置超参数的常见方法
            • 1.猜测和检查
            • 2.网格搜索
            • 3.随机搜索
            • 4贝叶斯优化
            • 5.MITIE方法
            • 6.LIPO的全局优化法
  • 卷积神经网络解释:是一种包含卷积计算且有深度结构的前馈神经网络
    • CNN特点:能够高效的将大数据量的图片降维成小数据量。能够有效的保留图片的特征 ,符合图片处理原则。
    • CNN两大核心:1.通过卷积操作实现局部连接,这个局部区域大小就是滤波器filter,避免全连接中参数过多,造成无法计算的情况。2.再通过参数共享来缩减实际参数的数量,为实现多层网络提供了可能。
  • CNN卷积神经网络算法原理

    • 全连接神经网络
      • 全连接神经网络的整体结构
        • 此处可以理解为y=f(x),x为输入层,f(x)函数是隐藏层,y是输出层。
          • 卷积神经网络也只是隐藏层变成了卷积核
      • 全连接神经网络的结构单元
        • 希望找出一组参数w和b使得结果最优解
          • 一层一层计算得到新a,使得其与最终值接近
          • 每个隐藏层都有一组w,和b,希望得到最有w,b,使之得到最优值。
      • 激活函数详解
        • 加入激活函数的原因
          • 大多是非线性的激活函数,(也有少量线性(可以理解为图像为非直线的函数)的。线性激活函数使得神经系统一层与百层无异)
        • sigmoid激活函数
          • 激活函数要看它的图像,导数图像,公式(看倒数是为了求得它的最优w和b)
            • sigmoid函数的值域为0到1,适合作为输出层函数,适合做分类任务。
            • 函数导数图像,不希望导数的值为零,这可以说是梯度消失。希望它的导数值可以是个平稳值,同时不要大也不要小
            • 该图像只是接近于零,并非等于零
        • Tanh函数
          • 与sigmoid函数很像,但是值域不同,作用也是不一样
        • relu函数(用的很多)
          • 导数之为零,w,b会不更新,导致神经元死亡
        • relu改进版本(Leaky ReLU函数)
      • 深度学习中,没有最优的激活函数,只有最合适的激活函数(sigmoid函数适合做分类等等)
    • 神经网络其他
      • 前向传播
        • 前向传播就是输入x,经过一系列计算得到y的过程(即模型的计算过程。)
      • 损失函数
        • 即为得出的值与预测的值的误差
      • 神经网络要做的有分类和回归(预测某个值)这几种。
      • 反向传播
        • 利用损失函数进行反向传播,更新每一轮的w和b,使我们的损失函数越来越低
      • 进行步骤
        • 模型训练:1.前向传播,2.计算误差,3.反向传播,4.改善
      • 梯度下降法
        • 梯度下降法是反向传播的一个具体实现过程(利用导数更新w和b。)
          • w是个矩阵,必须用这种方法去求解
      • 图像在计算机中的本质
        • 图像在计算机中实际上就是像素矩阵。
        • 像素点255为白色,0为黑色(灰色图,单通道)
        • 三通道(红绿蓝)的是彩色图
    • 全连接神经网络存在的问题
      • 全连接会把图像压缩成一条,会破坏图像信息,但是CNN却不会损坏。
  • import torch
    
    from torch import nn#nn里面包含了神经网络的各种层(全连接层,池化层,卷积层,还包括了一些卷积函数)
    
    from torchsummary import summary#展示模型的参数,每一层输入输出特征图的大小多少,神经网络的详细参数是多少
    
    
    
    
    
    class LeNet(nn.Module):#继承nnmodule这个库,这样就可以nnmodule中的参数了
    
    #第一步:初始化模型信息
    
        def __init__(self):#初始化,定义一些网络层,激活函数,前向传播的过程(反向传播在train代码中),
    
            super(LeNet, self).__init__()#正常语法
    
    
    
            self.c1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2)#第一层为卷积层,输入28*28*1,卷积核5*5*1*6,步幅stride1,padding2,输出28*28*6
    
            self.sig = nn.Sigmoid()#激活函数为sigmoid
    
            self.s2 = nn.AvgPool2d(kernel_size=2, stride=2)#池化操作,池化感受野(池化核)2*2,步幅为2,输入为28*28*6输出为14*14*6(池化不改变通道数)
    
            self.c3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)#输入14*14*6,卷积核5*5*6*16,步幅为1,padding为0,输出10*10*16
    
            self.s4 = nn.AvgPool2d(kernel_size=2, stride=2)#输出得到5*5*16
    
    
    
            self.flatten = nn.Flatten()#定义平展层(进行平展操作)
    
            self.f5 = nn.Linear(400, 120)#全连接层400为5*5*16
    
            self.f6 = nn.Linear(120, 84)
    
            self.f7 = nn.Linear(84, 10)#最终分类结果为10
    
     #第二步:搭建前向传播       
    
        def forward(self, x):#定义前向传播代码
    
            x = self.sig(self.c1(x))#经过卷积后赋予激活函数
    
            x = self.s2(x)
    
            x = self.sig(self.c3(x))
    
            x = self.s4(x)
    
            x = self.flatten(x)
    
            x = self.f5(x)
    
            x = self.f6(x)
    
            y = self.f7(x)
    
            return y
    
    #主函数,搭建模型
    
    if __name__ =="__main__":
    
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")#定义设备,有gpu用gpu,没有就用cpu
    
        model = LeNet().to(device)#将模型实例化
    
        print(summary(model, (1, 28, 28)))#放入模型,给出数据,进行测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值