ダミーのニューラルネットワーク。 コホネンネットワーク

ダミーのニューラルネットワークに関する記事 筆頭著者のPaul_Smithは、画像を認識するためのニューラルネットワークの作成がいかに簡単かをすぐに示しました。 しかし、一つだけあります-彼がニューラルネットワークとして説明したものはそうではありません。 彼の次の記事の前に、Kohonenニューラルネットワークを使用して同じ問題を解決する方法を説明します。



したがって、次のように、黒の上に白で書かれた数字を認識します。

画像画像画像画像画像画像



画像は45 x 45ピクセルです。つまり、ニューラルネットワークには45 * 45のエントリがあります。

簡単にするために、0から5までの数字しか認識しないため、各回答に1つずつ、6つのニューロンがあります。



ニューラルネットワークの構造:

画像



ネットワーク入力とニューロンの各接続には、独自の重みがあります。 接続を通過するインパルスは変化します:インパルス=インパルス* connection_weight。

ニューロンはすべての入力からパルスを受け取り、それらを単純に合計します。 総運動量が最大のニューロンが勝ちます。 すべてがシンプルで、私たちはそれを実装しています!



ネットワーク要素を表すクラス(C#):

//

public class Input

{

//

public Link [] OutgoingLinks;

}



//

public class Link

{

//

public Neuron Neuron;

//

public double Weight;

}



public class Neuron

{

//

public Link [] IncomingLinks;

//

public double Power { get; set; }

}







ネットワークの作成と初期化は退屈なビジネスであり、気にかけます-添付のソースをご覧ください。 ピクセルの色が0から255の数字であり、0が黒、255が白、それらの間の色がグレーのグラデーションであるという事実のみを説明します。



KohonenNetworkクラスの状態は、入力[]配列とニューロン[]配列です。

public class KohonenNetwork

{

private readonly Input [] _inputs;

private readonly Neuron [] _neurons;

...

}







私たちのネットワークがすでに訓練されていると仮定します。 次に、図に示されているものを見つけるために、Handleメソッドを呼び出します。すべてがそこで乗算され、合計され、最大値があります。

//

public int Handle( int [] input)

{

for ( var i = 0; i < _inputs.Length; i++)

{

var inputNeuron = _inputs[i];

foreach ( var outgoingLink in inputNeuron.OutgoingLinks)

{

outgoingLink.Neuron.Power += outgoingLink.Weight * input[i];

}

}

var maxIndex = 0;

for ( var i = 1; i < _neurons.Length; i++)

{

if (_neurons[i].Power > _neurons[maxIndex].Power)

maxIndex = i;

}

// :

foreach ( var outputNeuron in _neurons)

{

outputNeuron.Power = 0;

}

return maxIndex;

}







しかし、ネットワークに何かを尋ねる前に、それを訓練する必要があります。 トレーニングのために、写真を提示し、絵に描かれているものを示します。

画像

トレーニングは、接続の重みの変化です。

public void Study( int [] input, int correctAnswer)

{

var neuron = _neurons[correctAnswer];

for ( var i = 0; i < neuron.IncomingLinks.Length; i++)

{

var incomingLink = neuron.IncomingLinks[i];

incomingLink.Weight = incomingLink.Weight + 0.5 * (input[i] - incomingLink.Weight);

}

}







2つのフォントでトレーニングした後、ニューラルネットワークは数字と他のフォントを区別します。 制御テストを含めると、これらの数値が渡されます。

画像画像画像画像画像画像

もちろん、このような工芸品はキャプチャ認識には適していません-すべてが機能しなくなり、画像を移動、伸縮、または回転させるだけです。

ただし、単純な例から始めれば、ニューラルネットワークを使用することはそれほど難しくないことは誰にとっても明らかです。

工芸品のソース



All Articles