簡単な説明
インターネットの急速な発展に伴い、A(AI)B(BigData)C(クラウド)が現在コア開発の方向になっています。 3つが深く組み合わされている場合、AIはその中で最もコア部分です。したがって、誰もが将来の社会でプログラミングを学ばなければならない場合、プログラマーにとって、人工知能は彼らが習得しなければならない技術です(テクノロジー開発は非常に速いです)。
この記事では、Javaを紹介し、使用して、フォーミュラ派生に絡み合うことなく、最も単純なPerceptronネットワークを実装し、ニューラルネットワークを学習するためのアイデアを提供し、ニューラルネットワークを大まかに理解することを目指しています。
パーセプトロンネットワークモデル分析
まず写真を見てください
あなたがニューラルネットワークに少し興味があるなら、あなたはこの写真に精通している必要があります。この写真は、ニューロンの構造図です
x1〜xmは入力を表し、w1〜wmはシナプス重量を表し、σはノードの合計を表し、アクティベーション関数はアクティベーション関数を表し、結果を出力します。特定のプロセスはです
ニューロンが入力を受信すると、各入力は相対パス上の重量を掛けます。合計ノードに到達すると、合計ノードの結果がzに設定されます。
z = x1 * w1 + x2 * w2 + x3 * w3 + ...... + xm * wm
次に、バイナリパターン認識のためにzをアクティベーション関数(ここでアクティベーション関数fと呼びます)に渡します。
f(x)> e、y = 1else y = -1eがしきい値yが分類結果である場合
ここでは、f(x)の値がしきい値よりも大きい場合、分類y = 1が取得され、逆y = -1が取得されることがわかります。
注:生物学的ニューロンの刺激によって示される応答と比較して、刺激が許容範囲内にある場合、ニューロンは刺激を阻害し(Y = -1)、範囲を超えている場合、それは励起され(Y = 1)、この範囲の流域はしきい値(E)です。
勉強
重みとしきい値が固定されている場合、このニューラルネットワークには意味がないことがわかりました。したがって、学習の概念を導入し、神経ネットワークが学習を通じて重みとしきい値を変更して、パターン認識の精度を動的に修正できるようにします。これが機械学習の本質です。
では、どのように学ぶのですか?使用する前に、このネットワークにサンプルデータのセットを提供する必要があります(ここでは教師モードで学習するために取得されます)、サンプルデータには入力データxと正しい識別結果y 'が含まれます。
トレーニングデータxを入力してパターン認識yを取得すると、y!= y 'の場合、このネットワークの重みとしきい値が調整されます。調整については、式を参照してください。 μは学習率(修正率)を表し、更新は修正する必要性を表します。
update =μ *(yi -y ')update =(f(x)-y')mςwi += update * xii = 1e += update
Perceptronの分類結果が正しい分類に等しい場合、更新= 0で、ネットワークは調整されていません。正しい分類に等しくない場合、すべての重み(W)としきい値(E)が調整されます
上記は、私が紹介したパーセプトロンの最も単純な学習プロセスです。
データ - > summarize z->> wait for activation functionを介して分類結果を待つ - >分類結果は正しい結果と一致しない、ネットワークを調整する
この単純なニューラルネットワークを実装しましょう
Javaコードの実装
ここで私が実装したのは、ニューラルネットワークを介して整数の肯定的およびネガティブを認識することを学ぶことです。まず、最初にパーセプトロンを定義するクラスを定義します。
/*** 12/2/17にCimzzzによって作成されました。 **/public class perceptron {/***学習率*/プライベートファイナルフロートLearnRate; / ***学習時間の数*/プライベート最終int StudyCount; / ***しきい値*/ private float e; / ***重量*正と負の整数を決定するために1つの入力のみが必要なため、ここには1つの重量のみがあり、複数の入力を配列*/ private float wに設定できます。 / ***各学習の正しいレート*/ private float [] recortrate; /// ** *コンストラクターの初期化学習率、学習時間の数、重量、しきい値は0に初期化されます * @param LearnRate学習率(値範囲0 <学習<1) * @param StudyCount学習時間 */ public Perceptron(float Learnrate、int Studycount){this.Lealnrate = Learnrate; this.studycount = StudyCount; this.e = 0; this.w = 0; this.corectrate = new Float [studycount]; } / ***学習機能、サンプルは入力データと分類結果を含む2次元配列です。*サンプル[] [0]は入力データを表します*サンプル[] [1]は正しい分類結果を表します* @paramサンプルトレーニングデータ* / public void fit(int [] [] samples){int samplelength.length; length; for(int i = 0; i <studycount; i ++){int errorcount = 0; for(int [] sample:samples){float update = learnrate *(sample [1] -predict(sample [0])); //重みとしきい値を更新w += update * sample [0]; e += update; //エラー番号を計算するif(update!= 0)errorcount ++; } //この学習の正確性を正しい[i] = 1 -errorcount * 1.0f /samplelength; }} / *** sum関数、合計ノード操作入力データをシミュレートします} / ***結果zとしきい値e* @param num input data* @return classification result* / public int predict(int num){return sum(num)> = 0? 1:-1; }/*** print精度*/public void printCorrectrate(){for(int i = 0; i <studycount; i ++)system.out.printf( "%d->%.2f°/n"での学習結果、i +1、正しい[i]* 100); }}次に、トレーニングデータを生成する関数を書きます
/***トレーニングデータを生成* @returnトレーニングデータ*/private static int [] [] [] genstudydata(){//ここでは、-100〜100の間で整数を採取し、0を超える場合は、モードy = 1に設定します。 for(int i = -100、j = 0; i <= 100; i ++、j ++){data [j] [0] = i;データ[j] [1] = i> = 0? 1:-1; }データを返します。 } /***トレーニングデータを生成* @returnトレーニングデータ* /private static int [] [] genstudydata2(){//ここでは、1〜250の間で整数を採取し、125を超える場合は、モードy = 1に設定します。 for(int i = 1、j = 0; i <= 250; i ++、j ++){data [j] [0] = i; data [j] [1] = i> = 125? 1:-1; }データを返します。 }最後に、メイン関数
public static void main(string [] args){//ここでの学習率とトレーニング時間は、状況に従って手動で調整できます。 perceptron.fit(genstudydata()); perceptron.printcorrectrate(); System.out.println(perceptron.predict(-1)); System.out.println(perceptron.predict(126)); }テストできます
制限
このパーセプトロンニューラルネットワークは比較的単純であり、一次元の正と負の数や2次元座標象限分類など、線形分割データに適しています。正しく分類できないデータは、素数の検索など、分類することはできません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。