背景
分かりにくい、ほんとわかりにくい。
私でもスッとわかるような説明がない。
なので作ってみた。
前提条件
- 身長、体重、肩幅、性別のデータセットが大量にあつまった
- これをもとに、身長、体重、肩幅から性別を判定したい
- この判定のため、Kerasを用いてモデルを作成する
完成形
第1段階(事前準備。そしてモデルを作るぞ!と宣言。)
コードで書くと以下の通り。
# 事前準備
from keras.models import Sequential
from keras.layers import Dense, Activation
# モデルを作るぞ!と宣言
model = Sequential()
第2段階(1層目のレイヤー作成)
- 1層目のレイヤーの丸いやつは3個にしよう。
- 入力データは身長、体重、肩幅だから3つだ。
- 活性化関数はシグモイド関数にしよう。
※活性化関数
は次の丸いやつにとって便利な形に変換する関数
のこと
コードで書くと以下の通り。
model.add(Dense(3, input_dim = 3, activation='sigmoid'))
# Denseの第1引数が「丸いやつは3個」の「3」
# Denseの第2引数が「入力データは身長、体重、肩幅」の「input_dim = 3」
# Denseの第3引数が「活性化関数はシグモイド関数」の「activation='sigmoid'」
第3段階(2層目のレイヤー作成)
- 2層目のレイヤーの丸いやつは2個にしよう。
- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はシグモイド関数にしよう。
コードで書くと以下の通り。
model.add(Dense(2, activation='sigmoid'))
# Denseの第1引数が「2層目のレイヤーの丸いやつは2個にしよう。」の「2」
# Denseの第2引数が「活性化関数はシグモイド関数にしよう。」の「activation='sigmoid'」
第4段階(3層目のレイヤー作成)
- 3層目のレイヤーの丸いやつは3個にしよう。
- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はシグモイド関数にしよう。
コードで書くと以下の通り。
model.add(Dense(3, activation='sigmoid'))
# Denseの第1引数が「このレイヤーの丸いやつは3個にしよう。」の「3」
# Denseの第2引数が「活性化関数はシグモイド関数にしよう。」の「activation='sigmoid'」
第5段階(男女に結び付ける)
- 入力データはもう関係ない。丸いやつ同士が勝手にやってくれる。
- 活性化関数はソフトマックス関数にしよう。
コードで書くと以下の通り。
model.add(Dense(2, activation='softmax'))
# Denseの第1引数が「男女」2種類の「2」
# Denseの第2引数が「活性化関数はソフトマックス関数」の「activation='softmax'」
第6段階(学習方法を決めよう!)
- 学習スタイルは'rmsprop'にしよう
- 男と女の分類問題なので損失関数は'binary_crossentropy'にしよう
- 学習結果が正解かどうかの評価方法は'accuracy'にしよう
※学習スタイル
は、目的関数の最小値をいかにして探すか
という手法のこと
※損失関数
は、入力データからモデルを通じて出力した結果
と、データセットの実際の答え
の差分
を計算式で表現したもの
コードで書くと以下の通り。
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# compileの第1引数が「学習スタイルは'rmsprop'」の「optimizer='rmsprop'」
# compileの第2引数が「目的関数は'binary_crossentropy'」の「loss='binary_crossentropy'」
# compileの第3引数が「評価方法は'accuracy'」の「metrics=['accuracy']」
これでモデル完成です。
モデルの良しあしは、
-
レイヤー
を何層にするか - 各レイヤーの丸いやつ(
ユニット
と呼ぶ)を何個にするか -
活性化関数
を何にするか(いろいろあります。) -
学習スタイル
を何にするか(これもいろいろあります。) -
損失関数
を何にするか(これもいろいろあります。) -
評価方法
を何にするか(これもいろいろあります。) - その他、いろいろあるらしいが、私は分からない
で決まるのです!