Я решил проблемы, описанные выше, и я думаю, что полезно поделиться тем, что я узнал.
Помещения
Прежде всего, нам нужно несколько определений. Давайте рассмотрим следующий образ, взятый из [1]:
На приведенном выше рисунке, IW означает начальных весов: они представляют веса нейронов на уровне 1, каждый из которых соединен с каждым входом, как показывает следующее изображение [1]:
всех остальных весов, называются Толщина слоя (LW на первом рисунке), которые также связаны с каждым выходом предыдущего слоя. В нашем случае мы используем сеть с двумя слоями, поэтому мы будем использовать только один массив LW для решения наших проблем.
Решение задачи
После выше введения, мы можем продолжить путем деления вопроса в два этапа:
- заставляя их число начальных весов в соответствии с длиной входного массива
- Используйте весы для внедрения и использования нейронной сети, прошедшей обучение только на других языках программирования.
A - Принудительно число начальных весов в соответствии с длиной входного массива
Используя nprtool
, мы можем обучить нашу сеть, и в конце процесса, мы можем также экспортировать в рабочем пространстве некоторой информации о весь процесс обучения. В частности, нам нужно экспортировать:
- объект MATLAB сеть, которая представляет собой нейронную сеть, созданная
- массив ввода, используемый для обучения сети
- целевой массив используется для обучения сети
Кроме того, нам нужно сгенерировать M-файл, содержащий код, используемый MATLAB для создания нейронной сети, потому что нам нужно изменить его и изменить некоторые варианты обучения.
На следующем рисунке показано, как выполнить эти операции:
M-код, сгенерированный будет похож на следующий:
function net = create_pr_net(inputs,targets)
%CREATE_PR_NET Creates and trains a pattern recognition neural network.
%
% NET = CREATE_PR_NET(INPUTS,TARGETS) takes these arguments:
% INPUTS - RxQ matrix of Q R-element input samples
% TARGETS - SxQ matrix of Q S-element associated target samples, where
% each column contains a single 1, with all other elements set to 0.
% and returns these results:
% NET - The trained neural network
%
% For example, to solve the Iris dataset problem with this function:
%
% load iris_dataset
% net = create_pr_net(irisInputs,irisTargets);
% irisOutputs = sim(net,irisInputs);
%
% To reproduce the results you obtained in NPRTOOL:
%
% net = create_pr_net(trainingSetInput,trainingSetOutput);
% Create Network
numHiddenNeurons = 20; % Adjust as desired
net = newpr(inputs,targets,numHiddenNeurons);
net.divideParam.trainRatio = 75/100; % Adjust as desired
net.divideParam.valRatio = 15/100; % Adjust as desired
net.divideParam.testRatio = 10/100; % Adjust as desired
% Train and Apply Network
[net,tr] = train(net,inputs,targets);
outputs = sim(net,inputs);
% Plot
plotperf(tr)
plotconfusion(targets,outputs)
Перед начать процесс обучения, мы необходимо, чтобы удалил все функции предварительной обработки и постпроцессинга, которые MATLAB выполняет на входах и выходах. Это можно сделать, добавив следующие строки непосредственно перед % Train and Apply Network
линий:
net.inputs{1}.processFcns = {};
net.outputs{2}.processFcns = {};
После этих изменений в функции create_pr_net()
, просто мы можем использовать его для создания нашей конечной нейронной сети:
net = create_pr_net(input, target);
где input
и target
- это значения, которые мы экспортировали через nprtool
.
Таким образом, мы уверены, что количество весов равно длине входного массива. Кроме того, этот процесс полезен для упрощения переноса на другие языки программирования.
B - Внедрение и использование нейронной сети только обученного на других языках программирования
С учетом этих изменений, мы можем определить функцию так:
function [ Results ] = classify(net, input)
y1 = tansig(net.IW{1} * input + net.b{1});
Results = tansig(net.LW{2} * y1 + net.b{2});
end
В этом коде мы используем IW и LW, но также и ошибки b, используемые в сетевой схеме на nprtool
. В этом контексте нас не волнует role of biases; просто, мы должны использовать их, потому что nprtool
делает это.
Теперь мы можем использовать функцию classify()
определено выше, или функцию sim()
в равной степени, получая те же результаты, как показано в следующем примере:
>> sim(net, input(:, 1))
ans =
0.9759
-0.1867
-0.1891
>> classify(net, input(:, 1))
ans =
0.9759
-0.1867
-0.1891
Очевидно, что функция classify()
может интерпретироваться как псевдокод, а затем реализуется на всех языках программирования, в которых возможно определить функцию MATLAB tansig()
[2] и основные операции между массивами.
Ссылки
[1] Howard Demuth, Mark Beale, Martin Hagan: Neural Network Toolbox 6 - User Guide, MATLAB
[2] Mathworks, tansig - Hyperbolic tangent sigmoid transfer function, MATLAB Documentation center
Дополнительные примечания
Посмотрите на robott's answer и Sangeun Chi's answer для более подробной информации.
Некоторые весовые коэффициенты могут быть установлены в 0 и поэтому вырезаны из матрицы. Надеюсь, если я прав, есть место где-то, чтобы избежать такого поведения. – CTZStef
Я не вижу никаких настроек для изменения таких параметров ... Можете ли вы помочь мне найти их? –