レイヤーの用途を見たところで、レイヤーで指定する活性化関数を確認しておきます。
活性化関数は「分類を行う判定基準」とでも考えておけば十分でしょう。
活性化関数
真面目に理解しようとすると、数式とグラフがセットでついてきます。
深く理解する場合は必須になりますが、日曜プログラマーとしてはそこまで理解しない状態で使いたい。
ということで、ゆるーく分類しておきます。
分類を行う
「softmax」を使用します。
各項目にどれだけの割合で適合するかの分類をおこなうので最終段のレイヤーで使用されます。
MNISTでは数値の分類を行いますが、入力データが「0~9」のどの値に属するのかを分類するのに使用されています。
発火条件用
極論を言ってしまえば、機械学習は入力データが「1」「0」のどちらに属するのかを判断し積み重ねていきます。
「白」と「黒」だったり、「善」と「悪」だったり。
その分類を行う際の指標として活性化関数を使用します。グラフがセットでついてくると思いますが、グラフの「上」か「下」かで分類を行っていくイメージ。
値の範囲とグラフの線によって良し悪しが変わってくる模様です。
取りうる値の範囲によって分類したほうが分かりやすいかと思います。
- 「-2」以上:selu
- 「-1」以上:elu
- 「-1~1」:softsign、tanh
- 「0~1」:sigmoid、hard_sigmoid
- 「0」以上:softplus、relu
MNISTのサンプルでは以下のようにモデルが作成されています。
第一階層はデータを「2次元」→「1次元」に変換しているので分類とは関係ありません。
第二階層では「relu」を使用して128の出力を行っています。
第二階層で分類を行っていますが、「なぜreluを採用したのか」「なぜ出力を128にしたのか」がモデル設計のポイントとなります。
第三階層ではsoftmaxを使用し、どの数値である可能性が高いかを分類しています。
数値データは「0~9」の10種類なので、softmaxの出力も「10」となっています。
softmaxにより、「0~9」の数値ごとに「入力データが対応する確率」が出力されます。
model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, activation='softmax') ])
コメント