ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。
今回は、ニューラルネットワークのフォワードプロパゲーション(ニューラルネットワークにおいてネットワークを入力層から出力層にデータを流す手法)を実装してみたので、そのサンプルプログラムを共有する。
なお、フォワードプロパゲーションについては、以下のサイトを参照のこと。
https://hossuii.com/?p=1803
前提条件
以下の記事の実装が完了していること。
ニューラルネットワーク内の単一ニューロンを実装してみた ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラー...
今回実装するニューラルネットワークの全体構成は、以下のようになる。
このうち、単一ニューロンを実装した内容は以下の通りで、前提条件の単一ニューロンの実装と同じ内容になっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import numpy as np # 単一ニューロン class OrigNeuron: # 変数の初期化 def __init__(self): # 入力データ(変数x) self.x = np.array([]) # 入力データ(重みw) self.w = np.array([]) # 出力データ(シグモイド関数の変換前) self.u = 0 # 出力データ self.y = 0 # 入力データ(変数x、重みw:いずれもNumpy配列)の設定 def set_input_data(self, x, w): if self.__input_check(x, 2) and self.__input_check(w, 3): self.x = x self.w = w else: print("OrigNeuron set_input_data : 引数の指定方法が誤っています") # フォワードプロパゲーションで出力変数を設定 def forward(self): if self.__input_check(self.x, 2) and self.__input_check(self.w, 3): self.u = self.x[0] * self.w[0] + self.x[1] * self.w[1] + self.w[2] self.y = self.__sigmoid(self.u) # 出力データyを返却 def get_y(self): return self.y # 入力データの型・長さをチェック def __input_check(self, data, size): if isinstance(data, np.ndarray) and len(data) == size: if np.issubdtype(data.dtype, float) or np.issubdtype(data.dtype, int): return True return False return False # シグモイド関数による変換 def __sigmoid(self, data): return 1.0 / (1.0 + np.exp(-data)) |
「CODE×CODE」は、需要の高い技術(AWS, Python等)を習得できるプログラミングスクールスクールだった近年、さまざまな会社でクラウド(特にIaaSやPaaSのパブリッククラウド)の需要が非常に高まっていて、クラウドサービスによるシステム開...
また、「ニューラルネットワークの全体構成」に相当するニューラルネットワークを実装した内容は以下の通りで、forwardメソッドでニューラルネットワークを構成している。
なお、__init__メソッドの重み\(\boldsymbol w\)は、出力結果\(y\)が、入力値\(x_0=x_1=0\)または\(x_0=x_1=1\)の場合に\(0\)に近く、そうでない場合は\(1\)に近い値になるよう、設定している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import numpy as np # ニューラルネットワーク class OrigNeuralNetwork: # 変数の初期化(変数x、重みw:いずれもNumpy配列)の設定 def __init__(self, x): if self.__input_check(x, 2): self.x = x self.w = np.array([[6.2, 6.2, -2.7], [4.1, 4.1, -6.3], [8.5, -9.2, -3.8]]) else: self.x = np.array([]) self.w = np.array([[],[],[]]) print("OrigNeuralNetwork set_input_data : 引数の指定方法が誤っています") # フォワードプロパゲーションで出力変数を設定 def forward(self): if self.__input_check(self.x, 2): self.on11 = OrigNeuron() self.on11.set_input_data(self.x, self.w[0]) self.on11.forward() self.on12 = OrigNeuron() self.on12.set_input_data(self.x, self.w[1]) self.on12.forward() self.on21 = OrigNeuron() # 単一ニューロンon11, on12の出力値を、次の単一ニューロンon21の入力値に利用 self.on21.set_input_data(np.array([self.on11.get_y(), self.on12.get_y()]) , self.w[2]) self.on21.forward() # 出力データを返却 def get_y(self): return self.on21.get_y() # 入力データの型・長さをチェック def __input_check(self, data, size): if isinstance(data, np.ndarray) and len(data) == size: if np.issubdtype(data.dtype, float) or np.issubdtype(data.dtype, int): return True return False return False |
さらに、先ほどのニューラルネットワークを呼び出した結果は以下の通りで、出力結果\(y\)は想定通り、入力値\(x_0=x_1=0\)または\(x_0=x_1=1\)の場合に\(0\)に近く、そうでない場合は\(1\)に近い値となることが確認できる。
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np # 作成した入力データのフォワードプロパゲーションを実行 input_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) for data in input_data: onn = OrigNeuralNetwork(data) print("*** 入力データ ***") print(data) print("*** 出力結果 ***") onn.forward() print(onn.get_y()) print() |
要点まとめ
- ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。
- 単一ニューロンを組み合わせることで、ニューラルネットワークが実装できる。