🐘

【図解】keras でモデルに活性化関数を指定する方法は?

2022/09/07に公開

はじめに

前回までの内容で、モデルの作成、層の追加、データの入力 という基本を実行できました。

↓ 前回の内容
https://zenn.dev/nekoallergy/articles/keras-create-model02

ただ、作成したモデルは不完全です。なぜなら、活性化関数を指定していないから です。実際に人工知能を作る際は、モデル内の活性化関数を決める必要があります。

今回は、モデルの各層に活性化関数を指定する方法を紹介します。そのうえで、そのモデルにデータを流して結果を確認してみます。正しく活性化関数が適用されているかをチェックしましょう。

今回の目的

  • 活性化関数の指定方法を理解する
  • 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 つの活性化関数を決めます。

活性化関数の使い方や特徴については、こちらをご覧ください ↓
https://zenn.dev/nekoallergy/books/904df952389317


さて、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 で使える活性化関数

今回はrelusoftmaxを使いましたが、Keras では多くの活性化関数が用意されています。

  1. relu
  2. sigmoid
  3. softmax
  4. softplus
  5. softsign
  6. tanh
  7. selu
  8. elu
  9. exponential

よく使うのは、relu, sigmoid, softmax, tanh くらいです。どれを選ぶかによって出力が変わってくるので、いろいろ試してみてください。

活性化関数の特徴については、こちらをご覧ください ↓
https://zenn.dev/nekoallergy/books/904df952389317

参考: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 関数を通ってきたといえるでしょう。

確認してみましょう。

.
.
.


続きの内容は本にまとめてあります。手に取って頂けるととても喜びます ↓
https://zenn.dev/nekoallergy/books/deeplearning-advanced

人工知能/AI/機械学習をもっと詳しく

ねこアレルギーのAI

ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。



Created by NekoAllergy

Discussion