2

Matlabでニューラルネットワークをトレーニングしました(ニューラルネットワークツールボックスを使用)。次に、計算された重みとバイアスを別のプラットフォーム(PHP)にエクスポートして、それらを使用して計算を行います。これを行うための関数または方程式を作成する方法はありますか?

私はこの関連する質問を見つけました:Matlabでニューラルネットワークを計算する方程式

自分のやりたいことを実行して、NNの結果(29個の入力、10個の非表示レイヤー、1個の出力)をPHPに移植する方法はありますか?

4

3 に答える 3

2

はい、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

于 2012-12-11T11:32:37.187 に答える
2

これらすべてを転送するのは非常に簡単です。必要になるだろう:

  1. 行列の乗算のコードを記述します。これは、非常に単純な2つのforループです。
  2. 次に、Matlabのドキュメントによるとtansig(n)= 2 /(1 + exp(-2 * n))-1であることに注意してください。PHPにはexpがあると確信しています(そうでない場合は、自分で記述できる非常に単純な多項式展開があります)
  3. Jasper van den Boschの優れた回答を読んで理解し、適用してください。
于 2012-12-11T21:54:46.777 に答える
0

したがって、解決策は(すべての間違った部分を修正した後)になります

ここではMatlabでソリューションを提供していますが、tanh()関数があれば、それを任意のプログラミング言語に簡単に変換できます。PHPの場合、tanh()関数が存在します:php tanh()。これは、ネットワークオブジェクトのフィールドと必要な操作を表示するためのものです。

  • エクスポートするトレーニング済みのアン(ネットワークオブジェクト)があるとします。
  • 訓練されたアンの名前がtrained_annであると仮定します

エクスポートとテストのスクリプトは次のとおりです。テストスクリプトは、元のネットワーク結果を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')';

次の2つの機能が必要な場合

最初の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

2番目の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
于 2017-03-09T15:26:52.153 に答える