【図解】keras でモデルに活性化関数を指定する方法は?
はじめに
前回までの内容で、モデルの作成、層の追加、データの入力 という基本を実行できました。
↓ 前回の内容
ただ、作成したモデルは不完全です。なぜなら、活性化関数を指定していないから です。実際に人工知能を作る際は、モデル内の活性化関数を決める必要があります。
今回は、モデルの各層に活性化関数を指定する方法を紹介します。そのうえで、そのモデルにデータを流して結果を確認してみます。正しく活性化関数が適用されているかをチェックしましょう。
今回の目的
- 活性化関数の指定方法を理解する
- Keras で使える活性化関数の種類を把握する
- 活性化関数が適用されているかをチェックする
Created by NekoAllergy
1. モデルを作成
今回使用するライブラリを読み込んでおきます。
# 必要なライブラリの読み込み
import numpy as np
import tensorflow as tf
from keras import layers
まずは、空のモデルを作成します。
# モデルを作成
model = tf.keras.Sequential(name="my_model")
上記のコードによって、モデルの枠組みであるmodel
インスタンスを作成できました。これに、いろいろ追加したり指示したりしていきます。
2. モデルに活性化関数を設定
モデルの完成イメージ
次に、このモデルに層を追加していきます。add
メソッドを使います。
このとき、add
メソッドの引数に活性化関数を指定することができます。前回と違う点はここだけです。
# addメソッドで層を追加
model.add(layers.Dense(units=10, activation='relu', input_shape=(5,)))
model.add(layers.Dense(units=10, activation='relu'))
model.add(layers.Dense(units=10, activation='softmax'))
今回は、全部で 3 層の全結合レイヤーを追加しました。入力のサイズは(5,)
で、全てのレイヤーにunits=10
を指定しました。今はこの数値は何でもいいです。
さて、上記コードのように、add
メソッドのactivation
引数に渡すことで、指定することができます。活性化関数は、レイヤー毎に決めます。今回は 3 層あるので、3 つの活性化関数を決めます。
活性化関数の使い方や特徴については、こちらをご覧ください ↓
さて、summary
メソッドでモデルの詳細を確認してみます。
# モデルの構造を確認
model.summary()
Model: "my_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_15 (Dense) (None, 10) 60
dense_16 (Dense) (None, 10) 110
dense_17 (Dense) (None, 10) 110
=================================================================
Total params: 280
Trainable params: 280
Non-trainable params: 0
_________________________________________________________________
活性化関数の情報が見当たりません。summary
メソッドを見ても、activation
引数の情報は確認できないらしいです。
活性化関数が正しく設定されているかは、以下のコードで確認することができます。
print(model.layers[0].activation)
print(model.layers[1].activation)
print(model.layers[2].activation)
<function relu at 0x0000023281FF71F0>
<function relu at 0x0000023281FF71F0>
<function softmax at 0x0000023281FF5790>
3 つのレイヤーそれぞれに、1 つずつ活性化関数が入っていることが分かります。
Keras で使える活性化関数
今回はrelu
とsoftmax
を使いましたが、Keras では多くの活性化関数が用意されています。
- relu
- sigmoid
- softmax
- softplus
- softsign
- tanh
- selu
- elu
- exponential
よく使うのは、relu
, sigmoid
, softmax
, tanh
くらいです。どれを選ぶかによって出力が変わってくるので、いろいろ試してみてください。
活性化関数の特徴については、こちらをご覧ください ↓
参考:https://keras.io/api/layers/activations/
3. データを入力してみる
今回はバッチサイズ 3 のデータを入力
活性化関数を設定したモデルが作れました。このモデルにデータを入力して、動作を確認してみましょう。
今回は、numpy
を使って、ランダムな数値をもつダミーのデータを生成します。
バッチサイズって?
バッチサイズとは、データのまとまりのことです。このかたまり毎にモデルに入力していきます。
# ダミーの入力データを生成
input_data = np.random.randn(3, 5)
print(input_data)
[[-0.44308263 0.87613775 -0.05938144 -0.36864224 -0.685806 ]
[ 0.2180409 -0.57951744 0.90619007 -0.30535933 -0.66735028]
[-0.91358037 -0.04501376 0.28972342 0.85217448 0.4231104 ]]
5 個の数値のかたまりが、3 つあることが分かります。
このデータをモデルに入力してみましょう。確認する点は、活性化関数が正しく設定されているかという点です。
model
の引数にデータを渡すことで、順伝搬を実行することができます。
# modelに入力して結果を得る
result = model(input_data)
print(result)
tf.Tensor(
[[0.08031353 0.10961066 0.09786715 0.11990095 0.10746092 0.08665267
0.10724836 0.09705517 0.09935265 0.09453791]
[0.0767932 0.113385 0.12820752 0.12038571 0.08376309 0.09332397
0.09484751 0.11609626 0.09219398 0.0810037 ]
[0.05073228 0.10345838 0.19335037 0.11813325 0.1351797 0.05074009
0.03886174 0.15857041 0.0616385 0.08933533]], shape=(3, 10), dtype=float32)
# 出力結果の形状を確認
print(result.numpy().shape)
(3, 10)
出力された結果result
の中身を見てみると、10 個の数値のかたまりが、3 つあることが分かります。これは、(3, 10)
のように表されます。
4. 活性化関数は正しく適用されているのか?
model
にデータを入力し、出力result
を得ることができました。この時、出力されたデータは、正しく活性化関数を通ってき他のでしょうか?確認してみましょう。
おさらいですが、今回設定した活性化関数は、次の様になっています。
- 1 層目:relu 関数
- 2 層目:relu 関数
- 3 層目:softmax 関数
最後に softmax 関数を指定しています。この softmax 関数は、数値を割合に変換してくれる関数です。つまり、最終的な出力は、割合の表示になっているはずです。 これは、出力された結果result
は、足すと1
(100%)になるという事です。
データごとの合計値は 1.0 になるはず
バッチサイズ:3 のデータを入力したので、出力結果も 3 つ返ってきています。そのデータ 1 つずつに 10 個の数値が入っています。10 個の数値の合計値が1
となっていれば、正しく softmax 関数を通ってきたといえるでしょう。
確認してみましょう。
.
.
.
続きの内容は本にまとめてあります。手に取って頂けるととても喜びます ↓
人工知能/AI/機械学習をもっと詳しく
ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。
Created by NekoAllergy
Discussion