如何在Matlab神经网络工具箱中正确定义传输(激活)功能?

时间:2017-03-06 15:06:06

标签: matlab neural-network backpropagation gradient-descent

让我解释一下我的情况:

在Matlab神经网络工具箱中有一些预定义的传输(激活)函数,如logsig,tansig,pureline,softmax等。

这些功能存储在 ../ Matlab文件夹/工具箱/ nnet / nnet / nntransfer / 中。

每个功能都有一个名称相同的文件夹,以 + 开头。

让我们看看我们对 tansig 转移功能的看法:

apply.m 文件包含正向传递的代码:

function a = apply(n,param)
  a = 2 ./ (1 + exp(-2*n)) - 1;
end

其中, a 是图层输出 n 是图层的加权输入

da_dn 文件包含激活函数衍生的定义:

function d = da_dn(n,a,param)
    d = 1-(a.*a);
end

同样, a 是图层输出 n 是图层的加权输入。< / p>

对于反向传播过程,有两个我完全不理解的文件,但我认为它们分别用于计算图层的传入和传出渐变:

function da = forwardprop(dn,n,a,param)
  da = bsxfun(@times,dn,1-(a.*a));
end
function dn = backprop(da,n,a,param)
 dn = bsxfun(@times,da,1-(a.*a));
end

我的目标是定义矢量规范化图层。

所以,我以这种方式改变了上述文件:

function a = apply(n,param) % (forward pass) function
 [M,N] = size(n);
 norm = sqrt(sum(n.^2,1)); 
 a = n;
 for i = 1:M
     for j = 1:N
         a(i,j) = n(i,j) / norm(1,j);
     end
 end
 end



 function d = da_dn(n,a,param)
 %VectorNormalizer.DA_DN Input-Output derivative
 [M,N] = size(n);
 d = zeros(M,N);

 Den=sqrt((sum(n.^2,1)).^3); % partial derivatives denominator matrix
 Num=zeros(M,N); % partial derivatives numerator matrix

 inDiag=zeros(1,N); % computing diagonal  elements of numerator matrix (sum of squares of non_diagonal elements in each column) 
 for i=1:M
     for j=1:N
         if (i~=j)
             inDiag(1,j)=inDiag(1,j)+(n(i,j).^2);
         end
     end
 end

outDiag=ones(M,N); % computing non-diagonal  elements of numerator (negative multiplication of each non_diagonal element and diagonal element of each column)
for j=1:N
    outDiag(:,j)=-n(j,j);
end
for i=1:M
    for j=1:N
        if (i~=j)
            outDiag(i,j)=n(i,j)*outDiag(i,j);
        end
    end
end

for i=1:M
    for j=1:N
        if (i==j)
            Num(i,j)=inDiag(1,j);
        else
            Num(i,j)=outDiag(i,j);
        end
        d(i,j)=Num(i,j)/Den(1,j);
    end
end
end % function
function da = forwardprop(dn,n,a,param)
%% I did not find any way to pass "d" here, so I copied "d" computation codes from da_da function into here.
   da = bsxfun(@times,dn,d);
end
function dn = backprop(da,n,a,param)
%% I did not find any way to pass "d" here, so I copied "d" computation codes from da_da function into here.
   dn = bsxfun(@times,da,d);
end

虽然网络收敛良好(基于以下训练曲线),但我无法达到预测结果。

enter image description here

你能在这里发现任何错误吗?

我不确定 forwardprop 反向支持功能的功能。

任何建议将不胜感激。

感谢,

0 个答案:

没有答案