Оптимизируйте скорость обучения нейронной сети и память

Сокращение памяти

В зависимости от конкретной нейронной сети симуляция и вычисления градиента могут произойти в MATLAB® или MEX. MEX является большей эффективной памятью, но MATLAB может быть сделан большей памятью, эффективной в обмен на время.

Определить или MATLAB или MEX используется, используйте опцию 'showResources', как показано в этой общей форме синтаксиса:

net2 = train(net1,x,t,'showResources','yes')

Если MATLAB используется, и ограничения памяти являются проблемой, сумма необходимого временного хранения может уменьшаться фактором N, в обмен на выполнение вычислений времена N последовательно на каждом из подмножеств N данных.

net2 = train(net1,x,t,'reduction',N);

Это называется сокращением памяти.

Быстрый сигмоидальный Эллиот

Некоторое простое вычислительное оборудование не может поддерживать показательную функцию непосредственно, и реализации программного обеспечения могут быть медленными. Эллиот сигмоидальная функция elliotsig выполняет ту же роль симметричной сигмоидальной функции tansig, но избегает показательной функции.

Вот график сигмоидального Эллиота:

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, обучение, как гарантируют, не будет быстрее, из-за различных форм этих двух передаточных функций. Здесь, 10 сетей каждый обучены для tansig и elliotsig, но учебные времена отличаются значительно ровные на той же проблеме с той же сетью.

[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