www.gusucode.com > 《matlab图像处理与界面编程宝典》秦襄培 编著,每章的MATLAB源代码程序 > 第25章/代码25-1.txt
clear memory % 清理内存 clear all % 清理MATLAB工作空间 clc % 清除历史命令字符 nump=3; % 类的数目 n=3; % 每类的图像数目,图像变形成P中的列元素,图像尺寸(3x3)变成(1x9),训练图像 P=[196 35 234 232 59 244 243 57 226; ... 188 15 236 244 44 228 251 48 230; ... % 类1 246 48 222 225 40 226 208 35 234; ... 255 223 224 255 0 255 249 255 235; ... 234 255 205 251 0 251 238 253 240; ... % 类2 232 255 231 247 38 246 190 236 250; ... 25 53 224 255 15 25 249 55 235; ... 24 25 205 251 10 25 238 53 240; ... % 类3 22 35 231 247 38 24 190 36 250]'; % 测试图像 N=[208 16 235 255 44 229 236 34 247; ... 245 21 213 254 55 252 215 51 249; ... % 类1 248 22 225 252 30 240 242 27 244; ... 255 241 208 255 28 255 194 234 188; ... 237 243 237 237 19 251 227 225 237; ... % 类2 224 251 215 245 31 222 233 255 254; ... 25 21 208 255 28 25 194 34 188; ... 27 23 237 237 19 21 227 25 237; ... % 类3 24 49 215 245 31 22 233 55 254]'; % 标准化 P=P/256; N=N/256; figure(1), for i=1:n*nump im=reshape(P(:,i), [3 3]); im=imresize(im,20); % 调整图像尺寸使其看起来清晰 subplot(nump,n,i),imshow(im);title(strcat('Train image/Class #', int2str(ceil(i/n)))) end figure, for i=1:n*nump im=reshape(N(:,i), [3 3]); im=imresize(im,20); %调整图像尺寸使其看起来清晰 subplot(nump,n,i),imshow(im);title(strcat('test image #', int2str(i))) end % 目标 T=[ 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 ]; S1=5; % 隐藏层的数目 S2=3; % 输出层的数目(=类的数目) [R,Q]=size(P); epochs = 10000; %反复次数 goal_err = 10e-5; % 目标误差 a=0.3; % 定义随机变量范围 b=-0.3; W1=a + (b-a) *rand(S1,R); % 输入和隐藏神经元间的权重 W2=a + (b-a) *rand(S2,S1); % 输出和隐藏神经元间的权重 b1=a + (b-a) *rand(S1,1); % 输入隐藏神经元间的权重 b2=a + (b-a) *rand(S2,1); % 隐藏和输出神经元间的权重 n1=W1*P; A1=logsig(n1); n2=W2*A1; A2=logsig(n2); e=A2-T; error =0.5* mean(mean(e.*e)); nntwarn off for itr =1:epochs if error <= goal_err break else for i=1:Q df1=dlogsig(n1,A1(:,i)); df2=dlogsig(n2,A2(:,i)); s2 = -2*diag(df2) * e(:,i); s1 = diag(df1)* W2'* s2; W2 = W2-0.1*s2*A1(:,i)'; b2 = b2-0.1*s2; W1 = W1-0.1*s1*P(:,i)'; b1 = b1-0.1*s1; A1(:,i)=logsig(W1*P(:,i),b1); A2(:,i)=logsig(W2*A1(:,i),b2); end e = T - A2; error =0.5*mean(mean(e.*e)); disp(sprintf('Iteration :%5d mse(itr)=error; end end threshold=0.9; % 训练图像结果 TrnOutput=real(A2>threshold) % 将测试图像应用到神经网络 n1=W1*N; A1=logsig(n1); n2=W2*A1; A2test=logsig(n2); % 测试图像结果 TstOutput=real(A2test>threshold) % 识别率 wrong=size(find(TstOutput-T),1); recognition_rate=100*(size(N,2)-wrong)/size(N,2)