1

我目前正在研究复值神经网络(CVNN)的本科论文。我的主题是基于单层复值神经网络的实值分类问题。我正在使用梯度下降学习规则对给定的数据集进行分类以下:

数据集

我在这里使用的算法可以在以下 PDF 的第 946 页上找到,标记为复神经元 (CVN) 模型。主要算法可以在该主题的第 3 部分

CVN模型的算法

但是我的误差曲线并没有收敛,而是表现出不同的特征。这是我的误差曲线输出。

CVNN 实施时的误差曲线

我在MATLAB上模拟这背后的代码。我的实现也在下面给出:

clc
clear all
epoch=1000;
n=8;
%x=real input value
in=dlmread('Diabetes1.txt');
x=in(1:384,1:8);
%d=desired output value
out=dlmread('Diabetes1.txt');
data_1=out(1:384,9);
data_2=out(1:384,10);


%m=complex representation of input
 m=(cos((pi).*(x(:,:)-0))+1i*sin((pi).*(x(:,:)-0)));
% 
%research
%m=i.*x(:,:)
%m=x(:,:)+i.*x(:,:)
%Wih=weight
%
  %m=x(:,:).*(cos(pi./4)+i.*sin(pi./4));

  Wih1 =0.5* exp(1i * 2*pi*rand(8,1));
  Wih2 =0.5* exp(1i * 2*pi*rand(8,1));

 %Pih=bias

  Pih1 =0.5*exp(1i * 2*pi*rand(1,1));
  Pih2 =0.5*exp(1i * 2*pi*rand(1,1));

 for ite=1:epoch 
%     www(ite)=ite;
     E_Total=0;
     E1t=0;
     E2t=0;
     for j=1:384

     %blr=learning rate    
     blr=0.1;

     %cpat=current pattern
     cpat = m(j,:);
     z1=cpat*Wih1+Pih1;
     u1=real(z1);
     v1=imag(z1);
     fu1=1/(1+exp(-u1));
     fv1=1/(1+exp(-v1));

     %y=actual output
     %for activation function 1
      y1=sqrt((fu1).^2+(fv1).^2);

     %for activation function 2
    % y1=(fu1-fv1).^2;
     error1=(data_1(j,1)-y1);
     E1=((data_1(j,1)-y1).^2);

     t11=1./(1+exp(-u1));
     f11=t11.*(1-t11);
     t21=1./(1+exp(-v1));
     f21=t21.*(1-t21);

     %for activation function 1
      r1= blr.*(data_1(j,1)-y1).*((t11.*f11)./y1)+i.*blr.*(data_1(j,1)-y1).*((t21.*f21)./y1);

     %for activation function 2
   %r1=2.*blr.*(data_1(j,1)-y1).*(t11-t21).*f11+1i.*2.*blr.*(data_1(j,1)-y1).*(t21-t11).*f21;
%      
     Pih1=Pih1+r1;
     Wih1= Wih1+(conj(m(j,:)))'.*r1;


     %////////////////////////////////////////////////

     %cpat=current pattern


     z2=cpat*Wih2+Pih2;
     u2=real(z2);
     v2=imag(z2);
     fu2=1./(1+exp(-u2));
     fv2=1./(1+exp(-v2));
%          fu2=tanh(u2);
%          fv2=tanh(v2);

     %y=actual output

     %for activation function 1
       y2=sqrt((fu2).^2+(fv2).^2);

     %for activation function 2
     % y2=(fu2-fv2).^2;
     error2=(data_2(j,1)-y2);
     E2=((data_2(j,1)-y2).^2);

     t12=1./(1+exp(-u2));
     f12=t12.*(1-t12);
     t22=1./(1+exp(-v2));
     f22=t22.*(1-t22);

     %for activation function1
     r2= blr.*(data_2(j,1)-y2).*((t12.*f12)./y2)+i.*blr.*(data_2(j,1)-y2).*((t22.*f22)./y2);

     %for activation function 2
     %r2=2*blr*(data_2(j,1)-y2)*(t12-t22)*f12+1i*2*blr*(data_2(j,1)-y2)*(t22-t12)*f22;

     Pih2=Pih2+r2;
     Wih2= Wih2+(conj(m(j,:)))'.*r2;
     %///////////////////////////////////////////////

      E1t=E1+E1t;
      E2t=E2+E2t;
      E_Total=(E1+E2+E_Total);
      E1;
      E2;

     end
      Err=E_Total/(2.*384);
     figure(1)
     plot(ite,Err,'b--')
     hold on;
     %figure(1)


 end


dlmwrite('weight.txt',Wih1)
dlmwrite('weight.txt', Wih2, '-append', ...
   'roffset', 1, 'delimiter', ' ')
dlmwrite('weight.txt', Pih1, '-append', ...
   'roffset', 1, 'delimiter', ' ')
dlmwrite('weight.txt', Pih2, '-append', ...


'roffset', 1, 'delimiter', ' ')

我仍然无法弄清楚数据集上这种相反特征背后的原因。因此,感谢您对此提供任何帮助。

4

2 回答 2

0

如果你在做梯度下降,一个非常常见的调试技术是检查你计算的梯度是否真的与你的损失函数的数值梯度相匹配。

也就是说,检查

(f(x+dx)-f(x))/dx==f'(x)*dx

适合各种小dx。通常沿着每个维度尝试,以及在各种随机方向上尝试。您还希望对 x 的各种值进行此检查。

于 2015-03-09T02:24:36.163 回答
0

您应该看一下这个博客以了解复杂的反向传播。

对于全纯函数,复 BP 相当简单。

对于非全纯函数(每个 CVNN 必须至少有一个非全纯函数),需要小心对待。

于 2018-02-02T14:18:31.787 回答