当前位置: 首页 > news >正文

赣州章贡区邮编长沙seo优化外包公司

赣州章贡区邮编,长沙seo优化外包公司,网站常用后台路径,wordpress怎么引用图片不显示前言 前面煞费苦心地严格按照上下标证明BP#xff0c;主要就是为了锻炼自己的证明时候的严谨性#xff0c;那么这里也严格按照上下标的计算方法推导为何卷积的反向传播需要将卷积核旋转180 粗略证明 回顾一下BP的第l层第i个偏置的更新 ∂E∂bli∑j(δl1jWl1ji)σ′(zli)\…前言 前面煞费苦心地严格按照上下标证明BP主要就是为了锻炼自己的证明时候的严谨性那么这里也严格按照上下标的计算方法推导为何卷积的反向传播需要将卷积核旋转180° 粗略证明 回顾一下BP的第ll层第ii个偏置的更新 ∂E∂bli∑j(δl1j×Wl1ji)×σ′(zli)\frac{\partial E}{\partial b^l_i}=\sum_j\left(\delta^{l+1}_j\times W_{ji}^{l+1}\right)\times\sigma'\left(z^l_i\right)这里面的δl1j\delta^{l+1}_j其实是误差值对第l1l+1层的第jj个单元的偏置的导数,也就是下一层偏置的梯度,从而构成递归形式的求解,逼格叫法就是链式求导。再来看CNN,粗略地说,每个卷积核KK对应的局部输入XX与输出值yy可以构成一个简单的BP网络即 X[x11x21x12x22]K[k11k21k12k22]X=\begin{bmatrix} x_{11}conv(K,X)θk11x11k12x12k21x21k22x22θσ(z)\begin{aligned} z其实正常的卷积是这样的 conv(K,X)k22x11k21x12k12x21k11x22conv \left(K,X \right) =k_{22}x_{11}+k_{21}x_{12}+k_{12}x_{21}+k_{11}x_{22}但是为了证明方便我们就不做这种运算了直接当做相干来做但是面试什么的人家问卷积一定要知道相干不是卷积。假设XX的每个单元对应偏置是bijb_{ij}这样我们就可以套用BP的那个偏置更新式子去求解∂E∂bij\frac{\partial E}{\partial b_{ij}}第一项δl1j\delta^{l+1}_j这一项不管了链式求解它后面再说它的边界即全连接部分的计算方法第二项Wl1jiW_{ji}^{l+1}代表连接yy与第(i,j)(i,j)位置的输入神经元的权重kijk_{ij} 最后一项是当前层输入值函数的导数比如当函数是sigmoidsigmoid的时候σ′(z)z(1−z)\sigma'(z)=z(1-z)所以 ∂E∂bij∂E∂z⋅∂z∂xij⋅∂xij∂bijδl1×kij×σ′(xij)\begin{aligned} \frac{\partial E}{\partial b_{ij}}那就是你卷积的前向操作没学好了。如果学过多通道卷积肯定会问“同一块特征图的所有单元应该共享偏置啊为什么这里特征图的每个神经元都有一个偏置”这个问题一般的解决方法是对同一块特征图所求得的偏置向量求和作为当前特征图需要更新的偏置量详细后面看代码实现。关键的一步来了如何使用卷积来实现这个式子的三个乘法其实主要体现在如何使用卷积来实现δl1×kij\delta^{l+1}\times k_{ij}使得计算的结果大小刚好是XX这么大的维度。如何将图形越卷积维度越大?摈弃CNN中的卷积,单考验你对卷积在图像处理中的操作及其作用,如果想不出来个一二三,建议学习一下那本绿皮的《数字图像处理》,作者好像叫冈萨雷斯,如果喜欢编程,可以看很多视觉库中的卷积操作,比如matlab中关于卷积的三种处理,详见此博客,我们使用full convolution的卷积操作,通过对特征图边缘填充零使其维度变大,然后再执行卷积即可。针对上例,方法是 [δl+1k11δl+1k21δl+1k12δl+1k22]=conv⎛⎝⎜⎡⎣⎢0000δl+10000⎤⎦⎥,[k22k12k21k11]⎞⎠⎟=conv⎛⎝⎜⎡⎣⎢0000δl+10000⎤⎦⎥,rot(K,180°)⎞⎠⎟ \begin{aligned} \begin{bmatrix} \delta^{l+1}k_{11}卷积里面反向传播为什么翻转卷积核这个证明就是原因。 代码实现 在matlab的deeplearning toolbox中将sigmoid作为激活函数因而实际的当前层的偏置计算方法为下一层的偏置矩阵先做补零扩充然后与卷积核的180°翻转做卷积得到的矩阵与当前层的神经元对应元素做乘法即可还有一些其它技巧依据代码做补充。 网络预设 先看看如何设计网络其实主要就是看每层权重和偏置的维度罢了 池化 if strcmp(net.layers{l}.type, s)mapsize mapsize / net.layers{l}.scale;assert(all(floor(mapsize)mapsize), [Layer num2str(l) size must be integer. Actual: num2str(mapsize)]);for j 1 : inputmapsnet.layers{l}.b{j} 0;end end 当前层是池化层的时候没权重且偏置为0主要是因为池化操作只是简单的下采样操作用于降低卷积后的特征图的维度不需要使用权重和偏置做运算。 卷积 if strcmp(net.layers{l}.type, c)mapsize mapsize - net.layers{l}.kernelsize 1;fan_out net.layers{l}.outputmaps * net.layers{l}.kernelsize ^ 2;for j 1 : net.layers{l}.outputmaps % output mapfan_in inputmaps * net.layers{l}.kernelsize ^ 2;for i 1 : inputmaps % input mapnet.layers{l}.k{i}{j} (rand(net.layers{l}.kernelsize) - 0.5) * 2 * sqrt(6 / (fan_in fan_out));endnet.layers{l}.b{j} 0;endinputmaps net.layers{l}.outputmaps; end 这里注意看一下针对第ll个卷积操作连接第ii个输入特征图和第jj个输出特征图的卷积核,使用fan_in,fan_out准则初始化,其实这就间接告诉我们,两层特征图之间的卷积参数量为上一层特征图个数×\times下一层特征图个数(卷积核个数)×\times卷积核高×\times卷积核宽针对第ll层的第ll次卷积操作的第jj个输出特征图的共享偏置值设置为0。前向运算多通道卷积我发现很多新手童鞋不知道多通道卷积到底是何种蛇皮操作,只要你记住,经过卷积后得到的特征图个数等于卷积核个数就行了,切记不是卷积核个数乘以输入特征图个数。具体操作是先使用每个卷积核对所有特征图卷积一遍,然后再加和,比如第二个特征图的值的计算方法就是上一层的第1个特征图与第2个卷积核卷积+上一层的第2个特征图与第2个卷积核卷积+⋯\cdots一直加到最后一个即可。 for j 1 : net.layers{l}.outputmaps % for each output map% create temp output mapz zeros(size(net.layers{l - 1}.a{1}) - [net.layers{l}.kernelsize - 1 net.layers{l}.kernelsize - 1 0]);for i 1 : inputmaps % for each input map% convolve with corresponding kernel and add to temp output mapz z convn(net.layers{l - 1}.a{i}, net.layers{l}.k{i}{j}, valid);end% add bias, pass through nonlinearitynet.layers{l}.a{j} sigm(z net.layers{l}.b{j}); end 池化 采用均值池化对上一层的输出特征图对应区域单元求加和平均可以采用值为1的卷积核大小由设定的池化区域决定 for j 1 : inputmapsz convn(net.layers{l - 1}.a{j}, ones(net.layers{l}.scale) / (net.layers{l}.scale ^ 2), valid); % !! replace with variablenet.layers{l}.a{j} z(1 : net.layers{l}.scale : end, 1 : net.layers{l}.scale : end, :); end 全连接 经过多次卷积、池化操作后为了做分类我们把最后一层所有特征图拉长并拼接成一个向量连接标签向量这就叫全连接。 for j 1 : numel(net.layers{n}.a)sa size(net.layers{n}.a{j});net.fv [net.fv; reshape(net.layers{n}.a{j}, sa(1) * sa(2), sa(3))]; end 最后计算输出 net.o sigm(net.ffW * net.fv repmat(net.ffb, 1, size(net.fv, 2))); 反向传播 全连接部分 反向传播必然是先计算全连接部分的误差值然后向前推到由特征图拉长的向量的每个神经元的偏置这也就是上面提到的为什么没有共享偏置的根源因为在反向传播的第一层便对每个神经元单独求解偏置更新量了。想想之前关于BP总结的那个式子Δc×W×B×(1−B)\Delta c\times W\times B\times(1-B)便可以得到误差对于全连接层偏置的偏导数了。 % error net.e net.o - y; % loss function net.L 1/2* sum(net.e(:) .^ 2) / size(net.e, 2);%% backprop deltas net.od net.e .* (net.o .* (1 - net.o)); % output delta △c net.fvd (net.ffW * net.od); % feature vector delta △c X B if strcmp(net.layers{n}.type, c) % only conv layers has sigm functionnet.fvd net.fvd .* (net.fv .* (1 - net.fv)); end 然后再把全连接层的列向量分离成最后一层特征图大小的块因为它本来就是由最后一层拉长的很容易进行反操作还原回去。 sa size(net.layers{n}.a{1}); fvnum sa(1) * sa(2); for j 1 : numel(net.layers{n}.a)net.layers{n}.d{j} reshape(net.fvd(((j - 1) * fvnum 1) : j * fvnum, :), sa(1), sa(2), sa(3)); end 现在技巧来了我们知道池化层其实就是对卷积层的元素进行简单的处理比如每块加和求均值那么我们就可以粗略得将其还原回去下述代码就是当当前层由池化操作得来的时候将第此层的偏置更新量扩大成上一层的输入特征图大小 expand(net.layers{l 1}.d{j}, [net.layers{l 1}.scale net.layers{l 1}.scale 1]) / net.layers{l 1}.scale ^ 2 然后有一个蛇皮操作就是理论部分不是说过要计算σ(xij)\sigma(x_{ij})么换成sigmoid就是xij(1−xij)x_{ij}(1-x_{ij})他这里提前进行了下一层偏置更新量与当前层值函数导数的乘积 net.layers{l}.d{j} net.layers{l}.a{j} .* (1 - net.layers{l}.a{j}) .* (expand(net.layers{l 1}.d{j}, [net.layers{l 1}.scale net.layers{l 1}.scale 1]) / net.layers{l 1}.scale ^ 2); 回顾一下我们的偏置导数计算公式 ∂E∂bijδl1×kij×σ′(xij)\frac{\partial E}{\partial b_{ij}}=\delta^{l+1}\times k_{ij}\times\sigma'\left(x_{ij}\right)这一行代码直接就完成了δl1×σ′(xij)\delta^{l+1}\times\sigma'(x_{ij})的操作接下来直接乘以卷积核即可注意是填充以后与原来卷积核的翻转180°做卷积操作 z z convn(net.layers{l 1}.d{j}, rot180(net.layers{l 1}.k{i}{j}), full); 因为是批量更新所以需要对所有的偏置向量除以样本总数 for l 2 : nif strcmp(net.layers{l}.type, c)for j 1 : numel(net.layers{l}.a)for i 1 : numel(net.layers{l - 1}.a)net.layers{l}.dk{i}{j} convn(flipall(net.layers{l - 1}.a{i}), net.layers{l}.d{j}, valid) / size(net.layers{l}.d{j}, 3);endnet.layers{l}.db{j} sum(net.layers{l}.d{j}(:)) / size(net.layers{l}.d{j}, 3);endendend 这里蕴含了利用偏置更新量计算权值更新量的操作这个与BP一毛一样就是偏置更新量乘以前一层的单元值即可。 还有就是最后说的由于共享卷积核所以同一卷积核的偏置更新量也应该一样直接求均值就行 net.dffW net.od * (net.fv) / size(net.od, 2); net.dffb mean(net.od, 2);
http://wiki.neutronadmin.com/news/101291/

相关文章:

  • 网站建设 请示密云建设网站公司
  • 网站的建设步骤网站手机版如何制作
  • 长春网站排名公司网站迭代
  • ECMS做的网站上海专业网站建设排行
  • 网站建设动态代码巴楚网站建设
  • 网站的建设哪个好深圳代理记账行业协会
  • 绥化网站开发公司安卓优化神器
  • 太原便宜做网站的公司哪家好厦门定制型网站建设
  • 网站页面跳转怎么做静态页面网站
  • 什么是企业网站策划案济南企业网站建设
  • 网站建设公司怎么发展新客户浏览器的网站
  • 怎么做劳务公司网站海南百度推广seo
  • 网站速度查询郑州中原区最新消息
  • 合肥网站建设网站推广津学院怎么给公司建网站
  • 自己做的网站网页错位大连p2p网站建设
  • 网站制作新报价淄博市住房和城乡建设厅网站
  • 网站建设公司哪家好 搜搜磐石网络腾讯网
  • 建立网站的英文短语旅游网站怎么自己做
  • 字形分析网站wordpress 登录插件
  • 网站实施建设流程怎么做类似淘宝一样的网站吗
  • 贵州省城乡住房和建设厅网站首页中国网站建设哪家公司好
  • 网站建设公司主营业务免费建设微网站制作
  • 1000学习做网站贵吗宿州推广公司
  • 服装网站开发dedecms 招聘网站
  • 网页设计网站模板网站建设网页模板购物网站后台流程图
  • 全网vip影视网站一键搭建抖音小程序推广怎么做
  • 网站设计方法丝绸之路网站建设报告
  • 福州做网站互联网公司排名网站建设目标初步目标
  • 网站空间怎么备份说说对网站推广的看法和想法
  • 浦东新区网站推广公司公众号小程序注册