本周彻底完成了CNN的全部内容,包括CNN的原理,代码实现等。CNN是一种神经网络的framework,跟connected_layer相比,更加侧重于能够保持原来的空间结构不变;我们输入的图片是一个n*n*3的numpy数组,其中n是图片的分辨率,3是RGB颜色空间的数目,如果是全连接层,我们需要将输入的照片reshape成一个向量,例如如果输入照片为32*32*3,那么我们就需要将图片reshape成3072*1的向量,然后再经过权重矩阵的映射得到最终的分数列向量;这么做无疑是将图片的空间结构特性消除了。而CNN则是考虑用一个filter,其形状为size*size*3,来考虑局部的特性。每次用filter与当前size*size*3这么大的numpy数组进行矩阵运算,最终得到一个数字,然后通过不断的横移纵移filter遍历整个输入图片,最终得到一个矩阵。如果原本的尺寸为n,卷积核的尺寸为m,每次移动的步长为stride,并且有F个卷积核则经过该层后的数据规模为((n-m)/stride+1,(n-m)/stride+1,F)。与传统的全连接层相比,CNN无疑是既可以保证原本输入的数据的空间结构不变,又可以得到图片部分区域的局部特性。
除了卷积层,一般还应该具有池化层,池化则是考虑将输入数据进行downsampleing,进行局部采样。其可以起到减少数据规模,减少运算量,防止过拟合的现象出现。此外,由于图片中大部分的特征都是冗余的,所以进行池化层仍然可以保持原来特性不变。此外,由于池化层中实施局部采样得到的新的空间结构中的采样方式的多种多样,可以实现非线性的组合方式,类似于激活函数,比如maxpooling层,就是用了max函数实现局部采样,这样同时可以具有一些激活函数的特性。当然,并非所有的时候池化都是好的,在有的时候,池化层过多可能会导致样本特性丢失过多导致学习能力下降的情况出现。
在这周,同样实现我们一门专业选修课的机器学习的模型(虽然我没选那门课),分别有两个老师的两个大作业:第一是图片分类,第二个是虚假新闻检测,其中图片分类问题是5分类问题,虚假新闻检测是2分类问题,虚假新闻检测还需要用到NLP中一些数据处理的方法。在实现中,同时接触了pytorch和keras两个框架,并且成功安装/运行了GPU版本用来跑模型。最终CNN在图片分类问题上实现了90的准确率,在NLP问题上实现了96的准确率,也算是用框架实战cv和NLP问题的一个小的项目。
这周在给好兄弟们分享神经网络的一些知识的时候,自己也有了一些小的心得体会:现在的机器学习到底在干什么?用已有的数据集训练一个模型,需要寻求一个最佳的模型能够最准确的预测遇到的新的问题。那么训练的这个模型在神经网络中,就是好多好多层中的映射关系,即权重矩阵;那么我们该优化我们的权重矩阵,就是试图最小化损失函数来解决,而这么做的原因是因为我们的损失函数具有一定的意义:在训练中对于原本信息的损失程度,或者在softmax中,我认为可以看做将模型错误分类产生的贡献,我们最小化损失函数也就是在使得模型预测错误的可能性减小,尽可能增大模型预测正确的概率。那么如何通过我们已经训练好的模型进行预测呢,那便是将图片/数据经过这个计算模型,得到一个分数矩阵,通过不同类别分数的高低进行比较,计算机倾向于认为分数较高的那一类作为当前数据的类别。我觉得在神经网络中,以这个作为理解的基础,在以后学习RNN或者ResNet这些更高级更复杂的framework中,可能会有一些比较好的影响。
2022.11.27
标签:池化层,模型,矩阵,11.21,11.27,CNN,size,cv,图片 From: https://www.cnblogs.com/Lbmttw/p/16931090.html