欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    CNN代码理解.docx

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

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

    CNN代码理解.docx

    1、CNN代码理解CNN代码理解 下面是自己对代码的注释:cnnexamples.mclear all; close all; clc;addpath(./data);addpath(./util);load mnist_uint8; 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); % ex1 %will run 1 epoch in about 20

    2、0 second and get around 11% error. %With 100 epochs youll get around 1.2% error cnn.layers = struct(type, i) %input layer struct(type, c, outputmaps, 6, kernelsize, 5) %convolution layer struct(type, s, scale, 2) %subsampling layer struct(type, c, outputmaps, 12,kernelsize, 5) %convolution layer str

    3、uct(type, s, scale, 2)%subsampling layer; % 这里把cnn的设置给cnnsetup,它会据此构建一个完整的CNN网络,并返回cnn = cnnsetup(cnn, train_x, train_y); % 学习率opts.alpha = 1;% 每次挑出一个batchsize的batch来训练,也就是每用batchsize个样本就调整一次权值,而不是% 把所有样本都输入了,计算所有样本的误差了才调整一次权值opts.batchsize = 50; % 训练次数,用同样的样本集。我训练的时候:% 1的时候 11.41% error% 5的时候 4.2%

    4、error% 10的时候 2.73% erroropts.numepochs = 10; % 然后开始把训练样本给它,开始训练这个CNN网络cnn = cnntrain(cnn, train_x, train_y, opts); % 然后就用测试样本来测试er, bad = cnntest(cnn, test_x, test_y); %plot mean squared errorplot(cnn.rL);%show test errordisp(num2str(er*100) % error);cnnsetup.mfunction net = cnnsetup(net, x, y) inpu

    5、tmaps = 1; % B=squeeze(A) 返回和矩阵A相同元素但所有单一维都移除的矩阵B,单一维是满足size(A,dim)=1的维。 % train_x中图像的存放方式是三维的reshape(train_x,28,28,60000),前面两维表示图像的行与列, % 第三维就表示有多少个图像。这样squeeze(x(:, :, 1)就相当于取第一个图像样本后,再把第三维 % 移除,就变成了28x28的矩阵,也就是得到一幅图像,再size一下就得到了训练样本图像的行数与列数了 mapsize =size(squeeze(x(:, :, 1); % 下面通过传入net这个结构体来逐层构建

    6、CNN网络 % n = numel(A)返回数组A中元素个数 % net.layers中有五个struct类型的元素,实际上就表示CNN共有五层,这里范围的是5 for l = 1 :numel(net.layers) % layer ifstrcmp(net.layersl.type, s) % 如果这层是 子采样层 %subsampling层的mapsize,最开始mapsize是每张图的大小28*28 % 这里除以scale=2,就是pooling之后图的大小,pooling域之间没有重叠,所以pooling后的图像为14*14 % 注意这里的右边的mapsize保存的都是上一层每张特征

    7、map的大小,它会随着循环进行不断更新 mapsize =floor(mapsize / net.layersl.scale); for j =1 : inputmaps % inputmap就是上一层有多少张特征图 net.layersl.bj = 0; % 将偏置初始化为0 end end ifstrcmp(net.layersl.type, c) % 如果这层是 卷积层 % 旧的mapsize保存的是上一层的特征map的大小,那么如果卷积核的移动步长是1,那用 %kernelsize*kernelsize大小的卷积核卷积上一层的特征map后,得到的新的map的大小就是下面这样 mapsi

    8、ze =mapsize - net.layersl.kernelsize + 1; % 该层需要学习的参数个数。每张特征map是一个(后层特征图数量)*(用来卷积的patch图的大小) % 因为是通过用一个核窗口在上一个特征map层中移动(核窗口每次移动1个像素),遍历上一个特征map % 层的每个神经元。核窗口由kernelsize*kernelsize个元素组成,每个元素是一个独立的权值,所以 % 就有kernelsize*kernelsize个需要学习的权值,再加一个偏置值。另外,由于是权值共享,也就是 % 说同一个特征map层是用同一个具有相同权值元素的kernelsize*kerne

    9、lsize的核窗口去感受输入上一 % 个特征map层的每个神经元得到的,所以同一个特征map,它的权值是一样的,共享的,权值只取决于 % 核窗口。然后,不同的特征map提取输入上一个特征map层不同的特征,所以采用的核窗口不一样,也 % 就是权值不一样,所以outputmaps个特征map就有(kernelsize*kernelsize+1)* outputmaps那么多的权值了 % 但这里fan_out只保存卷积核的权值W,偏置b在下面独立保存 fan_out= net.layersl.outputmaps * net.layersl.kernelsize 2; for j =1 : net

    10、.layersl.outputmaps % output map %fan_out保存的是对于上一层的一张特征map,我在这一层需要对这一张特征map提取outputmaps种特征, % 提取每种特征用到的卷积核不同,所以fan_out保存的是这一层输出新的特征需要学习的参数个数 % 而,fan_in保存的是,我在这一层,要连接到上一层中所有的特征map,然后用fan_out保存的提取特征 % 的权值来提取他们的特征。也即是对于每一个当前层特征图,有多少个参数链到前层 fan_in =inputmaps * net.layersl.kernelsize 2; fori = 1 : inputm

    11、aps % input map % 随机初始化权值,也就是共有outputmaps个卷积核,对上层的每个特征map,都需要用这么多个卷积核 % 去卷积提取特征。 % rand(n)是产生nn的 0-1之间均匀取值的数值的矩阵,再减去0.5就相当于产生-0.5到0.5之间的随机数 % 再 *2 就放大到 -1, 1。然后再乘以后面那一数,why? % 反正就是将卷积核每个元素初始化为-sqrt(6 / (fan_in + fan_out), sqrt(6 / (fan_in +fan_out) % 之间的随机数。因为这里是权值共享的,也就是对于一张特征map,所有感受野位置的卷积核都是一样的 %

    12、 所以只需要保存的是 inputmaps * outputmaps 个卷积核。 net.layersl.kij = (rand(net.layersl.kernelsize) - 0.5) * 2 *sqrt(6 / (fan_in + fan_out); end net.layersl.bj = 0; % 将偏置初始化为0 end % 只有在卷积层的时候才会改变特征map的个数,pooling的时候不会改变个数。这层输出的特征map个数就是 % 输入到下一层的特征map个数 inputmaps = net.layersl.outputmaps; end end % fvnum 是输出层的前面

    13、一层的神经元个数。 % 这一层的上一层是经过pooling后的层,包含有inputmaps个特征map。每个特征map的大小是mapsize。 % 所以,该层的神经元个数是 inputmaps * (每个特征map的大小) % prod: Productof elements. % For vectors,prod(X) is the product of the elements of X % 在这里 mapsize = 特征map的行数 特征map的列数,所以prod后就是 特征map的行*列 fvnum =prod(mapsize) * inputmaps; % onum 是标签的个数,

    14、也就是输出层神经元的个数。你要分多少个类,自然就有多少个输出神经元 onum = size(y,1); % 这里是最后一层神经网络的设定 % ffb 是输出层每个神经元对应的基biases net.ffb =zeros(onum, 1); % ffW 输出层前一层 与 输出层 连接的权值,这两层之间是全连接的 net.ffW =(rand(onum, fvnum) - 0.5) * 2 * sqrt(6 / (onum + fvnum);endcnntrain.mfunction net = cnntrain(net, x, y, opts) m = size(x, 3); % m 保存的是

    15、训练样本个数 numbatches = m/ opts.batchsize; % rem: Remainder after division. rem(x,y) is x -n.*y 相当于求余 % rem(numbatches,1) 就相当于取其小数部分,如果为0,就是整数 ifrem(numbatches, 1) = 0 error(numbatches not integer); end net.rL = ; for i = 1 : opts.numepochs % disp(X) 打印数组元素。如果X是个字符串,那就打印这个字符串 disp(epoch num2str(i) / num

    16、2str(opts.numepochs); % tic 和 toc 是用来计时的,计算这两条语句之间所耗的时间 tic; % P =randperm(N) 返回1, N之间所有整数的一个随机的序列,例如 % randperm(6) 可能会返回 2 4 5 6 1 3 % 这样就相当于把原来的样本排列打乱,再挑出一些样本来训练 kk =randperm(m); forl = 1 : numbatches % 取出打乱顺序后的batchsize个样本和对应的标签 batch_x= x(:, :, kk(l - 1) *opts.batchsize + 1 : l * opts.batchsize)

    17、; batch_y= y(:, kk(l - 1) * opts.batchsize + 1 : l * opts.batchsize); % 在当前的网络权值和网络输入下计算网络的输出 net =cnnff(net, batch_x); % Feedforward % 得到上面的网络输出后,通过对应的样本标签用bp算法来得到误差对网络权值 %(也就是那些卷积核的元素)的导数 net =cnnbp(net, batch_y); % Backpropagation % 得到误差对权值的导数后,就通过权值更新方法去更新权值 net =cnnapplygrads(net, opts); ifisem

    18、pty(net.rL) net.rL(1) = net.L; % 代价函数值,也就是误差值 end net.rL(end+ 1) = 0.99 * net.rL(end)+ 0.01 * net.L; % 保存历史的误差值,以便画图分析 end toc; end endcnnff.mfunction net = cnnff(net, x) n =numel(net.layers); % 层数 net.layers1.a1 = x; % 网络的第一层就是输入,但这里的输入包含了多个训练图像 inputmaps = 1; % 输入层只有一个特征map,也就是原始的输入图像 for l = 2 :

    19、n % for each layer ifstrcmp(net.layersl.type, c) % 卷积层 % !below can probably be handled by insanematrix operations % 对每一个输入map,或者说我们需要用outputmaps个不同的卷积核去卷积图像 forj = 1 : net.layersl.outputmaps % foreach output map % create temp output map % 对上一层的每一张特征map,卷积后的特征map的大小就是 % (输入map宽 - 卷积核的宽 + 1)* (输入map高

    20、 - 卷积核高 + 1) % 对于这里的层,因为每层都包含多张特征map,对应的索引保存在每层map的第三维 % 所以,这里的z保存的就是该层中所有的特征map了 z =zeros(size(net.layersl - 1.a1) - net.layersl.kernelsize - 1 net.layersl.kernelsize - 1 0); fori = 1 : inputmaps % foreach input map % convolve with correspondingkernel and add to temp output map % 将上一层的每一个特征map(也就是这

    21、层的输入map)与该层的卷积核进行卷积 % 然后将对上一层特征map的所有结果加起来。也就是说,当前层的一张特征map,是 % 用一种卷积核去卷积上一层中所有的特征map,然后所有特征map对应位置的卷积值的和 % 另外,有些论文或者实际应用中,并不是与全部的特征map链接的,有可能只与其中的某几个连接 z = z + convn(net.layersl - 1.ai, net.layersl.kij, valid); end % add bias, pass throughnonlinearity % 加上对应位置的基b,然后再用sigmoid函数算出特征map中每个位置的激活值,作为该层输

    22、出特征map net.layersl.aj = sigm(z + net.layersl.bj); end % set number of input maps to this layersnumber of outputmaps inputmaps = net.layersl.outputmaps; elseif strcmp(net.layersl.type, s) % 下采样层 % downsample forj = 1 : inputmaps % ! replace with variable % 例如我们要在scale=2的域上面执行mean pooling,那么可以卷积大小为2*2

    23、,每个元素都是1/4的卷积核 z =convn(net.layersl - 1.aj, ones(net.layersl.scale) / (net.layersl.scale 2), valid); % 因为convn函数的默认卷积步长为1,而pooling操作的域是没有重叠的,所以对于上面的卷积结果 % 最终pooling的结果需要从上面得到的卷积结果中以scale=2为步长,跳着把mean pooling的值读出来 net.layersl.aj = z(1 : net.layersl.scale : end, 1 : net.layersl.scale : end, :); end en

    24、d end % concatenate all end layer feature maps intovector % 把最后一层得到的特征map拉成一条向量,作为最终提取到的特征向量 net.fv = ; for j = 1 : numel(net.layersn.a) % 最后一层的特征map的个数 sa = size(net.layersn.aj); % 第j个特征map的大小 % 将所有的特征map拉成一条列向量。还有一维就是对应的样本索引。每个样本一列,每列为对应的特征向量 net.fv =net.fv; reshape(net.layersn.aj, sa(1) * sa(2),

    25、sa(3); end % feedforward into output perceptrons % 计算网络的最终输出值。sigmoid(W*X + b),注意是同时计算了batchsize个样本的输出值 net.o =sigm(net.ffW * net.fv + repmat(net.ffb, 1, size(net.fv, 2); endcnnbp.mfunction net = cnnbp(net, y) n =numel(net.layers); % 网络层数 % error net.e = net.o -y; % loss function % 代价函数是 均方误差 net.L

    26、= 1/2* sum(net.e(:) . 2) / size(net.e, 2); % backprop deltas % 这里可以参考 UFLDL 的 反向传导算法 的说明 % 输出层的 灵敏度 或者 残差 net.od = net.e.* (net.o .* (1 - net.o); % output delta % 残差 反向传播回 前一层 net.fvd =(net.ffW *net.od); % feature vector delta ifstrcmp(net.layersn.type, c) % only conv layers has sigm function net.fv

    27、d =net.fvd .* (net.fv .* (1 - net.fv); end % reshape feature vector deltas into output mapstyle sa =size(net.layersn.a1); % 最后一层特征map的大小。这里的最后一层都是指输出层的前一层 fvnum = sa(1) *sa(2); % 因为是将最后一层特征map拉成一条向量,所以对于一个样本来说,特征维数是这样 for j = 1 :numel(net.layersn.a) % 最后一层的特征map的个数 % 在fvd里面保存的是所有样本的特征向量(在cnnff.m函数中用

    28、特征map拉成的),所以这里需要重新 % 变换回来特征map的形式。d 保存的是 delta,也就是 灵敏度 或者 残差 net.layersn.dj = reshape(net.fvd(j - 1) * fvnum + 1) : j * fvnum,:), sa(1), sa(2), sa(3); end % 对于 输出层前面的层(与输出层计算残差的方式不同) for l = (n - 1): -1 : 1 ifstrcmp(net.layersl.type, c) for j = 1 : numel(net.layersl.a) %该层特征map的个数 %net.layersl.dj 保存

    29、的是 第l层 的 第j个 map 的 灵敏度map。 也就是每个神经元节点的delta的值 % expand的操作相当于对l+1层的灵敏度map进行上采样。然后前面的操作相当于对该层的输入a进行sigmoid求导 % 这条公式请参考 Notes on Convolutional Neural Networks % for k =1:size(net.layersl + 1.dj, 3) %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; % end net.layersl.dj = net.layersl.aj .* (1 - net.layersl.aj) .*(expand(net.layersl + 1.dj, net.layersl + 1.scale net.layersl +1.scale 1) / net.layersl + 1.scale 2); end elseif strcmp(net.l


    注意事项

    本文(CNN代码理解.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

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




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

    经营许可证编号:鄂ICP备2022015515号-1

    收起
    展开