让我解释一下我的情况:
在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
虽然网络收敛良好(基于以下训练曲线),但我无法达到预测结果。
你能在这里发现任何错误吗?
我不确定 forwardprop 和反向支持功能的功能。
任何建议将不胜感激。
感谢,