function net = cnnbp2(net, y)
% CNN网络,反向传播(批处理算法)(C串行风格)
n = numel(net.layers); % CNN网络层数
E = net.layers{n}.X - y; % 输出误差: 预测值-期望值
net.layers{n}.Delta = E .* dy(net.layers{n}.X); % 输出层灵敏度(残差)
net.err = 1/2* sum(E(:) .^ 2); % 代价函数是均方误差,已对样本数做平均
% net.err = 1/2* sum(E(:) .^ 2) / size(E, 2); % 代价函数是均方误差,已对样本数做平均
%% 灵敏度(残差)的反向传播
if strcmp(net.layers{2}.type, 'f')
% 当第二层就是全连接层时,相当于输入图片拉成一个特征矢量形成的BP网络,考虑到必须计算net.layers{1}.X_Array,所以L的下限必须到1
tmp = 1;
else
% 其它情况L下限是2就可以
tmp = 2;
end
for L = (n - 1) : -1 : tmp
%======================================================================
% 以下代码对“下一层”为“全连接层”时有效
if (strcmp(net.layers{L+1}.type, 'f'))
if (strcmp(net.layers{L}.type, 'f'))
%------------------------------------------------------------------
% 以下代码对第7层(全连接层)有效
% 典型的BP网络输出层对隐层的灵敏度(残差)的反向传播公式
net.layers{L}.Delta = (net.layers{L+1}.W' * net.layers{L+1}.Delta) .* dy(net.layers{L}.X);
elseif (strcmp(net.layers{L}.type, 's') || strcmp(net.layers{L}.type, 'c') || strcmp(net.layers{L}.type, 'i'))
%------------------------------------------------------------------
% 以下代码对第6层(过渡全连接层)有效
sa = size(net.layers{L}.X{1}); % 每个输出通道图像尺寸(三维矢量,前两维是尺寸,第三维是批处理样本个数)
fvnum = sa(1) * sa(2); % 输出图像像素个数
% 典型的BP网络输出层对隐层的灵敏度(残差)的反向传播公式
net.layers{L}.Delta_Array = (net.layers{L+1}.W' * net.layers{L+1}.Delta);
if strcmp(net.layers{L}.type, 'c')
net.layers{L}.Delta_Array = net.layers{L}.Delta_Array .* dy(net.layers{L}.X_Array);
end
for J = 1 : net.layers{L}.iChannel
% 将本层长矢量灵敏度(残差),每一列为一个样本,reshape成通道表示 (矢量化全连接 -> 通道化全连接)
net.layers{L}.Delta{J} = reshape(net.layers{L}.Delta_Array (((J - 1) * fvnum + 1) : J * fvnum, :), sa(1), sa(2));
% net.layers{L}.Delta{J} = reshape(net.layers{L}.Delta_Array (((J - 1) * fvnum + 1) : J * fvnum, :), sa(1), sa(2), sa(3));
end
%------------------------------------------------------------------
end
end
%======================================================================
% 以下代码对“下一层”为“下采样层”时有效
if (strcmp(net.layers{L+1}.type, 's'))
for J = 1 : net.layers{L}.iChannel % 对本层输出通道数做循环
tmp1 = dy(net.layers{L}.X{J}); % 为本层导数
% 为上采样函数,这里用expand函数代替文献中的kron(kron仅适用二维情况)
tmp2 = up(net.layers{L + 1}.Delta{J}, net.layers{L + 1}.iSample);
% tmp2 = expand(net.layers{L + 1}.Delta{J}, [net.layers{L + 1}.iSample,net.layers{L + 1}.iSample,1]);
% net.layers{L}.Delta{J} = net.layers{L}.X{J} .* (1 - net.layers{L}.X{J}) .* (expand(net.layers{L + 1}.Delta{J}, [net.layers{L + 1}.iSample net.layers{L + 1}.iSample 1]) / net.layers{L + 1}.iSample ^ 2);
% 与上式相比, 这里我认为最好不除以net.layers{L + 1}.iSample ^ 2, 因为在CNN正向计算函数cnnff中只做了下采样处理, 可以认为灵敏度(残差)是直接复制过去的.
%##############################################################
% 后改,以下代码用于下采样层的计算
net.layers{L}.Delta{J} = tmp1 .* tmp2;
net.layers{L}.Delta{J} = net.layers{L+1}.Beta{J} * net.layers{L}.Delta{J};
end
end
%======================================================================
% 以下代码对“下一层”为“卷积层”时有效
if (strcmp(net.layers{L+1}.type, 'c'))
for I = 1 : net.layers{L}.iChannel % 对本层输出通道数做循环
z = zeros(size(net.layers{L}.X{1}));
for J = 1 : net.layers{L+1}.iChannel % 对下一层输出通道数做循环
% 当前层灵敏度(残差)net.layers{L}.Delta{J}计算
z = z + conv2(net.layers{L + 1}.Delta{J}, rot180(net.layers{L + 1}.Ker{I}{J},2), 'full');
% z = z + convn(net.layers{L + 1}.Delta{J}, rot180(net.layers{L + 1}.Ker{I}{J},2), 'full');
end
net.layers{L}.Delta{I} = z;
% net.layers{L}.Delta{I} = dy(net.layers{L}.X{I}) .* net.layers{L}.Delta{I};
end
end
%======================================================================
end
%% 求训练参数的梯度
% 特别注意:与Matlab并行版本不同,由于C采用是串行机制,以下训练参数在这里需要累加,之后在函数cnngradmean()中对一批样本做平均
% net.layers{L}.Ker_grad{I}{J}
% net.layers{L}.B_grad{J}
% net.layers{L}.W_grad
% net.layers{L}.B_grad
%
% 这里与 Notes on Convolutional Neural Networks 中不同,这里的 子采样 层没有参数,也没有
% 激活函数,所以在子采样层是没有需要求解的参数的
for L = 2 : n % 对CNN网络层数做循环(注意:这里实际上可以从第2层开始)
%======================================================================
if (strcmp(net.layers{L}.type, 'c'))
for J = 1 : net.layers{L}.iChannel % 对本层输出通道数做循环
for I = 1 : net.layers{L-1}.iChannel % 对上一层输出通道数做循环
% 特别注意:
% (1)等价关系 rot180(conv2(a,rot180(b),'valid')) = conv2(rot180(a),b,'valid')
% (2)若ndims(a)=ndims(b)=3,则convn(filpall(a),b,'valid')表示三个维度上同时相关运算
% (3)若size(a,3)=size(b,3),则上式输出第三维为1,表示参与训练样本的叠加和(批处理算法),结果要对样本数做平均
net.layers{L}.Ker_grad{I}{J} = net.layers{L}.Ker_grad{I}{J} + conv2(rot180(net.layers{L - 1}.X{I},2), net.layers{L}.Delta{J}, 'valid');
% net.layers{L}.Ker_grad{I}{J} = convn(rot180(net.layers{L - 1}.X{I},3), net.layers{L}.Delta{J}, 'valid') / size(net.layers{L}.Delta{J}, 3);
end
% 对所有net.layers{L}.Delta{J}的叠加,结果要对样本数做平均
net.layers{L}.B_grad{J} = net.layers{L}.B_grad{J} + sum(net.layers{L}.Delta{J}(:));
% net.layers{L}.B_grad{J} = sum(net.layers{L}.Delta{J}(:)) / size(net.layers{L}.Delta{J}, 3);
end
end
%######################################################################
% 后改,以下代码用于下采样层的计算
if (strcmp(net.layers{L}.type, 's'))
for J = 1 : net.layers{L}.iChannel % 对本层输出通道数做循环
net.layers{L}.Beta_grad{J} = net.layers{L}.Beta_grad{J} + sum(net.layers{L}.Delta{J}(:) .* net.layers{L}.X_down{J}(:));
% net.layers{L}.Beta_grad{J} = sum(net.layers{L}.Delta{J}(:) .* net.layers{L}.X_down{J}(:)) / size(net.layers{L}.Delta{J}, 3);
% 对所有net.layers{L}.Delta{J}的叠加,结果要对样本数做平均
net.layers{L}.B_grad{J} = net.layers{L}
没有合适的资源?快使用搜索试试~ 我知道了~
卷积神经网络车牌识别
共2000个文件
bmp:5809个
m:28个
mat:19个
5星 · 超过95%的资源 需积分: 49 97 下载量 43 浏览量
2018-09-19
14:12:25
上传
评论 12
收藏 44.91MB ZIP 举报
温馨提示
卷积神经网络车牌识别
资源推荐
资源详情
资源评论
收起资源包目录
卷积神经网络车牌识别 (2000个子文件)
1509812279_550_4_new_warped2.bmp 2KB
1509808285_77_2.bmp 2KB
1509815182_184_2_new_warped4.bmp 2KB
1509812364_802_2_new_smaller.bmp 2KB
1509817794_407_3.bmp 2KB
1509817794_407_3_new_warped2.bmp 2KB
1509808274_661_2_new_warped1.bmp 2KB
1509811866_228_2_new_warped2.bmp 2KB
1509808105_928_5_new_warped2.bmp 2KB
1509808364_526_4.bmp 2KB
1509808184_908_3_new_warped3.bmp 2KB
1509818233_233_7.bmp 2KB
1509814824_627_7_new_smaller.bmp 2KB
1509812364_802_2.bmp 2KB
1509812279_550_2_new_warped3.bmp 2KB
1509808274_661_2_new_warped3.bmp 2KB
1509814961_873_2.bmp 2KB
1509812279_550_4_new_warped3.bmp 2KB
1509816168_536_2_new_warped1.bmp 2KB
1509818233_233_7_new_warped4.bmp 2KB
1509814824_627_7_new_warped1.bmp 2KB
1509811866_228_2_new_warped4.bmp 2KB
1509818570_684_5_new_warped2.bmp 2KB
1509812279_550_2_new_smaller.bmp 2KB
1509808364_526_4_new_warped1.bmp 2KB
1509814946_666_2_new_warped2.bmp 2KB
1509814961_873_2_new_smaller.bmp 2KB
1509808297_161_2_new_warped1.bmp 2KB
1509808184_908_3_new_warped2.bmp 2KB
1509812518_645_2_new_smaller.bmp 2KB
1509814946_666_2_new_warped3.bmp 2KB
1509811879_599_2_new_warped4.bmp 2KB
1509808105_928_5_new_smaller.bmp 2KB
1509818570_684_5_new_warped3.bmp 2KB
1509814824_627_7.bmp 2KB
1509806997_303_4_new_warped4.bmp 2KB
1509815182_184_2.bmp 2KB
1509812279_550_2_new_warped4.bmp 2KB
1509806997_303_4_new_warped1.bmp 2KB
1509808274_661_2_new_warped4.bmp 2KB
1509814946_666_2_new_smaller.bmp 2KB
1509820012_141_6.bmp 2KB
1509812364_802_2_new_warped3.bmp 2KB
1509814946_666_2_new_warped4.bmp 2KB
1509812279_550_2.bmp 2KB
1509808364_526_4_new_warped3.bmp 2KB
1509818570_684_5_new_smaller.bmp 2KB
1509815182_184_2_new_warped1.bmp 2KB
1509808184_908_3_new_warped4.bmp 2KB
1509808297_161_2_new_warped3.bmp 2KB
1509812279_550_2_new_warped2.bmp 2KB
1509811866_228_2_new_warped1.bmp 2KB
1509814961_873_2_new_warped3.bmp 2KB
1509808184_908_3_new_smaller.bmp 2KB
1509814946_666_2.bmp 2KB
1509812354_950_4_new_warped1.bmp 2KB
1509816655_382_2_new_smaller.bmp 2KB
1509814317_572_2.bmp 2KB
1509811781_529_2_new_warped1.bmp 2KB
1509814289_232_2_new_warped4.bmp 2KB
1509812558_593_2_new_warped1.bmp 2KB
1509814299_705_2_new_warped3.bmp 2KB
1509808223_821_2.bmp 2KB
1509816270_747_2_new_warped2.bmp 2KB
1509814289_232_2_new_warped3.bmp 2KB
1509816478_628_2_new_warped2.bmp 2KB
1509814289_232_2_new_warped1.bmp 2KB
1509807306_562_2_new_warped4.bmp 2KB
1509814289_232_2_new_smaller.bmp 2KB
1509818322_781_2.bmp 2KB
1509816730_393_2_new_warped1.bmp 2KB
1509814875_162_2_new_warped2.bmp 2KB
1509817666_40_6.bmp 2KB
1509807306_562_2.bmp 2KB
1509811762_379_2_new_warped3.bmp 2KB
1509814231_683_2_new_warped1.bmp 2KB
1509814241_148_2_new_smaller.bmp 2KB
1509818322_781_2_new_warped2.bmp 2KB
1509814772_78_2_new_smaller.bmp 2KB
1509814215_416_2.bmp 2KB
1509816234_17_2_new_warped4.bmp 2KB
1509819761_294_3_new_warped2.bmp 2KB
1509818365_292_2.bmp 2KB
1509814985_946_2_new_smaller.bmp 2KB
1509808526_114_3_new_warped4.bmp 2KB
1509816478_628_2_new_smaller.bmp 2KB
1509814875_162_2.bmp 2KB
1509808526_114_3.bmp 2KB
1509814241_148_2_new_warped1.bmp 2KB
1509808526_114_3_new_warped1.bmp 2KB
1509817666_40_6_new_warped4.bmp 2KB
1509811840_151_2_new_smaller.bmp 2KB
1509814241_148_2.bmp 2KB
1509814552_393_4_new_warped1.bmp 2KB
1509819693_39_4_new_warped2.bmp 2KB
1509814757_155_2_new_smaller.bmp 2KB
1509814772_78_2_new_warped3.bmp 2KB
1509811740_504_3_new_warped1.bmp 2KB
1509808223_821_2_new_warped1.bmp 2KB
1509811740_506_7_new_warped4.bmp 2KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
- 色空空色2023-07-25文件提供了大量的代码实现示例,便于读者理解和实践,非常有助于入门者快速掌握这一领域的知识。
- 申增浩2023-07-25文中还探讨了卷积神经网络车牌识别的未来发展趋势,对于对该领域感兴趣的读者来说,是一份很值得阅读的资料。
- 艾苛尔2023-07-25作者对于卷积神经网络车牌识别的优势和限制进行了客观分析,让读者能够全面了解该技术的潜力和挑战。
- 坐在地心看宇宙2023-07-25文件展示了卷积神经网络在车牌识别中的应用案例,并详细介绍了其中的算法流程,实用性很高。
- FloritaScarlett2023-07-25这份文件对于卷积神经网络车牌识别的技术原理进行了深入剖析,让人受益匪浅。
narutowz
- 粉丝: 4
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功