ニューラルネットワークの構造や活性化関数、損失(誤差)関数、最適化関数を変えることで、正答率や処理速度を向上させることができる。
今回は、以前作成したKerasを用いたニューラルネットワークの構造・活性化関数・最適化関数を変更してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の手順と実装が完了していること。
ニューラルネットワークにKerasを利用してみた これまでは、ニューラルネットワークを自前で作成していたが、TensorflowやKeras、PyTorchといった、深層学習のフレー...
修正内容
ニューラルネットワークの構造・活性化関数は、以下のように変更している。
なお、ニューラルネットワークの中間層の活性化関数に「ReLU関数」を用いると、勾配が0に近くなり学習が進まなくなる「勾配消失問題」が発生しにくくなる。
「ReLU関数」の詳細については、以下のサイトを参照のこと。
ReLU関数とその微分をグラフ化してみた 以下の式で表現される関数をReLU関数といい、ディープラーニングの活性化関数の1つとして利用される。
\[
\begin{eqn...
また、損失(誤差)関数は、確率的勾配(最急)降下法(SGD)から、現在多く用いられているAdamに変更している。Adamの詳細については、以下のサイトを参照のこと。
https://chefyushima.com/ai-ml_optimizer/2799/
サンプルプログラムの作成と実行
ニューラルネットワークの構造や活性化関数、損失(誤差)関数、最適化関数を修正後のサンプルプログラムの内容は、以下の通り。
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 | from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Activation, Dense import numpy as np # Kerasでニューラルネットワークのモデルを作成する model = Sequential() # 入力値x_1, x_2を取り込む単一ニューロン(8個)を作成し、 # 活性化関数にReLU関数を指定 model.add(Dense(8, input_shape=(2,))) model.add(Activation('relu')) # 出力値yを出力する単一ニューロン(1個)を作成し、 # 活性化関数にシグモイド関数を指定 model.add(Dense(1)) model.add(Activation('sigmoid')) # モデルをコンパイル # その際、損失(誤差)関数(loss)、最適化関数(optimizer)、評価関数(metrics)を指定 # # 損失(誤差)関数(loss)に平均二乗誤差(mse)を指定 # 最適化関数(optimizer)にadam(SGDの改良版)を指定 # 評価関数(metrics)に正解率(accuracy)を指定 # model.compile(loss='mse', optimizer='adam', metrics=['accuracy']) # 入力データ、正解データを読み込む input_data_x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) input_data_x3 = np.array([[0], [1], [1], [0]]) # 読み込んだデータを用いて、モデルの学習を行う # 繰り返し回数はepochsで指定 model.fit(input_data_x, input_data_x3, epochs=1000) # 学習済モデルを用いた検証を行う input_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) print("*** 入力データ ***") print(input_data) print("*** 出力結果 ***") results = model.predict(input_data) print(results) |
上記サンプルプログラムの最終実行結果は以下の通りで、繰り返し回数\(1,000\)回で、出力結果\(y\)は、入力値\(x_0=x_1=0\)または\(x_0=x_1=1\)の場合に\(0\)に近く、そうでない場合は\(1\)に近いことが確認できる。
ちなみに、ニューラルネットワークの構造や活性化関数、損失(誤差)関数、最適化関数を修正前の最終実行結果は以下の通りで、繰り返し回数が\(10,000\)回だったことが確認できる。
要点まとめ
- ニューラルネットワークの構造や活性化関数、損失(誤差)関数、最適化関数を変えることで、正答率や処理速度を向上させることができる。