ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。
今回は、ニューラルネットワーク内の単一ニューロンを実装してみたので、そのサンプルプログラムを共有する。
(単一ニューロンを組み合わせた)ニューラルネットワークの全体構成は、以下のようになる。
なお、活性化関数については、以下のサイトを参照のこと。
https://cvml-expertguide.net/terms/dl/layers/activation-function/
上図における\(u\)は、(入力値)×(重み)の総和で計算する場合、\(u=w_{10}^1x_0 + w_{11}^1x_1 + w_{12}^1x_2\)(ただし、\(x_2=1\)とする)で計算される。
また、活性化関数にシグモイド関数を利用する場合、\(y = \displaystyle \frac{1}{1 + e^{-u}} \)で計算される。
「MiniTool Partition Wizard」はパーティション分割・統合・バックアップ・チェックを直感的に行える便利ツールだったハードディスクの記憶領域を論理的に分割し、分割された個々の領域のことを、パーティションといいます。 例えば、以下の図の場合、C/D...
単一ニューロンを実装した内容は以下の通りで、set_input_dataメソッドで入力値を設定し、先ほどの\(u\), \(y\)の計算を、フォワードプロパゲーション(順伝播処理)を行うforwardメソッド内で実行している。
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)) |
また、先ほどの単一ニューロンを呼び出すニューラルネットワークを実装した内容は、以下の通り。なお、__init__メソッドの重み\(w\)は、何らかの任意値を設定している。
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 | 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]) 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.on = OrigNeuron() self.on.set_input_data(self.x, self.w) self.on.forward() # 出力データを返却 def get_y(self): return self.on.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 |
「Envader」はLinuxコマンドやDatabase SQL等のスキルを、環境構築不要で習得できる学習サイトだった「Envader」は、ITエンジニアとしてよく使うLinuxコマンドやDatabase SQL等のスキルを、解説を読んだ上で、問題を解き...
さらに、先ほどのニューラルネットワークを呼び出した結果は、以下の通り。
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import numpy as np # 入力データ input_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # 重み w = np.array([6.2, 6.2, -2.7]) for data in input_data: print("*** 入力データ ***") print(data) print("*** 出力結果 ***") u = data[0] * w[0] + data[1] * w[1] + 1 * w[2] y = 1.0 / (1.0 + np.exp(-u)) print(y) print() |
要点まとめ
- ニューラルネットワークは、人間の脳の神経細胞(ニューロン)の仕組みをプログラム上で模したモデルで、機械学習の1手法であるディープラーニングで利用する。
- 単一ニューロン内で、(入力値)×(重み)の総和で計算後、活性化関数で変換した出力値を返却する。