🎉
Tensorflow x Kerasを使ってみた
Tensorflow x keras を使ってみる
こちらの記事では Tensorflow だけを利用して Iris の分類タスクを実行していました。しかし、Keras を利用する方が多く、また利用が容易であるというメリットがあります(参考)。
そこで、せっかく Tensorflow を学ぶのなら一緒に Keras も学んでみようと思い、使ってみることにしました。(ここでは Keras の Sequential を利用するという意味です。)
Keras Sequential を利用する
こちらの記事にあるコードを Keras 仕様へ変更します。
書き換えると言っても大きく変更はありません。
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