我试图对Matlab2014b实现ReLU激活功能,但我不确定我是否做得对。我将pureline.m和+ pureling(作为模板)文件夹复制到工作目录中。并改变它们如下所示:
function a = ReLU(n,varargin)
if ischar(n)
a = nnet7.transfer_fcn(mfilename,n,varargin{:});
return
end
a = ReLU.apply(n);
end
function a = apply(n,param)
a = max(n,0.01*n);
end
function d = da_dn(n,a,param)
d=ones(size(n));
d(n<0)=0.01;
d(n==0)=0.5;
end
function da = forwardprop(dn,n,a,param)
da = dn;
end
function dn = backprop(da,n,a,param)
dn = da;
end
function s = isScalar
s = true;
end
function flag = discontinuity(n,param)
flag = false(1,size(n,2));
end
function or = outputRange
or = [0 inf];
end
function ir = activeInputRange
ir = [-inf inf];
end
function param = parameterInfo
param = [];
end
function t = type
t = 'transfer_fcn';
end
function name = name()
name = 'ReLU';
end
并将其实施到NN
net.layers{1}.transferFcn='ReLU'
。它似乎有效但用ReLU训练NN所花费的时间比其他激活函数长3倍(平均),如tansig
hiperbolic tangent或pureline
linear。我用trainlm
Levenber-Marquardt和trainscg
比例共轭梯度测试了它。时间比较结果是一样的。
Actualy是Leaky ReLU。基于https://stackoverflow.com/a/32545990/6718612的导数,虽然对于n = 0看起来像dn / da = 0.5并没有产生影响。 我错过了什么?
编辑:我发现ReLU已经存在于Matlab2014b中并且被称为“poslin&#39;”。它与其他内置程序一样有效。