Vit*_*ile 15 matlab porting neural-network
我使用MATLAB神经网络工具箱训练神经网络,特别是使用命令nprtool,该命令提供了一个简单的GUI来使用工具箱特征,并导出net包含有关生成的NN的信息的对象.
通过这种方式,我创建了一个可以用作分类器的工作神经网络,并且代表它的图表如下:

第一个隐藏层有200个输入,20个神经元,最后一层有2个神经元提供二维输出.
我想要做的是在其他一些编程语言(C#,Java,...)中使用网络.
为了解决这个问题,我尝试在MATLAB中使用以下代码:
y1 = tansig(net.IW{1} * input + net.b{1});
Results = tansig(net.LW{2} * y1 + net.b{2});
Run Code Online (Sandbox Code Playgroud)
假设这input是一个包含200个元素的单维数组,如果net.IW{1}是20x200矩阵(20个神经元,200个权重),则前面的代码将起作用.
问题是我发现它size(net.IW{1})返回了意外的值:
>> size(net.IW{1})
ans =
20 199
Run Code Online (Sandbox Code Playgroud)
我在使用10000输入的网络时遇到了同样的问题.在这种情况下,结果不是20x10000,而是像20x9384(我不记得确切的值).
所以,问题是:我怎样才能获得每个神经元的权重?之后,有人可以解释我如何使用它们来生成相同的MATLAB输出?
Vit*_*ile 14
我解决了上面提到的问题,我认为分享我学到的东西是有用的.
房地
首先,我们需要一些定义.让我们考虑以下图片,取自[1]:

在上图中,IW代表初始权重:它们代表第1层上神经元的权重,每个权重与每个输入相连,如下图所示[1]:

所有其他权重称为层权重(第一个图中的LW),它们也与前一层的每个输出相关联.在我们的研究中,我们使用只有两层的网络,因此我们将只使用一个LW阵列来解决我们的问题.
解决问题
在上述介绍之后,我们可以通过两个步骤来划分问题:
A - 强制初始权重的数量与输入数组长度匹配
使用nprtool,我们可以培训我们的网络,在流程结束时,我们还可以在工作区中导出有关整个培训过程的一些信息.特别是,我们需要出口:
此外,我们需要生成一个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)
Run Code Online (Sandbox Code Playgroud)
在开始训练过程之前,我们需要删除 MATLAB在输入和输出上执行的所有预处理和后处理功能.这可以在行之前添加以下% Train and Apply Network行:
net.inputs{1}.processFcns = {};
net.outputs{2}.processFcns = {};
Run Code Online (Sandbox Code Playgroud)
在对create_pr_net()函数进行这些更改之后,我们可以使用它来创建我们的最终神经网络:
net = create_pr_net(input, target);
Run Code Online (Sandbox Code Playgroud)
这里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
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我们使用上面提到的IW和LW数组,但也使用了网络模式中使用的偏差 b nprtool.在这种情况下,我们不关心偏见的作用 ; 简单地说,我们需要使用它们,因为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
Run Code Online (Sandbox Code Playgroud)
显然,该classify()函数可以解释为伪代码,然后在每种编程语言中实现,其中可能定义MATLAB tansig()函数[2]和数组之间的基本操作.
参考
[1] Howard Demuth,Mark Beale,Martin Hagan:神经网络工具箱6 - 用户指南,MATLAB
[2] Mathworks,tansig - 双曲正切sigmoid传递函数,MATLAB文档中心
补充说明
请查看robott的答案和Sangeun Chi的答案以获取更多详细信息.
| 归档时间: |
|
| 查看次数: |
20054 次 |
| 最近记录: |