gpt4 book ai didi

matlab - 以其他编程语言导出使用 MATLAB 训练的神经网络

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:01 24 4
gpt4 key购买 nike

我使用 MATLAB 神经网络工具箱训练了一个神经网络,特别是使用命令 nprtool,它提供了一个简单的 GUI 来使用工具箱功能,并导出 net 包含有关生成的神经网络信息的对象。

通过这种方式,我创建了一个工作神经网络,我可以将其用作分类器,表示它的图表如下:

Diagram representing the Neural Network

有 200 个输入,第一个隐藏层有 20 个神经元,最后一层有 2 个神经元提供二维输出。

我想做的是在其他一些编程语言(C#、Java 等)中使用网络。

为了解决这个问题,我尝试在MATLAB中使用如下代码:

y1 = tansig(net.IW{1} * input + net.b{1});
Results = tansig(net.LW{2} * y1 + net.b{2});

假设 input 是一个包含 200 个元素的一维数组,如果 net.IW{1} 是一个 20x200 矩阵(20 个神经元,200 个权重).

问题是我注意到 size(net.IW{1}) 返回了意外的值:

>> size(net.IW{1})

ans =

20 199

我在有 10000 个输入的网络中遇到了同样的问题。在这种情况下,结果不是 20x10000,而是 20x9384(我不记得确切的值)。

那么,问题是:如何获得每个神经元的权重?在那之后,有人可以向我解释如何使用它们来生成与 MATLAB 相同的输出吗?

最佳答案

我解决了上述问题,我认为分享我所学到的东西很有用。

场所

首先,我们需要一些定义。让我们考虑下图,取自 [1]:

A scheme of Neural Network

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

All neurons are connected with all inputs

所有其他权重,称为层权重(第一个图中的LW),它们也与前一层的每个输出相连。在我们的研究案例中,我们使用只有两层的网络,因此我们将只使用一个 LW 数组来解决我们的问题。

问题的解决

经过上面的介绍,我们可以将问题分为两步进行:

  • 强制初始权重的数量与输入数组长度相匹配
  • 使用权重来实现和使用刚刚用其他编程语言训练的神经网络

A - 强制初始权重的数量与输入数组长度匹配

使用nprtool,我们可以训练我们的网络,在过程结束时,我们还可以在工作区中导出一些关于整个训练过程的信息。特别是,我们需要导出:

  • 代表所创建的神经网络的 MATLAB 网络对象
  • 用于训练网络的输入数组
  • 用于训练网络的目标数组

此外,我们还需要生成一个 M 文件,其中包含 MATLAB 用于创建神经网络的代码,因为我们需要修改它并更改一些训​​练选项。

下图显示了如何执行这些操作:

The nprtool GUI to export data and generate the M-code

生成的 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);

其中 inputtarget 是我们通过 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 数组,还有 biases 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 answerSangeun Chi's answer了解更多详情。

关于matlab - 以其他编程语言导出使用 MATLAB 训练的神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com