Аналитическая форма нейронной сети от Matlab - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь аналитически воспроизвести функцию нейронной сети Matlab, чтобы лучше ее понять. Я уже рассмотрел следующую архитектуру Matlab NN , Функции обработки ввода / вывода Matlab и соответствующую статью , но у меня все еще есть проблемы.

Вот мой простой пример. Я хочу установить нейронную сеть с прямой связью с 1 скрытым слоем и сказать 10 нейронов, чтобы оценить функцию y = sin (4x) для x в [0,3] с учетом некоторых данных. Я хочу написать свою собственную функцию Matlab, чтобы аналитически выразить функцию нейронной сети Matlab.

Из обучения сети net Матлаб говорит мне, что передаточными функциями являются tansig (скрытый слой 1) и purelin (выход). Это также говорит мне, что функции обработки ввода и вывода: mapminmax.

Вот код, который я написал и который представляет собой простой пример сравнения: моя аналитическая функция, предсказание Матлаба и истинная функция, которую я хочу оценить:

rng(1);

xTrain = 0:0.5:3; % Training data
yTrain = sin(4*xTrain); % Training data

net = fitnet(10); % 10 neurons

net = train(net,xTrain,yTrain);

xPred = 0:0.1:3; % Prediction data

% Analytic

% Scale input
NNinput = mapminmax(xPred,net.inputs{1}.processedRange(1,1),net.inputs{1}.processedRange(1,2)); 
HL1 = tansig(net.IW{1,1}*NNinput + repmat(net.b{1},[1,size(NNinput,2)]));
HL2 = purelin(net.LW{2,1}*HL1 + repmat(net.b{2},[1,size(HL1,2)]));

% Scale output
PredValsAnlyt = mapminmax(HL2,net.outputs{2}.range(1,1),net.outputs{2}.range(1,2));

% True function
yTrue = sin(4*xPred);

% Matlab prediction
yPred = net(xPred);

figure;

plot(xPred,PredValsAnlyt,xPred,yPred,xPred,yTrue)
legend('My analytic','Matlab prediction','True')

Вот вывод, сравнивающий мою аналитическую функцию, предсказание Матлаба и истинную функцию. Хотя я не ожидаю, что предсказание Matlab будет близко к истинной функции из-за грубых данных, я ожидаю, что моя аналитическая функция и предсказание Matlab должны быть одинаковыми. Что меня беспокоит, так это то, что предсказание Matlab фактически выходит за пределы целевого диапазона [-1,1] выходных данных. Я что-то упускаю? enter image description here

Обновление: 29 марта 2019 года: После получения дополнительной информации о различных веб-сайтах и ​​игры с Matlab, похоже, что в приведенном выше коде вместо

PredValsAnlyt = mapminmax(HL2,net.outputs{2}.range(1,1),net.outputs{2}.range(1,2))

у нас есть

PredValsAnlyt = mapminmax('reverse',HL2,net.outputs{2}.processSettings{1})

Я могу согласовать свой код с выводом Matlab.

Таким образом, проблема теперь сводится к пониманию mapminmax в Matlab с обратной опцией и указанными настройками процесса. Кто-нибудь знаком с этим? Он не просто выполняет процедуру масштабирования для достижения цели min и max, потому что это то, что я делал в своем исходном коде.

...