15

MATLAB Neural Network Toolbox を使用して、特にコマンド を使用してニューラル ネットワークをトレーニングしました。このコマンドは、ツールボックスの機能を使用し、生成された NN に関する情報を含むオブジェクトをnprtoolエクスポートするためのシンプルな GUI を提供します。net

このようにして、分類子として使用できる機能するニューラル ネットワークを作成しました。これを表す図は次のとおりです。

ニューラル ネットワークを表す図

200 個の入力、最初の隠れ層に 20 個のニューロン、最後の層に 2 個のニューロンがあり、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 の同じ出力を生成する方法を説明できますか?

4

5 に答える 5

0

OpenCV を使用して C++ で単純な 2 層 NN を実装しようとした後、重みを Android にエクスポートすると、静かに動作しました。学習した重みでヘッダー ファイルを生成する小さなスクリプトを作成しました。これは、次の抜粋されたコードで使用されています。

// Map Minimum and Maximum Input Processing Function
Mat mapminmax_apply(Mat x, Mat settings_gain, Mat settings_xoffset, double settings_ymin){

    Mat y;

    subtract(x, settings_xoffset, y);
    multiply(y, settings_gain, y);
    add(y, settings_ymin, y);

    return y;


    /* MATLAB CODE
     y = x - settings_xoffset;
     y = y .* settings_gain;
     y = y + settings_ymin;
     */
}




// Sigmoid Symmetric Transfer Function
Mat transig_apply(Mat n){
    Mat tempexp;
    exp(-2*n, tempexp);
    Mat transig_apply_result = 2 /(1 + tempexp) - 1;
    return transig_apply_result;
}


// Map Minimum and Maximum Output Reverse-Processing Function
Mat mapminmax_reverse(Mat y, Mat settings_gain, Mat settings_xoffset, double settings_ymin){

    Mat x;

    subtract(y, settings_ymin, x);
    divide(x, settings_gain, x);
    add(x, settings_xoffset, x);

    return x;


/* MATLAB CODE
function x = mapminmax_reverse(y,settings_gain,settings_xoffset,settings_ymin)
x = y - settings_ymin;
x = x ./ settings_gain;
x = x + settings_xoffset;
end
*/

}


Mat getNNParameter (Mat x1)
{

    // convert double array to MAT

    // input 1
    Mat x1_step1_xoffsetM = Mat(1, 48, CV_64FC1, x1_step1_xoffset).t();
    Mat x1_step1_gainM = Mat(1, 48, CV_64FC1, x1_step1_gain).t();
    double x1_step1_ymin = -1;

    // Layer 1
    Mat b1M = Mat(1, 25, CV_64FC1, b1).t();
    Mat IW1_1M = Mat(48, 25, CV_64FC1, IW1_1).t();

    // Layer 2
    Mat b2M = Mat(1, 48, CV_64FC1, b2).t();
    Mat LW2_1M = Mat(25, 48, CV_64FC1, LW2_1).t();

    // input 1
    Mat y1_step1_gainM = Mat(1, 48, CV_64FC1, y1_step1_gain).t();
    Mat y1_step1_xoffsetM = Mat(1, 48, CV_64FC1, y1_step1_xoffset).t();
    double y1_step1_ymin = -1;



    // ===== SIMULATION ========


    // Input 1
    Mat xp1 = mapminmax_apply(x1, x1_step1_gainM, x1_step1_xoffsetM, x1_step1_ymin);

    Mat  temp = b1M + IW1_1M*xp1;

    // Layer 1
    Mat a1M = transig_apply(temp);

    // Layer 2
    Mat a2M = b2M + LW2_1M*a1M;

    // Output 1
    Mat y1M = mapminmax_reverse(a2M, y1_step1_gainM, y1_step1_xoffsetM, y1_step1_ymin);

    return y1M;
}

ヘッダーのバイアスの例は次のとおりです。

static double b2[1][48] = {
        {-0.19879, 0.78254, -0.87674, -0.5827, -0.017464, 0.13143, -0.74361, 0.4645, 0.25262, 0.54249, -0.22292, -0.35605, -0.42747, 0.044744, -0.14827, -0.27354, 0.77793, -0.4511, 0.059346, 0.29589, -0.65137, -0.51788, 0.38366, -0.030243, -0.57632, 0.76785, -0.36374, 0.19446, 0.10383, -0.57989, -0.82931, 0.15301, -0.89212, -0.17296, -0.16356, 0.18946, -1.0032, 0.48846, -0.78148, 0.66608, 0.14946, 0.1972, -0.93501, 0.42523, -0.37773, -0.068266, -0.27003, 0.1196}};

現在、Google が Tensorflow を公開したため、これは廃止されました。

于 2016-12-06T07:28:08.843 に答える