CIFAR10分类问题

本文主要是用来记录自己学习过程以及方便忘了回头来看的
CIFAR10分类问题_第1张图片这里主要是transpose中的compose函数的功能,该函数功能为进行一系列transoforms操作,用于进行批归一化(bn),首先归一化主要是因为激活函数有饱和的阶段,归一化可以使所有数据都尽量被激活使数据尽量在一个量级,所以批归一化在激活函数之前,防止前层数据分布变化影响后层数据分布,在compose内通过【】以及,分隔要进行的transpose操作,transforms.ToTensor,该函数主要进行的是将图像numpy(w,h,c)转变为tensor的(c,h,w),并进行归一化(把数据压缩到0-1),因为像素值在0-255所以Totensor又将每个像素值/255,tranforms.Normalize该函数主要功能为进行标准化处理使值位于(-1,1)内,其中参数mean为平均数,std为标准差,这两个数据是根据不同数据集自行算出来的标准化处理的内部操作为因为图像输入为三通道所以mean和std都是三个值外部算好为0.5与0.5,计算时用的 x = (x - mean)/std这个公式,这个公式要知道因为后面去归一化显示图片要用,
CIFAR10下载方式与mnist类似参数download参数控制是否下载,transform控制数据变换,train为true下载数据集中的训练集,为false下载测试集,root规定下载存储地址。dataloader方法设置批训练批次batchsize,线程数,以及是否随机取样。这是一个十分类问题因此设置10个类别分别为10个不类别图像的标签。维度问题这篇文章写得比较好:https://blog.csdn.net/wendygelin/article/details/89094968
下面主要定义的图像显示主要功能为去归一化和图片显示前面标准化公式为x = (x - mean)/std所以去标准化要先std再+mean实现去标准化,之后先将tensor图像(因为之前Totensor实现了先将shape变为(c,h,w)再除255的操作)进行numpy类型转换转换为ndarry类型后利用transpose函数,transpose函数主要是转换为度例如一个矩阵x为shape(2,2,3)第一个2索引为0第二个2索引为1第三个数索引为2所以transpose(x,(1,0,2))意思就是在索引层操作将一维与二维交换虽说都是2但还是变了,另外注意维数是从1开始的但是维数的索引是从0开始的,此处变维度主要是为了把Totensor后shape(c,h,w)变回(h,w,c)形成图像显示出来 。
transpose用法:https://blog.csdn.net/qq_37377691/article/details/80086480CIFAR10分类问题_第2张图片
定义卷积层的初始化与前馈,conv2d为二维卷积的含义,其常用参数有in_channels,out_channels,kernal_size,stride,padding,其中前两个标实输入的通道数与输出的通道数,后三个分别为卷积核大小、步数、补0.这次存在两种初始化卷积层的方式一种是将卷积层、激活函数、池化层放到一个conv1内调用sequential方法(一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。)另一种为将所有conv、pool、以及输入输出的层数在初始化建立好后再foward中调用,这两种方法前者有序形象但是不能显示的表示图像进入卷积后的输入输出层数,后者可以显示表示但是需要自行在fowad中搭建网络,这里还有一个torch.view要注意,这个函数主要是用来将batch加入维度一开始我们都没考虑batch,view函数类似reshape函数,说下reshape函数,比如一个矩阵(3.,3,2),这是一个由三个3
2组成的矩阵调用reshape(2,3,3),他输出的为一个由两个33组成的矩阵这些矩阵的元素由初始矩阵按顺序取元素,返回来看view此处view(-1,1655),-1表示自适应的意思,意思就是说输入为1655像素的图像(有1655列),自适应在所有像素的大范围下一共能有多少行因为你输入的x为带批次的数据所以就可以把每一张165*5的图像拉成一维从而便于后文的linear函数进行数据处理,这里linear输入必须是一个一维数据这也是做处理的原因,linear函数相当于一个线性映射(线性方程)一开始这个线性方程自然不知道自己是个啥,但是通过后面的反向传播学习参数他就会慢慢向着最恰当的方程方向转变CIFAR10分类问题_第3张图片下图是莫凡教程里搭建的:https://morvanzhou.github.io/tutorials/machine-learning/torch/4-01-CNN/CIFAR10分类问题_第4张图片
最后是训练过程定义损失为交叉熵损失优化器用SGD(暂时还没弄懂和adam有什么区别留个坑以后回来补)优化器三个参数parameters、lr、momentu,parameter化的参数lr为学习率一般这两个参数足够此处用了动量梯度下降增添了动量,
调用批处理这里有个if name == ‘main’:这个东西好像win10不加就报错原因我还不知道。。。首先从先前存储的批处理存储里调用信息并实例化,他会返回两个值一个是你输入的图像一个是标签也就是类别利用zerograd将优化器梯度优化为0利于后面传入新梯度将input中的图像传入net(此处带批次传入批次为在dataload中设置好的批次)算出10个数令他与label进行损失比较后反向传播优化参数,说下这里的深层原理其实损失比较的是这10个数中最大数的位置令这个位置索引越来越接近label中属于该图像的类别索引,比如输入一张图是一只鸟这只鸟的标签在我们设置的classes的第二个的位置那我们的损失就会不断反向传播令我们output出的十个数的最大值出现在第二个的位置,也就是测试的时候predict=torch.max(outputs.data,1)[1]这个的意思是返回每一行最大值的索引【1】返回索引【0】返回数据,默认返回索引加数据()中的1表示返回行的最大值0表示返回列的(这里有点别扭切记)max详细解释https://blog.csdn.net/Z_lbj/article/details/79766690
此处分割图片
CIFAR10分类问题_第5张图片
CIFAR10分类问题_第6张图片

你可能感兴趣的:(cv,cv)