欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年2022年卷积神经网络CNN相关代码注释 .pdf

    • 资源ID:33682235       资源大小:195.44KB        全文页数:11页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年2022年卷积神经网络CNN相关代码注释 .pdf

    cnnexamples.mplainviewplaincopy1.clearall;closeall;clc;2.addpath(./data);3.addpath(./util);4.loadmnist_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.%willrun1 epochinabout200 secondand getaround11% error.13.%With 100epochsyoullgetaround1.2% n.layers= 16.struct(type,i)%inputlayer17.struct(type,c,outputmaps,6,kernelsize,5)%convolutionlayer18.struct(type,s,scale,2)%sub samplinglayer19.struct(type,c,outputmaps,12,kernelsize,5)%convolutionlayer20.struct(type,s,scale,2)%subsamplinglayer21.;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网络名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - n = cnntrain(cnn,train_x,train_y,opts);39.40.% 然后就用测试样本来测试41.er,bad= cnntest(cnn,test_x,test_y);42.43.%plotmean squarederror44.plot(cnn.rL);45.%show testerror46.disp(num2str(er*100)% error);cnnsetup.mplainviewplaincopy1.functionnet= 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.% net.layers中有五个 struct类型的元素,实际上就表示CNN共有五层,这里范围的是512.forl= 1 :numel(net.layers)%layer13.ifstrcmp(net.layersl.type,s)% 如果这层是子采样层14.% subsampling层的 mapsize ,最开始 mapsize是每张图的大小28*2815.% 这里除以 scale=2,就是 pooling之后图的大小, pooling域之间没有重叠,所以 pooling后的图像为14*1416.% 注意这里的右边的mapsize保存的都是上一层每张特征map 的大小,它会随着循环进行不断更新17.mapsize= floor(mapsize/net.layersl.scale);18.forj= 1 :inputmaps% inputmap就是上一层有多少张特征图.layersl.bj= 0;% 将偏置初始化为020.end名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 21.end22.ifstrcmp(net.layersl.type,c)% 如果这层是卷积层23.% 旧的 mapsize保存的是上一层的特征map 的大小,那么如果卷积核的移动步长是 1,那用24.% kernelsize*kernelsize大小的卷积核卷积上一层的特征map 后, 得到的新的map 的大小就是下面这样25.mapsize= mapsize-net.layersl.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= net.layersl.outputmaps*net.layersl.kernelsize2;36.forj= 1 :net.layersl.outputmaps%outputmap37.% fan_out保存的是对于上一层的一张特征map,我在这一层需要对这一张特征 map提取 outputmaps种特征,38.% 提取每种特征用到的卷积核不同,所以fan_out保存的是这一层输出新的特征需要学习的参数个数39.% 而, fan_in保存的是,我在这一层,要连接到上一层中所有的特征map,然后用 fan_out保存的提取特征40.% 的权值来提取他们的特征。也即是对于每一个当前层特征图,有多少个参数链到前层41.fan_in= inputmaps*net.layersl.kernelsize 2;42.fori= 1 :inputmaps%inputmap43.% 随机初始化权值,也就是共有outputmaps个卷积核,对上层的每个特征 map,都需要用这么多个卷积核44.% 去卷积提取特征。45.% rand(n)是产生 nn 的 0-1 之间均匀取值的数值的矩阵,再减去 0.5就相当于产生 -0.5到 0.5 之间的随机数46.% 再 *2就放大到-1,1 。然后再乘以后面那一数,why?名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 47.% 反正就是将卷积核每个元素初始化为-sqrt(6/(fan_in+ fan_out),sqrt(6/(fan_in+ fan_out)48.% 之间的随机数。因为这里是权值共享的,也就是对于一张特征map,所有感受野位置的卷积核都是一样的49.% 所以只需要保存的是inputmaps*outputmaps个卷积核。.layersl.kij= (rand(net.layersl.kernelsize)-0.5)*2 *sqrt(6/(fan_in+ fan_out);.layersl.bj= 0;% 将偏置初始化为053.end54.% 只有在卷积层的时候才会改变特征map 的个数,pooling的时候不会改变个数。这层输出的特征map 个数就是55.% 输入到下一层的特征map 个数56.inputmaps= net.layersl.outputmaps;57.end58.end59.60.% fvnum是输出层的前面一层的神经元个数。61.% 这一层的上一层是经过pooling后的层,包含有inputmaps个特征 map。每个特征map的大小是 mapsize 。62.% 所以,该层的神经元个数是inputmaps* (每个特征map 的大小)63.% prod:Productofelements.64.% Forvectors,prod(X)istheproductoftheelementsofX65.% 在这里mapsize= 特征 map 的行数特征 map 的列数 ,所以 prod 后就是特征 map的行 *列66.fvnum= prod(mapsize)*inputmaps;67.% onum 是标签的个数,也就是输出层神经元的个数。你要分多少个类,自然就有多少个输出神经元68.onum = size(y,1);69.70.% 这里是最后一层神经网络的设定71.% ffb是输出层每个神经元对应的基.ffb= zeros(onum,1);73.% ffW输出层前一层与 输出层连接的权值,这两层之间是全连接的.ffW= (rand(onum,fvnum)-0.5)*2 *sqrt(6/(onum + fvnum);75.endcnntrain.mplainviewplaincopy名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 1.functionnet= cnntrain(net,x,y,opts)2.m = size(x,3);% m 保存的是训练样本个数3.numbatches= m /opts.batchsize;4.% rem:Remainderafterdivision.rem(x,y)isx -n.*y相当于求余5.% rem(numbatches,1)就相当于取其小数部分,如果为0,就是整数6.ifrem(numbatches,1)= 07.error(numbatchesnotinteger);.rL= ;11.fori= 1 :opts.numepochs12.% disp(X)打印数组元素。如果X 是个字符串,那就打印这个字符串13.disp(epochnum2str(i)/num2str(opts.numepochs);14.% tic和 toc是用来计时的,计算这两条语句之间所耗的时间15.tic;16.% P = randperm(N)返回 1,N 之间所有整数的一个随机的序列,例如17.% randperm(6)可能会返回24 5 6 1 318.% 这样就相当于把原来的样本排列打乱,再挑出一些样本来训练19.kk = randperm(m);20.forl= 1 :numbatches21.% 取出打乱顺序后的batchsize个样本和对应的标签22.batch_x= x(:,:,kk(l-1)*opts.batchsize+ 1 :l*opts.batchsize);23.batch_y= y(:,kk(l-1)*opts.batchsize+ 1 :l*opts.batchsize);24.25.% 在当前的网络权值和网络输入下计算网络的输出= cnnff(net,batch_x);% Feedforward27.% 得到上面的网络输出后,通过对应的样本标签用bp 算法来得到误差对网络权值28.% (也就是那些卷积核的元素)的导数= cnnbp(net,batch_y);% Backpropagation30.% 得到误差对权值的导数后,就通过权值更新方法去更新权值= cnnapplygrads(net,opts);32.ifisempty(net.rL).rL(1)= net.L;% 代价函数值,也就是误差值.rL(end+ 1)= 0.99*net.rL(end)+ 0.01*net.L;% 保存历史的误差值,以便画图分析36.end37.toc;38.end39.40.end名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - cnnff.mplainviewplaincopy1.functionnet= cnnff(net,x)2.n = numel(net.layers);% 层数.layers1.a1= x;% 网络的第一层就是输入,但这里的输入包含了多个训练图像4.inputmaps= 1;% 输入层只有一个特征map,也就是原始的输入图像5.6.forl= 2 :n%foreachlayer7.ifstrcmp(net.layersl.type,c)% 卷积层8.%!belowcanprobablybe handledby insanematrixoperations9.% 对每一个输入map,或者说我们需要用outputmaps个不同的卷积核去卷积图像10.forj= 1 :net.layersl.outputmaps%foreachoutputmap11.%createtempoutputmap12.% 对上一层的每一张特征map,卷积后的特征map的大小就是13.%(输入 map宽 -卷积核的宽+ 1)* (输入 map 高 -卷积核高+ 1)14.% 对于这里的层, 因为每层都包含多张特征map,对应的索引保存在每层map的第三维15.% 所以,这里的z 保存的就是该层中所有的特征map 了16.z = zeros(size(net.layersl-1.a1)-net.layersl.kernelsize-1 net.layersl.kernelsize-1 0);17.fori= 1 :inputmaps%foreachinputmap18.%convolvewithcorrespondingkerneland add totemp outputmap19.% 将上一层的每一个特征map(也就是这层的输入map)与该层的卷积核进行卷积20.% 然后将对上一层特征map的所有结果加起来。也就是说,当前层的一张特征 map,是21.% 用一种卷积核去卷积上一层中所有的特征map,然后所有特征map 对应位置的卷积值的和22.% 另外,有些论文或者实际应用中,并不是与全部的特征map 链接的,有可能只与其中的某几个连接23.z = z + convn(net.layersl-1.ai,net.layersl.kij,valid);24.end25.%addbias,passthroughnonlinearity26.% 加上对应位置的基b,然后再用 sigmoid函数算出特征map中每个位置的激活值,作为该层输出特征map名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - .layersl.aj= sigm(z+ net.layersl.bj);28.end29.%setnumberofinputmaps tothislayersnumberofoutputmaps30.inputmaps= net.layersl.outputmaps;31.elseifstrcmp(net.layersl.type,s)% 下采样层32.%downsample33.forj= 1 :inputmaps34.%!replacewithvariable35.% 例如我们要在scale=2的域上面执行mean pooling,那么可以卷积大小为 2*2 ,每个元素都是1/4 的卷积核36.z = convn(net.layersl-1.aj,ones(net.layersl.scale)/(net.layersl.scale2),valid);37.% 因为 convn 函数的默认卷积步长为1, 而 pooling操作的域是没有重叠的,所以对于上面的卷积结果38.% 最终 pooling的结果需要从上面得到的卷积结果中以scale=2为步长,跳着把 mean pooling的值读出来.layersl.aj= z(1:net.layersl.scale:end,1 :net.layersl.scale:end,:);40.end41.end42.end43.44.%concatenateallend layerfeaturemaps intovector45.% 把最后一层得到的特征map拉成一条向量,作为最终提取到的特征向量.fv= ;47.forj= 1 :numel(net.layersn.a)% 最后一层的特征map的个数48.sa = size(net.layersn.aj);% 第 j 个特征 map的大小49.% 将所有的特征map 拉成一条列向量。还有一维就是对应的样本索引。每个样本一列,每列为对应的特征向量.fv= net.fv;reshape(net.layersn.aj,sa(1)*sa(2),sa(3);51.end52.%feedforwardintooutputperceptrons53.% 计算网络的最终输出值。sigmoid(W*X+ b) , 注意是同时计算了batchsize个样本的输出值.o= sigm(net.ffW*net.fv+ repmat(net.ffb,1,size(net.fv,2);55.56.endcnnbp.m名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - plainviewplaincopy1.functionnet= cnnbp(net,y)2.n = numel(net.layers);% 网络层数3.4.%.e= net.o-y;6.%lossfunction7.% 代价函数是均方误差.L= 1/2*sum(net.e(:).2)/size(net.e,2);9.10.% backpropdeltas11.% 这里可以参考UFLDL 的 反向传导算法的说明12.% 输出层的灵敏度或者残差.od= net.e.*(net.o.*(1-net.o);%outputdelta14.% 残差反向传播回前一层.fvd= (net.ffW* net.od);%featurevectordelta16.ifstrcmp(net.layersn.type,c)%.fvd= net.fvd.*(net.fv.*(1-net.fv);18.end19.20.%reshapefeaturevectordeltasintooutputmap style21.sa = size(net.layersn.a1);% 最后一层特征map 的大小。这里的最后一层都是指输出层的前一层22.fvnum= sa(1)*sa(2);% 因为是将最后一层特征map 拉成一条向量,所以对于一个样本来说,特征维数是这样23.forj= 1 :numel(net.layersn.a)% 最后一层的特征map的个数24.% 在 fvd 里面保存的是所有样本的特征向量(在 cnnff.m函数中用特征map拉成的) ,所以这里需要重新25.% 变换回来特征map 的形式。 d 保存的是delta,也就是灵敏度或者残差.layersn.dj= reshape(net.fvd(j-1)*fvnum+ 1):j*fvnum, :),sa(1),sa(2),sa(3);27.end28.29.% 对于输出层前面的层(与输出层计算残差的方式不同)30.forl= (n-1):-1:131.ifstrcmp(net.layersl.type,c)32.forj= 1 :numel(net.layersl.a)% 该层特征 map的个数33.% net.layersl.dj保存的是第 l 层 的 第 j 个 map 的 灵敏度map。 也就是每个神经元节点的delta的值34.% expand 的操作相当于对l+1 层的灵敏度map进行上采样。然后前面的操作相当于对该层的输入a 进行 sigmoid求导35.% 这条公式请参考Noteson ConvolutionalNeuralNetworks名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 36.% fork = 1:size(net.layersl+ 1.dj,3)37.% net.layersl.dj(:,:,k)= net.layersl.aj(:,:,k).*(1-net.layersl.aj(:,:,k).*kron(net.layersl+ 1.dj(:,:,k),ones(net.layersl+ 1.scale)/net.layersl+ 1.scale 2;38.% .layersl.dj= net.layersl.aj.*(1-net.layersl.aj).*(expand(net.layersl+ 1.dj,net.layersl+ 1.scalenet.layersl+ 1.scale1)/net.layersl+ 1.scale 2);40.end41.elseifstrcmp(net.layersl.type,s)42.fori= 1 :numel(net.layersl.a)% 第 l 层特征 map的个数43.z = zeros(size(net.layersl.a1);44.forj= 1 :numel(net.layersl+ 1.a)% 第 l+1 层特征 map的个数45.z = z + convn(net.layersl+ 1.dj,rot180(net.layersl+ 1.kij),full);.layersl.di= z;48.end49.end50.end51.52.% calcgradients53.% 这里与NotesonConvolutionalNeuralNetworks中不同, 这里的子采样层没有参数,也没有54.% 激活函数,所以在子采样层是没有需要求解的参数的55.forl= 2 :n56.ifstrcmp(net.layersl.type,c)57.forj= 1 :numel(net.layersl.a)58.fori= 1 :numel(net.layersl-1.a)59.% dk 保存的是误差对卷积核的导数.layersl.dkij= convn(flipall(net.layersl-1.ai),net.layersl.dj,valid)/size(net.layersl.dj,3);61.end62.% db 保存的是误差对于 bias基 的导数.layersl.dbj= sum(net.layersl.dj(:)/size(net.layersl.dj,3);64.end65.end66.end67.% 最后一层 perceptron的 gradient的计算.dffW= net.od*(net.fv)/size(net.od,2);.dffb= mean(net.od,2);70.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 71.functionX = rot180(X)72.X = flipdim(flipdim(X,1),2);73.end74.endcnnapplygrads.mplainviewplaincopy1.functionnet= cnnapplygrads(net,opts)2.forl= 2 :numel(net.layers)3.ifstrcmp(net.layersl.type,c)4.forj= 1 :numel(net.layersl.a)5.forii= 1 :numel(net.layersl-1.a)6.% 这里没什么好说的,就是普通的权值更新的公式:W_new = W_old-alpha* de/dW(误差对权值导数).layersl.kiij= net.layersl.kiij-opts.alpha*net.layersl.dkiij;.layersl.bj= net.layersl.bj-opts.alpha*net.layersl.dbj;.ffW= net.ffW-opts.alpha*net.dffW;.ffb= net.ffb-opts.alpha*net.dffb;16.endcnntest.mplainviewplaincopy1.functioner,bad= cnntest(net,x,y)2.%= cnnff(net,x);% 前向传播得到输出4.% Y,I= max(X)returnstheindicesofthemaximum valuesinvectorI5.,h= max(net.o);% 找到最大的输出对应的标签6.,a= max(y);% 找到最大的期望输出对应的索引名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 7.bad= find(h= a);% 找到他们不相同的个数,也就是错误的次数8.9.er= numel(bad)/size(y,2);% 计算错误率10.end名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

    注意事项

    本文(2022年2022年卷积神经网络CNN相关代码注释 .pdf)为本站会员(Che****ry)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开