🎉

Tensorflow x Kerasを使ってみた

2022/09/23に公開

Tensorflow x keras を使ってみる

こちらの記事では Tensorflow だけを利用して Iris の分類タスクを実行していました。しかし、Keras を利用する方が多く、また利用が容易であるというメリットがあります(参考)。

そこで、せっかく Tensorflow を学ぶのなら一緒に Keras も学んでみようと思い、使ってみることにしました。(ここでは Keras の Sequential を利用するという意味です。)

Keras Sequential を利用する

こちらの記事にあるコードを Keras 仕様へ変更します。

https://zenn.dev/mimitako/articles/c4085419e963b5

書き換えると言っても大きく変更はありません。

import seaborn as sns
import pandas as pd
import numpy as np

from tensorflow.keras.layers import Input, Dense, Activation
from tensorflow.keras.models import Model
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pickle
+ from tensorflow.keras.models import Sequential

def tf_data_classification():
  _datasets = sns.load_dataset('iris')

  # データセットを_Xと_yに分けます。
  _X = _datasets.drop(['species'], axis= 1)

  # _yは質的データだったので、TFで扱えるような量的なデータへ変換します。
  # one-hot化とも呼びます。
  _y = pd.get_dummies(_datasets.species, prefix = "onehot")

  # numpyへデータ変換します。
  _X = _X.values
  _y = _y.values

  # train dataと test dataへ分けます。
  # test_size = 0.20 で20%をテストに回すことができます。
  _X_train, _X_test, _y_train, _y_test = train_test_split(_X, _y, test_size=0.20, random_state=39)

  # 標準化します。
  _std_sc = StandardScaler()
  _X_train = _std_sc.fit_transform(_X_train)
  _X_test = _std_sc.transform(_X_test)

  # 機械学習のモデルを定義します。
+  _model = Sequential()
+  _model.add(Dense(100, activation = "relu", input_dim = _X_train.shape[1], name = "layer_1"))
+  _model.add(Dense(50, activation = "relu", name = "layer_2"))
+  _model.add(Dense(50, activation = "relu", name = "layer_3"))
+  _model.add(Dense(3, activation = "softmax", name ="output_layer")) # one-hotで3次元となっているので、最後は3次元で返したい。
+  _model.compile(loss="categorical_crossentropy", optimizer='adam', metrics=['acc'])

  '''
-  _input_1 = Input(shape=(_X_train.shape[1],))
-  _l1 = Dense(100, activation='relu')(_input_1)
-  _l2 = Dense(50, activation='relu')(_l1)
-  _l3 = Dense(50, activation='relu')(_l2)
-  _output_1 = Dense(_y_train.shape[1], activation='softmax')(_l3)

-  _model = Model(inputs = _input_1, outputs = _output_1)
-  _model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

  '''
  # 学習します
  _history = _model.fit(_X_train, _y_train, batch_size=4, epochs=20, verbose=1, validation_split=0.20)

  # 学習結果を確認します。
  _score = _model.evaluate(_X_test, _y_test, verbose=1)
  _train_score = _model.evaluate(_X_train, _y_train, verbose =1)
  print('-'*96)
  print("test accuracy: ", _score[1])
  print("train accuracy: ", _train_score[1])

tf_data_classification()

コード量は変わらないのですが、どんなレイヤーをどのタイミグで追加するのかというのがわかりやすいため Keras の Sequential がよく利用されているのも頷けます。

もっと複雑になったときに、可読性を維持するという点でもメリットがありそうです。

Sequential を利用した結果

書き方が変わっただけで、中身に変化はありません。したがって結果は同じものが出てきます。

こちらが今回の結果です。

前回と全く同じ結果が得られました。

まとめ

Keras の Sequential を利用することで可読性の高い機械学習モデルができます。

もっと学んで自分の手足のように使っていきたいですね。

Discussion