优化神经网络训练速度和内存
内存减少
根据特定神经网络,仿真和梯度计算可以在 MATLAB® 或 MEX 中进行。MEX 的内存效率更高,但 MATLAB 可以用时间来换取更高的内存效率。
要确定使用的是 MATLAB 还是 MEX,请使用 'showResources'
选项,如以下一般语法所示:
net2 = train(net1,x,t,'showResources','yes')
如果正在使用 MATLAB 并且存在内存限制,则可对 N
个数据子集中的每个子集依次执行 N
次计算,以换取将所需的临时存储量减少至原来的 1/N
。
net2 = train(net1,x,t,'reduction',N);
这称为降内存。
快速艾略特 sigmoid
一些简单的计算硬件可能不直接支持指数函数,而软件实现可能很慢。艾略特 sigmoid elliotsig
函数的作用与对称 sigmoid tansig
函数相同,但避免了指数函数。
以下是艾略特 sigmoid 的绘图:
n = -10:0.01:10; a = elliotsig(n); plot(n,a)
接下来,将 elliotsig
与 tansig
进行比较。
a2 = tansig(n); h = plot(n,a,n,a2); legend(h,'elliotsig','tansig','Location','NorthWest')
要使用 elliotsig
而不是 tansig
来训练神经网络,请变换网络的传递函数:
[x,t] = bodyfat_dataset; net = feedforwardnet; view(net) net.layers{1}.transferFcn = 'elliotsig'; view(net) net = train(net,x,t); y = net(x)
此处比较 elliotsig
和 tansig
的执行时间。elliotsig
在测试系统上大约快四倍。
n = rand(5000,5000); tic,for i=1:100,a=tansig(n); end, tansigTime = toc; tic,for i=1:100,a=elliotsig(n); end, elliotTime = toc; speedup = tansigTime / elliotTime speedup = 4.1406
然而,虽然使用 elliotsig
进行仿真更快,但由于两个传递函数的形状不同,训练速度不一定会更快。此处,为 tansig
和 elliotsig
分别训练 10 个网络,但即使使用同一网络基于同一问题进行训练,训练时间也有很大差异。
[x,t] = bodyfat_dataset; tansigNet = feedforwardnet; tansigNet.trainParam.showWindow = false; elliotNet = tansigNet; elliotNet.layers{1}.transferFcn = 'elliotsig'; for i=1:10, tic, net = train(tansigNet,x,t); tansigTime = toc, end for i=1:10, tic, net = train(elliotNet,x,t), elliotTime = toc, end