复值神经网络(CVNN)误差分歧

时间:2013-08-15 09:53:22

标签: matlab neural-network backpropagation gradient-descent

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

Data Set

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

Algorithm of CVN Model

但是没有收敛,我的错误曲线显示出不同的特征。这是我的错误曲线输出。

error curve at CVNN implementation

我在 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', ' ')

我仍然无法弄清楚数据集上这些相反特征背后的原因。所以对此有任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:0)

如果您正在进行梯度下降,一种非常常见的调试方法是检查您计算的渐变是否实际上与损失函数的数值梯度相匹配。

即检查

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

适用于各种小型dx。通常尝试每个维度,以及各种随机方向。您还需要检查x的各种值。

答案 1 :(得分:0)

你应该看一下这个blog的复杂反向传播。

对于全纯函数,复杂BP非常简单。

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