我在 Matlab 中训练了一个神经网络(使用神经网络工具箱)。现在我想将计算的权重和偏差导出到另一个平台(PHP),以便用它们进行计算。有没有办法创建一个函数或方程来做到这一点?
我发现了这个相关的问题:Equation that compute a Neural Network in Matlab。
有没有办法做我想做的并将我的 NN(29 个输入,10 个隐藏层,1 个输出)的结果移植到 PHP?
我在 Matlab 中训练了一个神经网络(使用神经网络工具箱)。现在我想将计算的权重和偏差导出到另一个平台(PHP),以便用它们进行计算。有没有办法创建一个函数或方程来做到这一点?
我发现了这个相关的问题:Equation that compute a Neural Network in Matlab。
有没有办法做我想做的并将我的 NN(29 个输入,10 个隐藏层,1 个输出)的结果移植到 PHP?
是的,net
另一个问题中还引用的属性是简单的矩阵:
W1=net.IW{1,1};
W2=net.LW{2,1};
b1=net.b{1,1};
b2=net.b{2,1};
因此,您可以将它们以逗号分隔值的形式写入文件。
csvwrite('W1.csv',W1)
然后,在 PHP 中读取这些数据并根据需要转换或使用它。
<?php
if (($handle = fopen("test.csv", "r")) !== FALSE) {
$data = fgetcsv($handle, 1000, ",");
}
?>
然后,要处理权重,您可以通过替换 tansig 函数来使用另一个问题中的公式,该函数根据以下公式计算:
n = 2/(1+exp(-2*n))-1
这在数学上等价于tanh(N)
它也存在于php中。
来源:http ://dali.feld.cvut.cz/ucebna/matlab/toolbox/nnet/tansig.html
转移所有这些非常简单。你会需要:
因此解决方案变为(在纠正所有错误部分之后)
这里我在 Matlab 中给出了一个解决方案,但是如果你有 tanh() 函数,你可以很容易地将它转换为任何编程语言。对于 PHP,存在 tanh() 函数:php tanh()。它仅用于显示网络对象中的字段和您需要的操作。
这是用于导出和测试的脚本。测试脚本将原始网络结果与 my_ann_evaluation() 结果进行比较
% Export IT
exported_ann_structure = my_ann_exporter(trained_ann);
% Run and Compare
% Works only for single INPUT vector
% Please extend it to MATRIX version by yourself
input = [12 3 5 100];
res1 = trained_ann(input')';
res2 = my_ann_evaluation(exported_ann_structure, input')';
您需要以下两个功能的地方
首先 my_ann_exporter:
function [ my_ann_structure ] = my_ann_exporter(trained_netw)
% Just for extracting as Structure object
my_ann_structure.input_ymax = trained_netw.inputs{1}.processSettings{1}.ymax;
my_ann_structure.input_ymin = trained_netw.inputs{1}.processSettings{1}.ymin;
my_ann_structure.input_xmax = trained_netw.inputs{1}.processSettings{1}.xmax;
my_ann_structure.input_xmin = trained_netw.inputs{1}.processSettings{1}.xmin;
my_ann_structure.IW = trained_netw.IW{1};
my_ann_structure.b1 = trained_netw.b{1};
my_ann_structure.LW = trained_netw.LW{2};
my_ann_structure.b2 = trained_netw.b{2};
my_ann_structure.output_ymax = trained_netw.outputs{2}.processSettings{1}.ymax;
my_ann_structure.output_ymin = trained_netw.outputs{2}.processSettings{1}.ymin;
my_ann_structure.output_xmax = trained_netw.outputs{2}.processSettings{1}.xmax;
my_ann_structure.output_xmin = trained_netw.outputs{2}.processSettings{1}.xmin;
end
第二个 my_ann_evaluation:
function [ res ] = my_ann_evaluation(my_ann_structure, input)
% Works with only single INPUT vector
% Matrix version can be implemented
ymax = my_ann_structure.input_ymax;
ymin = my_ann_structure.input_ymin;
xmax = my_ann_structure.input_xmax;
xmin = my_ann_structure.input_xmin;
input_preprocessed = (ymax-ymin) * (input-xmin) ./ (xmax-xmin) + ymin;
% Pass it through the ANN matrix multiplication
y1 = tanh(my_ann_structure.IW * input_preprocessed + my_ann_structure.b1);
y2 = my_ann_structure.LW * y1 + my_ann_structure.b2;
ymax = my_ann_structure.output_ymax;
ymin = my_ann_structure.output_ymin;
xmax = my_ann_structure.output_xmax;
xmin = my_ann_structure.output_xmin;
res = (y2-ymin) .* (xmax-xmin) /(ymax-ymin) + xmin;
end