卷积神经网络CNN相关代码注释
- 格式:pdf
- 大小:189.89 KB
- 文档页数:11
卷积神经网络算法分析及图像处理示例卷积神经网络(Convolutional Neural Network, CNN)是一种广泛应用于图像处理、语音识别等领域的深度神经网络,在计算机视觉中被广泛应用。
它的特殊之处在于,它的网络结构与人类的视觉神经结构有异曲同工之妙,能够有效提取图片中的图像特征。
下面将介绍我们是如何应用卷积神经网络对图像进行处理的,并对算法进行分析。
首先来看卷积神经网络的基本算法思想。
卷积神经网络是由卷积层、池化层、全连接层等基本组件构成的,其中卷积层是卷积神经网络的核心,因为它负责特征提取。
这么说可能还不是很清楚,下面就来详细分析一下卷积神经网络的算法。
卷积神经网络的算法分析主要分为两个方面:卷积层的算法和反向传播算法。
1. 卷积层的算法卷积神经网络的卷积层基本操作是使用固定大小的窗口在输入特征图(inputfeature map)的每个位置上对应进行卷积,然后将这些卷积结果组合成输出特征图(output feature map)。
一个卷积滤波器(卷积核)从输入特征图的左上角开始移动,每次向右移动一个像素,然后再向下移动一个像素。
卷积核内的值与输入特征值相乘之和(即内积)即为卷积结果,而这个卷积结果则成为输出特征值。
在卷积过程中,卷积核通常是可以学习的,也就是说,网络会自适应地训练卷积核以自动提取有用的特征。
这个训练过程是通过反向传播实现的。
2. 反向传播算法反向传播算法是卷积神经网络使用的一种优化算法,用于计算网络的误差梯度,以便对网络进行调整。
反向传播算法主要分为两个步骤:前向传播和反向传播。
前向传播是卷积神经网络中的重要环节,通过这一步骤可以得到每个节点的输出(forward pass)。
它通过不断迭代多次前向传播来计算最终输出。
反向传播是指统计误差并利用误差信息来训练网络(backward pass)。
它通过计算误差的反向传播,逐层更新每个节点的权重来训练网络,完成优化操作。
如何用卷积神经网络CNN识别手写数字集?前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP,准确率只有98.19%,然后不断改进,现在是99.78%,然而我看到排名第一是100%,心碎= =,于是又改进了一版,现在把最好的结果记录一下,如果提升了再来更新。
手写数字集相信大家应该很熟悉了,这个程序相当于学一门新语言的“Hello World”,或者mapreduce的“WordCount”:)这里就不多做介绍了,简单给大家看一下:复制代码1 # Author:Charlotte2 # Plot mnist dataset3 from keras.datasets import mnist4 import matplotlib.pyplot as plt5 # load the MNIST dataset6 (X_train, y_train), (X_test, y_test) = mnist.load_data()7 # plot 4 images as gray scale8 plt.subplot(221)9 plt.imshow(X_train[0], cmap=plt.get_cmap('PuBuGn_r'))10 plt.subplot(222)11 plt.imshow(X_train[1], cmap=plt.get_cmap('PuBuGn_r'))12 plt.subplot(223)13 plt.imshow(X_train[2], cmap=plt.get_cmap('PuBuGn_r'))14 plt.subplot(224)15 plt.imshow(X_train[3], cmap=plt.get_cmap('PuBuGn_r'))16 # show the plot17 plt.show()复制代码图:1.BaseLine版本一开始我没有想过用CNN做,因为比较耗时,所以想看看直接用比较简单的算法看能不能得到很好的效果。
BP 神经⽹络与卷积神经⽹络(CNN )BP 神经⽹络与卷积神经⽹络(CNN )1、BP 神经⽹络 1.1 神经⽹络基础神经⽹络的基本组成单元是神经元。
神经元的通⽤模型如图 1所⽰,其中常⽤的激活函数有阈值函数、sigmoid 函数和双曲正切函数。
图 1 神经元模型 神经元的输出为:神经⽹络是将多个神经元按⼀定规则联结在⼀起⽽形成的⽹络,如图 2所⽰。
图 2 神经⽹络⽰意图从图 2可以看出,⼀个神经⽹络包括输⼊层、隐含层(中间层)和输出层。
输⼊层神经元个数与输⼊数据的维数相同,输出层神经元个数与需要拟合的数据个数相同,隐含层神经元个数与层数就需要设计者⾃⼰根据⼀些规则和⽬标来设定。
在深度学习出现之前,隐含层的层数通常为⼀层,即通常使⽤的神经⽹络是3层⽹络。
以通⽤的神经⽹络模型来分析神经⽹络的输出。
⾸先规定⼀些参数的意义:⽤ 来表⽰第 l 层第j 个节点和第l+1层第i 个节点之间的权值,激活函数为f(x),第l 层⼀共有 个节点,偏置参数 ,则第l+1层第j 个节点的输出为:设置⼀个中间变量 ,⽽l+1层的输⼊与上⼀层对应神经元的输出是相同的,即 ,因此⽹络中某个神经元的输出可写如下等式:第 层的输出,⼜是下⼀层的输⼊。
设⼀共有 层⽹络(包含输出和输⼊),则⽹络输出层第i 个节点的输出为:由以上⼏个等式就可以得到从对应输⼊的输出层某个神经元的输出值。
那怎么保证输出的值是所想要的?通常采⽤后向反馈⽅法,y =f()∑i=1mw i x i w l+1ij l n θl =f(+)O l+1j ∑j=1l nw l+1ij I l+1iθl =+z l+1∑l nj=1w l+1ij I l+1i θl =I l+1i O l i=f()=f(+)=f(+)O l+1jzl+1∑j=1l nw l+1ij I l+1i θl ∑j=1l nw l+1ij O li θl l +1m =f(+)O m i∑i=1l m−1w m ij I mi θm−1将误差层层传递,并利⽤梯度下降法更新每⼀层的参数,这就是BP 神经⽹络。
基于matlab的卷积神经网络(CNN)讲解及代码转载自:/walegahaha/article/details/516030401.经典反向传播算法公式详细推导2.卷积神经网络(CNN)反向传播算法公式详细推导网上有很多关于CNN的教程讲解,在这里我们抛开长篇大论,只针对代码来谈。
本文用的是matlab编写的deeplearning toolbox,包括NN、CNN、DBN、SAE、CAE。
在这里我们感谢作者编写了这样一个简单易懂,适用于新手学习的代码。
由于本文直接针对代码,这就要求读者有一定的CNN基础,可以参考Lecun的Gradient-Based Learning Applied to Document Recognition和tornadomeet的博文首先把Toolbox下载下来,解压缩到某位置。
然后打开Matlab,把文件夹内的util和data利用Set Path添加至路径中。
接着打开tests 文件夹的test_example_CNN.m。
最后在文件夹CNN中运行该代码。
下面是test_example_CNN.m中的代码及注释,比较简单。
load mnist_uint8; %读取数据% 把图像的灰度值变成0~1,因为本代码采用的是sigmoid激活函数train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 卷积网络的结构为 6c-2s-12c-2s% 1 epoch 会运行大约200s,错误率大约为11%。
而100 epochs 的错误率大约为1.2%。
rand('state',0) %指定状态使每次运行产生的随机结果相同yers = {struct('type', 'i') % 输入层struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) % 卷积层struct('type', 's', 'scale', 2) % pooling层struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) % 卷积层struct('type', 's', 'scale', 2) % pooling层};opts.alpha = 1; % 梯度下降的步长opts.batchsize = 50; % 每次批处理50张图opts.numepochs = 1; % 所有图片循环处理一次cnn = cnnsetup(cnn, train_x, train_y); % 初始化CNNcnn = cnntrain(cnn, train_x, train_y, opts); % 训练CNN [er, bad] = cnntest(cnn, test_x, test_y); % 测试CNN%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');•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下面是cnnsetup.m中的代码及注释。
⼀⽂看懂卷积神经⽹络-CNN(基本原理独特价值实际应⽤)卷积神经⽹络 – CNN 最擅长的就是图⽚的处理。
它受到⼈类视觉神经系统的启发。
CNN 有2⼤特点:能够有效的将⼤数据量的图⽚降维成⼩数据量能够有效的保留图⽚特征,符合图⽚处理的原则⽬前 CNN 已经得到了⼴泛的应⽤,⽐如:⼈脸识别、⾃动驾驶、美图秀秀、安防等很多领域。
CNN 解决了什么问题?在 CNN 出现之前,图像对于⼈⼯智能来说是⼀个难题,有2个原因:图像需要处理的数据量太⼤,导致成本很⾼,效率很低图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不⾼下⾯就详细说明⼀下这2个问题:需要处理的数据量太⼤图像是由像素构成的,每个像素⼜是由颜⾊构成的。
现在随随便便⼀张图⽚都是 1000×1000 像素以上的,每个像素都有RGB 3个参数来表⽰颜⾊信息。
假如我们处理⼀张 1000×1000 像素的图⽚,我们就需要处理3百万个参数!1000×1000×3=3,000,000这么⼤量的数据处理起来是⾮常消耗资源的,⽽且这只是⼀张不算太⼤的图⽚!卷积神经⽹络 – CNN 解决的第⼀个问题就是「将复杂问题简化」,把⼤量参数降维成少量参数,再做处理。
更重要的是:我们在⼤部分场景下,降维并不会影响结果。
⽐如1000像素的图⽚缩⼩成200像素,并不影响⾁眼认出来图⽚中是⼀只猫还是⼀只狗,机器也是如此。
保留图像特征图⽚数字化的传统⽅式我们简化⼀下,就类似下图的过程:图像简单数字化⽆法保留图像特征图像的内容假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产⽣完全不同的数据表达。
但是从视觉的⾓度来看,图像的内容(本质)并没有发⽣变化,只是位置发⽣了变化。
(本质)并没有发⽣变化,只是位置发⽣了变化所以当我们移动图像中的物体,⽤传统的⽅式的得出来的参数会差异很⼤!这是不符合图像处理的要求的。
⽽ CNN 解决了这个问题,他⽤类似视觉的⽅式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
【图像识别】基于卷积神经⽹络(CNN)实现垃圾分类Matlab源码⼀、垃圾分类如何通过垃圾分类管理,最⼤限度地实现垃圾资源利⽤,减少垃圾处置量,改善⽣存环境质量,是当前世界各国共同关注的迫切问题之⼀。
根据国家制定的统⼀标准,现在⽣活垃圾被⼴泛分为四类,分别是可回收物、餐厨垃圾、有害垃圾和其他垃圾。
可回收物表⽰适宜回收和资源利⽤的垃圾,主要包括废纸、塑料、玻璃、⾦属和布料五⼤类,⽤蓝⾊垃圾容器收集,通过综合处理回收利⽤。
餐厨垃圾包括剩菜剩饭、⾻头、菜根菜叶、果⽪等⾷品类废物,⽤绿⾊垃圾容器收集等等。
但是随着深度学习技术的发展,为了简单⾼效地对⽣活垃圾进⾏识别分类,本篇⽂章将实现⼀种基于卷积神经⽹络的垃圾分类识别⽅法。
该⽅法只需要对图像进⾏简单的预处理,CNN模型便能够⾃动提取图像特征且池化过程能够减少参数数量,降低计算的复杂度,实验结果表明卷积神经⽹络,能克服传统图像分类算法的诸多缺点,当然更为复杂的模型等待⼤家去实验研究。
但是⽬前认为采⽤VGG或者global 池化⽅式可能效果更好⼀点。
⼆、卷积神经⽹络CNN卷积神经⽹络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经⽹络⾮常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。
每个神经元都接收⼀些输⼊,并做⼀些点积计算,输出是每个分类的分数,普通神经⽹络⾥的⼀些计算技巧到这⾥依旧适⽤。
所以哪⾥不同呢?卷积神经⽹络默认输⼊是图像,可以让我们把特定的性质编码⼊⽹络结构,使是我们的前馈函数更加有效率,并减少了⼤量参数。
具有三维体积的神经元(3D volumes of neurons)卷积神经⽹络利⽤输⼊是图⽚的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经⽹络的深度,⽽是⽤来描述神经元的) 。
⽐如输⼊的图⽚⼤⼩是 32 × 32 × 3 (rgb),那么输⼊神经元就也具有 32×32×3 的维度。
卷积神经网络CNN代码解析deepLearnToolbox-master是一个深度学习matlab包,里面含有很多机器学习算法,如卷积神经网络CNN,深度信念网络DBN,自动编码AutoEncoder(堆栈SAE,卷积CAE)的作者是Rasmus Berg Palm(************************)代码下载:https:///rasmusbergpalm/DeepLearnToolbox这里我们介绍deepLearnToolbox-master中的CNN部分。
DeepLearnToolbox-master中CNN内的函数:调用关系为:该模型使用了mnist的数字mnist_uint8.mat作为训练样本,作为cnn的一个使用样例,每个样本特征为一个28*28=的向量。
网络结构为:让我们来看看各个函数:一、Test_example_CNN: (2)三、cnntrain.m (5)四、cnnff.m (6)五、cnnbp.m (7)五、cnnapplygrads.m (10)六、cnntest.m (10)一、Test_example_CNN:Test_example_CNN:1设置CNN的基本参数规格,如卷积、降采样层的数量,卷积核的大小、降采样的降幅2 cnnsetup函数初始化卷积核、偏置等3 cnntrain函数训练cnn,把训练数据分成batch,然后调用3.1 cnnff 完成训练的前向过程,3.2 cnnbp计算并传递神经网络的error,并计算梯度(权重的修改量)3.3 cnnapplygrads 把计算出来的梯度加到原始模型上去4 cnntest 函数,测试当前模型的准确率该模型采用的数据为mnist_uint8.mat,含有70000个手写数字样本其中60000作为训练样本,10000作为测试样本。
把数据转成相应的格式,并归一化。
设置网络结构及训练参数初始化网络,对数据进行批训练,验证模型准确率绘制均方误差曲线二、Cnnsetup.m该函数你用于初始化CNN的参数。
基于CNN-SVM-GA的图像分类系统的设计与实现1.1题目的主要研究内容(1)工作的主要描述使用CNN-SVM-GA遗传算法对图像进行分类。
对图像数据集进行数据预处理,并将数据集分为CIFAR-10数据集训练集和测试集;建立卷积神经网络模型,用第一步的训练集和测试集对此模型进行训练;提取训练好的模型全连接层前的所有层构成一个新的模型,此模型输出的是一个特征向量;对提取出的特征向量进行PCA特征降维,减少SVM的训练时间,形成新的训练集和测试集去训练SVM模型,用遗传算法优化支持向量机的g和c参数。
(2)系统流程图图11.2题目研究的工作基础或实验条件(1)硬件环境(MacBook Pro)(2)软件环境(pycharm,python3.9)1.3理论基础(1)卷积神经网络(CNN)卷积神经网络(CNN)是典型的前馈神经网络,由输入层,隐藏层和输出层组成。
隐藏层由卷积层,池化层和全连接层组成。
卷积模拟单个神经元对视觉刺激的反应。
它使用卷积层卷积输入数据,然后将结果传输到下一层。
卷积层由一组卷积核组成。
尽管这些内核具有较小的感知视野,但是内核延伸到输入数据的整个深度。
卷积运算可以提取输入数据的深层特征。
卷积神经网络通过卷积、池化等操作可以实现特征的自动提取,再通过全连接层实现分类。
卷积神经网络的结构:一般地,卷积神经网络由输入层、卷积层、RELU层、池化层和全连接层构成,通过梯度下降的方式训练网络模型的参数,从而实现分类。
下面将对每类层进行介绍。
卷积层。
卷积神经网络的核心功能(特征提取)由卷积层完成。
卷积层由许多可学习的卷积核(滤波器)构成,滤波器按照一定的步长对输入的张量进行遍历,当遇到某些类型的形状特征时就激活。
池化层。
池化层又可称为下采样层,通过池化操作可以减少特征图的参数量,减少运算量。
池化层对每个通道的特征图进行操作,不改变通道数,但减少每个通道的特征图的大小。
常用的池化操作有均值池化和最大池化。
Python中的CNN网络实现方法卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,已经在图像识别、自然语言处理、语音识别等领域取得了非常好的效果。
本文将介绍Python中CNN网络的实现方法,并且通过实例展示如何构建CNN网络。
1.卷积神经网络的基本概念卷积神经网络主要由卷积层、池化层、全连接层组成,其中卷积层是最关键的部分。
卷积层的主要作用是提取特征,输入数据经过多次卷积和池化操作后,最终得到的是一个特征图。
卷积神经网络是通过多组卷积核来提取输入数据的特征的。
卷积核是一个小型的矩阵,用于和输入的数据进行卷积。
卷积的结果是一个特征图,这个特征图不仅仅是输入数据的副本,而是提取了输入数据的各种特征,可以用这个特征图来进行下一步的处理。
池化层是在卷积层之后添加的,主要作用是为了进一步降维,减少神经网络的计算量,同时不影响特征图的特征信息。
全连接层是将池化层的输出进行展开,然后进行前向传递和反向传播。
在反向传播时,每一个全连接层的节点将会计算出其对下一层中所有节点的误差,并将其向前传递。
2. Python中实现卷积神经网络的步骤在Python中实现CNN网络的具体步骤如下:1)数据预处理:将数据准备好作为CNN网络的模型输入。
这个步骤通常包括数据归一化、数据增强、数据划分等操作。
2)构建CNN模型:CNN模型主要由卷积层、池化层、全连接层等模块组成。
在Python中,可以使用Keras或TensorFlow等框架来构建CNN模型,这些框架提供了许多预定义的卷积层、池化层等模块,大大简化了模型搭建的流程。
3)编译CNN模型:在构建CNN模型后,需要使用compile方法对模型进行编译,需要指定损失函数、优化函数和评估指标等。
4)训练CNN模型:训练CNN模型需要调用fit方法,传入训练数据和标签进行训练。
在训练过程中,需要指定批次大小、训练次数等参数。
【机器学习基础】卷积神经⽹络(CNN)基础最近⼏天陆续补充了⼀些“线性回归”部分内容,这节继续机器学习基础部分,这节主要对CNN的基础进⾏整理,仅限于基础原理的了解,更复杂的内容和实践放在以后再进⾏总结。
卷积神经⽹络的基本原理 前⾯对全连接神经⽹络和深度学习进⾏了简要的介绍,这⼀节主要对卷积神经⽹络的基本原理进⾏学习和总结。
所谓卷积,就是通过⼀种数学变换的⽅式来对特征进⾏提取,通常⽤于图⽚识别中。
既然全连接的神经⽹络可以⽤于图⽚识别,那么为什么还要⽤卷积神经⽹络呢?(1)⾸先来看下⾯⼀张图⽚: 在这个图⽚当中,鸟嘴是⼀个很明显的特征,当我们做图像识别时,当识别到有“鸟嘴”这样的特征时,可以具有很⾼的确定性认为图⽚是⼀个鸟类。
那么,在提取特征的过程中,有时就没有必要去看完整张图⽚,只需要⼀⼩部分就能识别出⼀定具有代表的特征。
因此,使⽤卷积就可以使某⼀个特定的神经元(在这⾥,这个神经元可能就是⽤来识别“鸟嘴”的)仅仅处理带有该特征的部分图⽚就可以了,⽽不必去看整张图⽚。
那么这样就会使得这个神经元具有更少的参数(因为不⽤再跟图⽚的每⼀维输⼊都连接起来)。
(2)再来看下⾯⼀组图⽚:上⾯两张图⽚都是鸟类,⽽不同的是,两只鸟的“鸟嘴”的位置不同,但在普通的神经⽹络中,需要有两个神经元,⼀个去识别左上⾓的“鸟嘴”,另⼀个去识别中间的“鸟嘴”: 但其实这两个“鸟嘴”的形状是⼀样的,这样相当于上⾯两个神经元是在做同⼀件事情。
⽽在卷积神经⽹络中,这两个神经元可以共⽤⼀套参数,⽤来做同⼀件事情。
(3)对样本进⾏⼦采样,往往不会影响图⽚的识别。
如下⾯⼀张图: 假设把⼀张图⽚当做⼀个矩阵的话,取矩阵的奇数⾏和奇数列,可看做是对图⽚的⼀种缩放,⽽这种缩放往往不会影响识别效果。
卷积神经⽹络中就可以对图⽚进⾏缩放,是图⽚变⼩,从⽽减少模型的参数。
卷积神经⽹络的基本结构如图所⽰: 从右到左,输⼊⼀张图⽚→卷积层→max pooling(池化层)→卷积层→max pooling(池化层)→......→展开→全连接神经⽹络→输出。
cnnexamples.m[plain]view plaincopy1.clear all;close all;clc;2.addpath('../data');3.addpath('../util');4.load mnist_uint8;5.6.train_x=double(reshape(train_x',28,28,60000))/255;7.test_x=double(reshape(test_x',28,28,10000))/255;8.train_y=double(train_y');9.test_y=double(test_y');10.11.%%ex112.%will run1epoch in about200second and get around11%error.13.%With100epochs you'll get around1.2%error14.yers={16.struct('type','i')%input layer17.struct('type','c','outputmaps',6,'kernelsize',5)%convolution layer18.struct('type','s','scale',2)%sub sampling layer19.struct('type','c','outputmaps',12,'kernelsize',5)%convolution layer20.struct('type','s','scale',2)%subsampling layer21.};22.23.%这里把cnn的设置给cnnsetup,它会据此构建一个完整的CNN网络,并返回n=cnnsetup(cnn,train_x,train_y);25.26.%学习率27.opts.alpha=1;28.%每次挑出一个batchsize的batch来训练,也就是每用batchsize个样本就调整一次权值,而不是29.%把所有样本都输入了,计算所有样本的误差了才调整一次权值30.opts.batchsize=50;31.%训练次数,用同样的样本集。
我训练的时候:32.%1的时候11.41%error33.%5的时候4.2%error34.%10的时候2.73%error35.opts.numepochs=10;36.37.%然后开始把训练样本给它,开始训练这个CNN网络n=cnntrain(cnn,train_x,train_y,opts);39.40.%然后就用测试样本来测试41.[er,bad]=cnntest(cnn,test_x,test_y);42.43.%plot mean squared error44.plot(cnn.rL);45.%show test error46.disp([num2str(er*100)'%error']);cnnsetup.m[plain]view plaincopy1.function net=cnnsetup(net,x,y)2.inputmaps=1;3.%B=squeeze(A)返回和矩阵A相同元素但所有单一维都移除的矩阵B,单一维是满足size(A,dim)=1的维。
4.%train_x中图像的存放方式是三维的reshape(train_x',28,28,60000),前面两维表示图像的行与列,5.%第三维就表示有多少个图像。
这样squeeze(x(:,:,1))就相当于取第一个图像样本后,再把第三维6.%移除,就变成了28x28的矩阵,也就是得到一幅图像,再size一下就得到了训练样本图像的行数与列数了7.mapsize=size(squeeze(x(:,:,1)));8.9.%下面通过传入net这个结构体来逐层构建CNN网络10.%n=numel(A)返回数组A中元素个数11.%yers中有五个struct类型的元素,实际上就表示CNN共有五层,这里范围的是512.for l=1:numel(yers)%layer13.if strcmp(yers{l}.type,'s')%如果这层是子采样层14.%subsampling层的mapsize,最开始mapsize是每张图的大小28*2815.%这里除以scale=2,就是pooling之后图的大小,pooling域之间没有重叠,所以pooling后的图像为14*1416.%注意这里的右边的mapsize保存的都是上一层每张特征map的大小,它会随着循环进行不断更新17.mapsize=floor(mapsize/yers{l}.scale);18.for j=1:inputmaps%inputmap就是上一层有多少张特征图yers{l}.b{j}=0;%将偏置初始化为020.end21.end22.if strcmp(yers{l}.type,'c')%如果这层是卷积层23.%旧的mapsize保存的是上一层的特征map的大小,那么如果卷积核的移动步长是1,那用24.%kernelsize*kernelsize大小的卷积核卷积上一层的特征map后,得到的新的map的大小就是下面这样25.mapsize=yers{l}.kernelsize+1;26.%该层需要学习的参数个数。
每张特征map是一个(后层特征图数量)*(用来卷积的patch图的大小)27.%因为是通过用一个核窗口在上一个特征map层中移动(核窗口每次移动1个像素),遍历上一个特征map28.%层的每个神经元。
核窗口由kernelsize*kernelsize个元素组成,每个元素是一个独立的权值,所以29.%就有kernelsize*kernelsize个需要学习的权值,再加一个偏置值。
另外,由于是权值共享,也就是30.%说同一个特征map层是用同一个具有相同权值元素的kernelsize*kernelsize的核窗口去感受输入上一31.%个特征map层的每个神经元得到的,所以同一个特征map,它的权值是一样的,共享的,权值只取决于32.%核窗口。
然后,不同的特征map提取输入上一个特征map层不同的特征,所以采用的核窗口不一样,也33.%就是权值不一样,所以outputmaps个特征map就有(kernelsize*kernelsize+1)*outputmaps那么多的权值了34.%但这里fan_out只保存卷积核的权值W,偏置b在下面独立保存35.fan_out=yers{l}.outputmaps*yers{l}.kernelsize^2;36.for j=1:yers{l}.outputmaps%output map37.%fan_out保存的是对于上一层的一张特征map,我在这一层需要对这一张特征map提取outputmaps种特征,38.%提取每种特征用到的卷积核不同,所以fan_out保存的是这一层输出新的特征需要学习的参数个数39.%而,fan_in保存的是,我在这一层,要连接到上一层中所有的特征map,然后用fan_out保存的提取特征40.%的权值来提取他们的特征。
也即是对于每一个当前层特征图,有多少个参数链到前层41.fan_in=inputmaps*yers{l}.kernelsize^2;42.for i=1:inputmaps%input map43.%随机初始化权值,也就是共有outputmaps个卷积核,对上层的每个特征map,都需要用这么多个卷积核44.%去卷积提取特征。
45.%rand(n)是产生n×n的0-1之间均匀取值的数值的矩阵,再减去0.5就相当于产生-0.5到0.5之间的随机数46.%再*2就放大到[-1,1]。
然后再乘以后面那一数,why?47.%反正就是将卷积核每个元素初始化为[-sqrt(6/(fan_in+fan_out)),sqrt(6/(fan_in+fan_out))]48.%之间的随机数。
因为这里是权值共享的,也就是对于一张特征map,所有感受野位置的卷积核都是一样的49.%所以只需要保存的是inputmaps*outputmaps个卷积核。
yers{l}.k{i}{j}=(rand(yers{l}.kernelsize)-0.5)*2*sqrt(6/(fan_in+fan_out));51.endyers{l}.b{j}=0;%将偏置初始化为053.end54.%只有在卷积层的时候才会改变特征map的个数,pooling的时候不会改变个数。
这层输出的特征map个数就是55.%输入到下一层的特征map个数56.inputmaps=yers{l}.outputmaps;57.end58.end59.60.%fvnum是输出层的前面一层的神经元个数。
61.%这一层的上一层是经过pooling后的层,包含有inputmaps个特征map。
每个特征map的大小是mapsize。
62.%所以,该层的神经元个数是inputmaps*(每个特征map的大小)63.%prod:Product of elements.64.%For vectors,prod(X)is the product of the elements of X65.%在这里mapsize=[特征map的行数特征map的列数],所以prod后就是特征map的行*列66.fvnum=prod(mapsize)*inputmaps;67.%onum是标签的个数,也就是输出层神经元的个数。
你要分多少个类,自然就有多少个输出神经元68.onum=size(y,1);69.70.%这里是最后一层神经网络的设定71.%ffb是输出层每个神经元对应的基biases.ffb=zeros(onum,1);73.%ffW输出层前一层与输出层连接的权值,这两层之间是全连接的.ffW=(rand(onum,fvnum)-0.5)*2*sqrt(6/(onum+fvnum));75.endcnntrain.m[plain]view plaincopy1.function net=cnntrain(net,x,y,opts)2.m=size(x,3);%m保存的是训练样本个数3.numbatches=m/opts.batchsize;4.%rem:Remainder after division.rem(x,y)is x-n.*y相当于求余5.%rem(numbatches,1)就相当于取其小数部分,如果为0,就是整数6.if rem(numbatches,1)~=07.error('numbatches not integer');8.end9..rL=[];11.for i=1:opts.numepochs12.%disp(X)打印数组元素。