Tensorflow Keras: 深層学習(Deep Learning)回帰 実装例

Tensorflow Keras を利用した深層学習(Deep Learning)回帰モデルの単純な実装例について,常に参照できるように備忘録として示す。本ページでは Boston housing データセットを利用した回帰問題を扱う。モデル構築の実装例を可能な限りシンプルに示すため,入力データの前処理やハイパーパラメータ調整については扱わない。

開発環境

  • keras: 2.10.0
  • matplotlib: 3.5.3
  • python: 3.10.4
  • tensorflow-gpu: 2.4.0

ソースコード

from tensorflow import keras
from matplotlib import pyplot as plt

# データセット作成
boston = keras.datasets.boston_housing
(X_train, y_train), (X_test, y_test) = boston.load_data()
print('Train shape:{}'.format(X_train.shape))
print('Test shape:{}'.format(X_test.shape))

# モデル作成
# 入力層/中間層/出力層 各1層
model = keras.Sequential()
# 入力層
model.add(keras.layers.Dense(64, activation=keras.activations.relu, input_shape=(X_train.shape[1],)))
# 中間層
model.add(keras.layers.Dense(64, activation=keras.activations.relu))
# 出力層
model.add(keras.layers.Dense(1))
# モデルコンパイル
model.compile(loss='mse', optimizer=keras.optimizers.Adam())
# モデル内容の確認
model.summary()
# 学習
history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)

# 学習過程の可視化
plt.figure(figsize=(4, 4))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper right')
plt.show()

# 予測値を計算
pred = model.predict(X_test, verbose=0)

# 予測値と真値をプロット
plt.figure(figsize=(4, 4))
plt.scatter(pred, y_test)
plt.title('Prediction vs. True value')
plt.ylabel('True value')
plt.xlabel('Prediction')
plt.show()

パッケージのインポート

「matplotlib」は学習・予測結果の可視化に用いる。

from tensorflow import keras
from matplotlib import pyplot as plt

データセット作成

keras で用意されているboston_housingデータセットをそのまま用いる。学習データ(X_train)は404行13列,テストデータ(X_test)は102行13列のデータ。

ここではあくまで動作する回帰モデル構築を目的とするので,標準化等の前処理は行わない。

boston = keras.datasets.boston_housing
(X_train, y_train), (X_test, y_test) = boston.load_data()

print('Train shape:{}'.format(X_train.shape))
print('Test shape:{}'.format(X_test.shape))
# コード実行時の出力

Train shape:(404, 13)
Test shape:(102, 13)

モデル作成

シンプルな実装例として,各1層の入力層/中間層/出力層で構成される回帰モデルを定義する。下記の例において入力層/中間層は64個のユニットを持つ。出力は家の価格に対応するn行1列の形状になるので,ユニット数は1を指定する。数値予測を目的とする回帰を行うので,損失は平均事情誤差(MSE: Mean Squared Error)を指定。

# 入力層/中間層/出力層 各1層
model = keras.Sequential()
# 入力層
model.add(keras.layers.Dense(64, activation=keras.activations.relu, input_shape=(X_train.shape[1],)))
# 中間層
model.add(keras.layers.Dense(64, activation=keras.activations.relu))
# 出力層
model.add(keras.layers.Dense(1))
# モデルコンパイル
model.compile(loss='mse', optimizer=keras.optimizers.Adam())
# モデル内容の確認
model.summary()
# コード実行時の出力

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 64)                896       
                                                                 
 dense_1 (Dense)             (None, 64)                4160      
                                                                 
 dense_2 (Dense)             (None, 1)                 65        
                                                                 
=================================================================
Total params: 5,121
Trainable params: 5,121
Non-trainable params: 0
_________________________________________________________________

学習

定義した回帰モデルについて,事前に用意しておいた学習データ(X_train)と正答データ(y_test)を与え,fitメソッドを利用して学習を行う。下記の例では訓練回数は100回(epochs=100),バリデーションデータ割合は20%(validation_split=0.2)に指定している。

history = model.fit(X_train, y_train, epochs=100, validation_split=0.2)
# コード実行時の出力

Epoch 1/100
11/11 [==============================] - 1s 18ms/step - loss: 410.4371 - val_loss: 101.6145
Epoch 2/100
11/11 [==============================] - 0s 4ms/step - loss: 146.2130 - val_loss: 105.8009

.

.
.
Epoch 99/100
11/11 [==============================] - 0s 4ms/step - loss: 22.7989 - val_loss: 33.7172
Epoch 100/100
11/11 [==============================] - 0s 4ms/step - loss: 20.5440 - val_loss: 49.2540

学習過程の可視化

history変数内に保存されている学習過程の情報を用いて,学習データ(’loss’)/バリデーションデータ(’val_loss’)に対する損失の変動を可視化する。

plt.figure(figsize=(4, 4))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper right')
plt.show()

予測値を計算

学習済みモデルの predictメソッドを用いてテストデータ(X_test)について予測値を求める。

pred = model.predict(X_test, verbose=0)

予測の可視化

テストデータ(X_test)についての予測の正しさを可視化するため,正答データ(y_test)をY軸に指定した散布図を描く。

plt.figure(figsize=(4, 4))
plt.scatter(pred, y_test)
plt.title('Prediction vs. True value')
plt.ylabel('True value')
plt.xlabel('Prediction')
plt.show()

コメント