-
神经网络有输入和输出,输入是二维像素阵列(图片),输出是这个图片是什么
- 原图在与卷积核卷积之后,变成新的矩阵,(相当于是卷积核将原图的特征提取之后反应在了新图像上)
-
卷积(convolution)
- 卷积思想是用一个较小的卷积核对图像进行局部提取,以此可以增加参数的共享,减少随着神经网络的加深,节点数变多而带来的巨大计算量(提取输入图片的信息)
-
池化(pooling)
- 由于一些图片的特征特别多,如果要扫描和大量卷积,这将会非常难以计算(计算量空前巨大),为此,引入了池化,把得到的特征图进行缩小(将大量矩阵缩小为一个数)
- 最大池化(一般都是这个)
- 平均池化
- 缩小了图片,但保留了原图的所有特征(采用的是一种过滤的方法,去除冗余的信息,可以减少神经网络节点,加快计算速度。)对卷积层中提取的特征进行挑选
- 作用
- 1.选择不受干扰的图像信息
- 2.对图像进行降维,提高后续特征的感受
- 3.因为池化层是不进行反向传播的,而且池化层减少了特征图的变量数,所以池化层可以减少计算量
- 作用
- 由于一些图片的特征特别多,如果要扫描和大量卷积,这将会非常难以计算(计算量空前巨大),为此,引入了池化,把得到的特征图进行缩小(将大量矩阵缩小为一个数)
-
ReLUs激活函数(ReLU)
- 将数字中小于零的全部都变成0(零便于计算)
- 激活函数:对于人工神经系统模型的学习,理解复杂的非线性函数有十分重要的作用(它们将非线性特征引入到了网络中)
- 使用激活函数总结
- 激活函数对模型学习,理解复杂的非线性函数有重要作用
- 可以引入非线性因素。提高从数据中学习复杂函数的映射能力。
- 使用激活函数总结
- 激活函数:对于人工神经系统模型的学习,理解复杂的非线性函数有十分重要的作用(它们将非线性特征引入到了网络中)
- 将数字中小于零的全部都变成0(零便于计算)
- 先卷积,然后激活函数,然后池化(三个步骤可以反复进行)
-
全连接层
- 将最终池化后的像素铺成一排,乘以相应的权重并相加,得到事物概率,还可以有多层(输入层,隐藏层,输出层)
- 全连接层将池化层的所有矩阵转化成了一维的特征大向量。一般放在卷积神经网络结构的最后,用于对图片进行分类,到了全连接层,神经网络就要准备输出结果了
- 将最终池化后的像素铺成一排,乘以相应的权重并相加,得到事物概率,还可以有多层(输入层,隐藏层,输出层)
-
反向传播
- 神经网络先得出一个结果,然后把这个结果和真实的结果相比较
- 前向传播和反向传播
- 神经网络的计算主要是这两种:前向传播作用于每一层的输入,通过逐层计算得到计算结果。反向传播:作用于网络的输出,通过计算梯度由深到浅更新网络参数
- 前向传播是我们通过预先设定好的卷积层,池化层等,按照规定的网络结构一层层的前向计算,得到预测的结果。
- 反向传播是为了将设定的网络中众多参数一步步调整,使得预期的结果贴近真实值。(显然,参数应该向着目标损失函数下降最快的方向更新,即朝着梯度方向更新。)
- 神经网络的计算主要是这两种:前向传播作用于每一层的输入,通过逐层计算得到计算结果。反向传播:作用于网络的输出,通过计算梯度由深到浅更新网络参数
- 前向传播和反向传播
- 神经网络先得出一个结果,然后把这个结果和真实的结果相比较
-
损失函数
- 将神经网络的结果与真实结果的误差进行计算,,这就是损失函数。(我们的目的是将损失函数降到最低,通过无数次训练,使得神经网络自行选择得到最合适的卷积核)
-
初始参数(超参数)
- 事先就准备好卷积核的尺寸和数目。。。池化,全链接等等
- 在机器学习中,超参数是学习阶段设置值的参数,而不是通过训练得到的参数数据(通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数以提高学习的性能和效果。)
- 设置超参数的常见方法
- 1.猜测和检查
- 2.网格搜索
- 3.随机搜索
- 4贝叶斯优化
- 5.MITIE方法
- 6.LIPO的全局优化法
- 设置超参数的常见方法
- 在机器学习中,超参数是学习阶段设置值的参数,而不是通过训练得到的参数数据(通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数以提高学习的性能和效果。)
- 事先就准备好卷积核的尺寸和数目。。。池化,全链接等等
- 卷积神经网络解释:是一种包含卷积计算且有深度结构的前馈神经网络
- CNN特点:能够高效的将大数据量的图片降维成小数据量。能够有效的保留图片的特征 ,符合图片处理原则。
- CNN两大核心:1.通过卷积操作实现局部连接,这个局部区域大小就是滤波器filter,避免全连接中参数过多,造成无法计算的情况。2.再通过参数共享来缩减实际参数的数量,为实现多层网络提供了可能。
-
CNN卷积神经网络算法原理
-
全连接神经网络
-
全连接神经网络的整体结构
- 此处可以理解为y=f(x),x为输入层,f(x)函数是隐藏层,y是输出层。
- 卷积神经网络也只是隐藏层变成了卷积核
- 此处可以理解为y=f(x),x为输入层,f(x)函数是隐藏层,y是输出层。
-
全连接神经网络的结构单元
- 希望找出一组参数w和b使得结果最优解
-
- 一层一层计算得到新a,使得其与最终值接近
- 每个隐藏层都有一组w,和b,希望得到最有w,b,使之得到最优值。
-
激活函数详解
- 加入激活函数的原因
- 大多是非线性的激活函数,(也有少量线性(可以理解为图像为非直线的函数)的。线性激活函数使得神经系统一层与百层无异)
- sigmoid激活函数
- 激活函数要看它的图像,导数图像,公式(看倒数是为了求得它的最优w和b)
- sigmoid函数的值域为0到1,适合作为输出层函数,适合做分类任务。
- 函数导数图像,不希望导数的值为零,这可以说是梯度消失。希望它的导数值可以是个平稳值,同时不要大也不要小
- 该图像只是接近于零,并非等于零
- 激活函数要看它的图像,导数图像,公式(看倒数是为了求得它的最优w和b)
- Tanh函数
- 与sigmoid函数很像,但是值域不同,作用也是不一样
- relu函数(用的很多)
- 导数之为零,w,b会不更新,导致神经元死亡
- relu改进版本(Leaky ReLU函数)
- 加入激活函数的原因
- 深度学习中,没有最优的激活函数,只有最合适的激活函数(sigmoid函数适合做分类等等)
-
- 神经网络其他
- 前向传播
- 前向传播就是输入x,经过一系列计算得到y的过程(即模型的计算过程。)
- 损失函数
- 即为得出的值与预测的值的误差
- 即为得出的值与预测的值的误差
- 神经网络要做的有分类和回归(预测某个值)这几种。
- 反向传播
- 利用损失函数进行反向传播,更新每一轮的w和b,使我们的损失函数越来越低
- 进行步骤
- 模型训练:1.前向传播,2.计算误差,3.反向传播,4.改善
- 梯度下降法
- 梯度下降法是反向传播的一个具体实现过程(利用导数更新w和b。)
- w是个矩阵,必须用这种方法去求解
- 梯度下降法是反向传播的一个具体实现过程(利用导数更新w和b。)
- 图像在计算机中的本质
- 图像在计算机中实际上就是像素矩阵。
- 像素点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)))#放入模型,给出数据,进行测试
卷积神经网络学习(搭建模型)
最新推荐文章于 2024-06-19 16:36:40 发布