matlab에서 bp신경 네트워크를 작성하여 핸드폰 디지털 식별(그림 및 코드 포함)

27997 단어 신경 네트워크

matlab에서 bp신경 네트워크를 작성하여 핸드폰 디지털 식별(그림 및 코드 포함)


본문 참고 링크https://blog.csdn.net/huang_miao_xin/article/details/51364152.그중의 일부 코드를 수정하여 완벽하게 운행할 수 있다.코드는 주로 다음과 같은 다섯 부분을 포함한다.

1. 신경 네트워크 초기화

V=double(rand(256,64));
W=double(rand(64,10));
delta_V=double(rand(256,64));
delta_W=double(rand(64,10));
% lf=0;              
yita=0.2;%    ,        
yita1=0.05;%       ,                        ,          
train_number=10;%     ,      ,  90
train_num=400;%     ,        ,  100 
x=double(zeros(1,256));%   
y=double(zeros(1,64));%   ,     
output=double(zeros(1,10));%   
tar_output=double(zeros(1,10));%    ,     
delta=double(zeros(1,10));%%           
s_record=1:400;

2. 그림 읽기

tic %  
for train_control_num=1:400   %1000400     
    s=0;
%for number=1:train_number %train_number=10
ReadDir=['D:\contrl\BP\BP\training\',num2str(number-1)];%       
for num=1:train_num  %       train_num=30
photo_name=['\a (',num2str(num),').png'];%   
photo_index=[ReadDir,photo_name];%              
photo_matrix=imread(photo_index);%  imread      
photo_matrix=imresize(photo_matrix,[16,16]);
photo_matrix=uint8(photo_matrix>=30);%1

tmp=photo_matrix';
tmp=tmp(:);%256 ,                       ,       

3. 전방향 계산

%       
x=double(tmp');%           X    ,       
%      
y0=x*V;
%  
y=1./(1+exp(-y0*yita1));
%       
output0=y*W;
% lf=lf+1;                
output=1./(1+exp(-output0*yita1));
%      
tar_output=double(zeros(1,10));
tar_output(number)=1.0;

4. 역방향 전파

%    
%      W V   ,      for        ,           ,   
delta=(tar_output-output).*output.*(1-output);%1*10
delta_W=yita*repmat(y',1,10).*repmat(delta,64,1);%64*10
tmp=sum((W.*repmat(delta,64,1))');
tmp=tmp.*y.*(1-y);
delta_V=yita*repmat(x',1,64).*repmat(tmp,256,1);
%     
s=s+sum((tar_output-output).*(tar_output-output))/10;
%    
W=W+delta_W;
V=V+delta_V;
end
end

5. 드로잉, 상태 보기

s=s/train_number/train_num  %    ,            
train_control_num           %s_record(train_control_num)=s;%  
end
toc %    
plot(1:400,s_record);

테스트

correct_num=0;%       
incorrect_num=0;%      
test_number=10;%    ,      ,90
test_num=800;%    ,       ,  100 
% load W;%%       W   ,        
% load V;
% load yita1;

%    
tic %    
for number=1:test_number
number
ReadDir=['D:\contrl\BP\BP\training\',num2str(number-1)];
for num=1:test_num  %     
photo_name=['\a (',num2str(num),').png'];
photo_index=[ReadDir, photo_name];
photo_matrix=imread(photo_index);
%    
photo_matrix=imresize(photo_matrix,[16 16]);
%   
photo_matrix=uint8(photo_matrix>=30);%   1
%   
tmp=photo_matrix';
tmp=tmp(:);
%       
x=double(tmp');
%      
y0=x*V;
%  
y=1./(1+exp(-y0*yita1));
%       
o0=y*W;
tar_output=double(zeros(1,10));
tar_output(number)=1.0;
o=1./(1+exp(-o0*yita1));

%             
output=double(zeros(1,10));


[o,index]=sort(o);
p=index(10);
output(p)=1.0;
if p==number
    correct_num=correct_num+1;
else
    incorrect_num=incorrect_num+1;

    %%     figure(incorrect_num)
%     imshow((1-photo_matrix)*255);
%     title(num2str(number));

end

end

end
plotconfusion(tar_output,output);

correct_rate=correct_num/test_number/test_num;
toc %    

손으로 쓴 디지털 사진 자원이 csdn에 업로드되었습니다. 코드가 쉽지 않습니다. 포인트를 좀 주셨으면 좋겠습니다. 고맙습니다!!!https://download.csdn.net/download/qu_learner/12527007

좋은 웹페이지 즐겨찾기