function cnn=bpcnn(cnn,yy)
if cnn.layers{cnn.no_of_layers}.type ~= 'f'
zz=[];
for k=1:cnn.layers{cnn.no_of_layers}.no_featuremaps
ss =size(cnn.layers{cnn.no_of_layers}.featuremaps{k});
zz =[zz; reshape(cnn.layers{cnn.no_of_layers}.featuremaps{k}, ss(1)*ss(2), ss(3))];
end
cnn.layers{cnn.no_of_layers}.outputs = zz;
end
er = ( cnn.layers{cnn.no_of_layers}.outputs - yy);
if cnn.loss_func == 'cros' %cross_entropy'
if cnn.layers{cnn.no_of_layers}.act_func == 'sigm'
er1 = -1.*sum((yy.*log(cnn.layers{cnn.no_of_layers}.outputs) + (1-yy).*log(1-cnn.layers{cnn.no_of_layers}.outputs)), 1);
else
% er1 = -1.*sum((yy.*log(cnn.layers{cnn.no_of_layers}.outputs)), 1);
error('cross entropy is implemented only when last layer is sigmoid');
end
cnn.loss = sum(er1(:))/size(er1,2); %loss over all examples
else
er1 = er.^2;
cnn.loss = sum(er1(:))/(2*size(er1,2)); %loss over all examples
end
if cnn.CalcLastLayerActDerivative ==1
er =applyactfunccnn(cnn.layers{cnn.no_of_layers}.outputs,cnn.layers{cnn.no_of_layers}.act_func, 1, er);
end
%%%%%%%%%%%%%%first only last layer calculation
if cnn.layers{cnn.no_of_layers}.type == 'f'
cnn.layers{cnn.no_of_layers}.er{1} =er;
cnn.layers{cnn.no_of_layers}.dW = cnn.layers{cnn.no_of_layers}.er{1} * ( cnn.layers{cnn.no_of_layers-1}.outputs)' / size(cnn.layers{cnn.no_of_layers}.er{1}, 2);
cnn.layers{cnn.no_of_layers}.db = mean( cnn.layers{cnn.no_of_layers}.er{1}, 2);
elseif cnn.layers{cnn.no_of_layers}.type == 'p'
sz2=0;
for i=1:cnn.layers{cnn.no_of_layers}.no_featuremaps
sz = size(cnn.layers{cnn.no_of_layers}.featuremaps{i});
sz1 = sz(1)*sz(2);
cnn.layers{cnn.no_of_layers}.er{i} = reshape(er(sz2+1 : sz2+sz1, : ), sz(1), sz(2), sz(3));
sz2 = sz2+sz1;
end
%%upsample er for previous layer
zz=cnn.layers{cnn.no_of_layers}.subsample_rate;
if cnn.layers{cnn.no_of_layers}.subsample_method == 'mean'
for i=1:cnn.layers{cnn.no_of_layers}.no_featuremaps
sz = size(cnn.layers{cnn.no_of_layers}.featuremaps{i});
ss1 = 1:sz(1); ss1 =kron(ss1, ones([1 zz]));
ss2 = 1:sz(2); ss2 =kron(ss2, ones([1 zz]));
sf{1}=ss1; sf{2}=ss2;
er =cnn.layers{cnn.no_of_layers}.er{i};
new_er = er(sf{:},:);
cnn.layers{cnn.no_of_layers}.er{i} = new_er; % kron( cnn.layers{cnn.no_of_layers}.er{i}, ones([zz zz]));
end
else
error 'this subsampling method not implemented';
end
elseif cnn.layers{cnn.no_of_layers}.type == 'c'
sz2=0;
for i=1:cnn.layers{cnn.no_of_layers}.no_featuremaps
sz = size(cnn.layers{cnn.no_of_layers}.featuremaps{i});
sz1 = sz(1)*sz(2);
cnn.layers{cnn.no_of_layers}.er{i} = reshape(er(sz2+1 : sz2+sz1, : ), sz(1), sz(2), sz(3));
sz2 = sz2+sz1;
end
kk=0;
for i=1:cnn.layers{cnn.no_of_layers}.no_featuremaps
for j=1:cnn.layers{cnn.no_of_layers-1}.no_featuremaps
zz= convn(cnn.layers{cnn.no_of_layers-1}.featuremaps{j}, rot90(cnn.layers{cnn.no_of_layers}.er{i},2), 'valid');
kk = kk+1;
cnn.layers{cnn.no_of_layers}.dK(:,:,kk) = mean(zz,3);
end
cnn.layers{cnn.no_of_layers}.db(i)= sum(cnn.layers{cnn.no_of_layers}.er{i}(:))/size(cnn.layers{cnn.no_of_layers}.er{i},3);
end
end
for i=cnn.no_of_layers-1:-1:1
if cnn.layers{i}.type == 'f'
cnn.layers{i}.er{1} = ( (cnn.layers{i+1}.W)' * cnn.layers{i+1}.er{1} );
cnn.layers{i}.er{1} = applyactfunccnn(cnn.layers{i}.outputs,cnn.layers{i}.act_func, 1, cnn.layers{i}.er{1} );
cnn.layers{i}.dW = cnn.layers{i}.er{1} * ( cnn.layers{i-1}.outputs)' / size(cnn.layers{i}.er{1}, 2);
cnn.layers{i}.db = mean( cnn.layers{i}.er{1}, 2);
elseif cnn.layers{i}.type == 'p'
%er =cnn.layers{i+1}.er;
cnn.layers{i}.er{1}= 0;
if cnn.layers{i+1}.type == 'f'
sz2=0;
er = ( (cnn.layers{i+1}.W)' * cnn.layers{i+1}.er{1} );
for j=1:cnn.layers{i}.no_featuremaps
sz = size(cnn.layers{i}.featuremaps{j});
sz1 = sz(1)*sz(2);
cnn.layers{i}.er{j} = reshape(er(sz2+1 : sz2+sz1, : ), sz(1), sz(2), sz(3));
sz2 = sz2+sz1;
end
elseif cnn.layers{i+1}.type == 'c'
er =cnn.layers{i+1}.er;
for k=1:cnn.layers{i}.no_featuremaps
cnn.layers{i}.er{k}=zeros(size(cnn.layers{i}.featuremaps{k}));
end
kk=0;
for j=1:cnn.layers{i+1}.no_featuremaps
for k=1:cnn.layers{i}.no_featuremaps
kk = kk+1;
cnn.layers{i}.er{k} = cnn.layers{i}.er{k} + convn(er{j}, rot90(cnn.layers{i+1}.K(:,:,kk),2), 'full');
end
end
else
er =cnn.layers{i+1}.er;
cnn.layers{i}.er =er;
end
%upsample er for previous layer
zz=cnn.layers{i}.subsample_rate;
if cnn.layers{i}.subsample_method == 'mean'
for j=1:cnn.layers{i}.no_featuremaps
sz = size(cnn.layers{i}.featuremaps{j});
ss1 = 1:sz(1); ss1 =kron(ss1, ones([1 zz]));
ss2 = 1:sz(2); ss2 =kron(ss2, ones([1 zz]));
sf{1}=ss1; sf{2}=ss2;
er =cnn.layers{i}.er{j};
new_er = er(sf{:},:);
cnn.layers{i}.er{j} = new_er./(zz*zz); % kron( cnn.layers{cnn.no_of_layers}.er{i}, ones([zz zz]));
end
else
error 'this subsampling method not implemented';
end
elseif cnn.layers{i}.type == 'c'
er =0;
cnn.layers{i}.er{1}= 0;
if cnn.layers{i+1}.type == 'f'
sz2=0;
er1 = ( (cnn.layers{i+1}.W)' * cnn.layers{i+1}.er{1} );
for j=1:cnn.layers{i}.no_featuremaps
sz = size(cnn.layers{i}.featuremaps{j});
sz1 = sz(1)*sz(2);
cnn.layers{i}.er{j} = reshape(er1(sz2+1 : sz2+sz1, : ), sz(1), sz(2), sz(3));
sz2 = sz2+sz1;
end
er = cnn.layers{i}.er;
elseif cnn.layers{i+1}.type == 'c'
error('not implemented yet- convolution layer with convolution layer. Instead, use Pooling layer with subsampling factor 1 between two conv layer');
else
er =cnn.layers{i+1}.er;
end
if cnn.layers{i}.act_func == 'soft'
% error('softmax for backpropagation is not implemented yet');
err1 = zeros(size(er{1}));
for j=1:cnn.layers{i}.no_featuremaps
err1 = err1 + er{j}.*cnn.layers{i}.featuremaps{j};
end
for j=1:cnn.layers{i}.no_featuremaps
cnn.layers{i}.er{j} = cnn.layers{i}.featuremaps{j}.*(er{j} - err1);
end
else
for j=1:cnn.layers{i}.no_featuremaps
cnn.layers{i}.er{j} =applyactfunccnn(cnn.layers{i}.featuremaps{j},cnn.layers{i}.act_func, 1, er{j});
end
end
%%calculate gradient of filters and bias
kk=0;
for ii=1:cnn.layers{i}.no_featuremaps
for j=1:cnn.layers{i-1}.no_featuremaps
%%%%%following commented code is slow, but shows how we can
%%%%%calculate dK
% zz=0;
% for mm=1:size(cnn.layers{
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022A,包含仿真操作录像和代码注释,操作录像使用windows media player播放。 2.领域:目标识别 3.内容: 基于CNN卷积神经网络的目标识别算法matlab仿真。 % 构造图像文件名 st = sprintf('f (%d).jpg',i);% 读取图像文件 I=imread(fullfile(Datapath1, st)); I = imresize(I, [h w ] );% 调整图像大小为(h, w) I = rescale(double(I))/2;% 将图像转换为double类型并重新调整范围(一半) % 加载训练好的CNN网络模型 cnn = loadcnn(fullfile(Datapath, 'my_face_cnn5.mat')); [a l1]=predictcnn(cnn, test_x); 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于CNN卷积神经网络的目标识别算法matlab仿真.rar (22个子文件)
仿真操作录像0019.avi 21.77MB
code
AshuCNN
my_face_cnn5.mat 852KB
Internet_Images
f (2).jpg 24KB
f (1).jpg 58KB
f (3).jpg 26KB
Runme.m 2KB
func
bpcnn.m 9KB
cnnAddPoolLayer.m 843B
cnnAddFCLayer.m 1KB
gradientdescentcnn.m 1KB
initcnn.m 2KB
applyactfunccnn.m 1KB
loadcnn.m 107B
traincnn.m 3KB
gradient_checker.m 5KB
predictcnn.m 1008B
testcnn.m 1KB
ffcnn.m 3KB
cnnAddConvLayer.m 2KB
checkvalues.m 189B
cnnAddActLayer.m 266B
savecnn.m 4KB
共 22 条
- 1
资源评论
- lockit2022-05-08这有小问题fpga和matlab2022-11-30matlab版本尽量和我一样。如果要测试其他样本,需要重新训练。目前只针对我自己的库训练的样本识别率才高。
- bao2022kaishi2024-03-18资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
- m0_743335322024-01-09资源内容详尽,对我有使用价值,谢谢资源主的分享。
fpga和matlab
- 粉丝: 15w+
- 资源: 2548
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功