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)