Kerasの基本の使い方
これまでいくつかのDeep Learningを用いた物体検知のモデルを試してきました。
公開されているPretrained modelを用いて、画像の入力をUSBカメラから取得した画像に、出力を入力画像に検知結果を表すバウンディングボックスを重ねたものにインターフェースを置き換えるという実装をしています。
この作業はフレームワークの知識がなくとも、Python, OpenCVの知識があれば何とか実現できたため、これまでTensorflowの基本がよくわかっていないままでした。
そこで、Tensorflowのチュートリアルを一通りやってみて改めてTensorflowの使い方を整理しておこうと思います。
今回はTensorflowの高水準ライブラリであるKerasの使い方をまとめます。
Tensorflowのチュートリアル
https://www.tensorflow.org/tutorials/keras/classification?hl=ja
Kerasとは?
公式ドキュメントには以下の記述があります。https://keras.io/ja/
Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです. Kerasは,迅速な実験を可能にすることに重点を置いて開発されました.
実装量が少なくて済むように開発されているライブラリのため、スクラッチからモデルを作って学習、推論をするにはKerasを使うのがいいと思います。
TensorflowチュートリアルではTensorflowの低水準APIの解説が全くありません。
高度なことをしなければKerasで十分ということでしょう。
次からはチュートリアルからコードを抜粋して見ていきます。
ライブラリのインポートとデータセットのダウンロード
mnist, CIFAR100をはじめ、Deep Learningでよく使われるデータセットをKerasのライブラリを使ってダウンロードすることができます。
詳細はこちら。
https://keras.io/ja/datasets/#fashion-mnist
# TensorFlow と tf.keras のインポート import tensorflow as tf from tensorflow import keras
# データセットのダウンロード fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels)
= fashion_mnist.load_data()
モデルの構築
モデルを作成するにはkeras.Sequential()関数を使います。
この関数の中で前から順にlayerを重ねていきます。
活性化関数は引数のactivationで指定します。
layerの種類、引数はこちらをご参照ください。
https://keras.io/ja/layers/core/
活性化関数の詳細はこちら。
https://keras.io/ja/activations/
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)), #Flatten:2次元配列を1次元配列に展開
keras.layers.Dense(128, activation='relu'), #Dense:全結合層, activationで活性化関数を指定
keras.layers.Dense(10, activation='softmax')
])
モデルのコンパイル
model.compile()で学習時に必要な項目の設定を行います。
最適化、ロス関数、評価関数について設定できる選択肢は以下のサイトで確認できます。
最適化:https://keras.io/ja/optimizers/
ロス関数:https://keras.io/ja/losses/
評価関数:https://keras.io/ja/metrics/
model.compile(optimizer='adam', #optimizer:モデルの更新方法
loss='sparse_categorical_crossentropy', #loss:損失関数
metrics=['accuracy']) #metrics:学習のステップごとに確認する値
モデルのトレーニング
学習はmodel.fit()で行います。
ここでは学習画像、それに対応した教師ラベル、エポック数を指定しています。
model.fit(train_images, train_labels, epochs=5) #epoch:同じ学習データセットを何回回すか
正解率の評価
model.evaluate()でテストデータの評価を行います。
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) #verbose:ログ出力モード
学習したモデルを使って推論
model.predict()で学習モデルを使って推論します。evaluateはモデルの損失、評価値を返すのに対し、predictは予測結果を返します。
predictions = model.predict(test_images)
モデルの保存と読み出し
重み、モデルの保存形式はckptとhdf5形式があります。
ckptはモデルと重みを、hdf5はそれらに加えてオプティマイザなどモデルの設定を含めて保存できます。
モデルを保存(ckpt)
model.fit() #学習後
model.save_weights('./checkpoints/my_checkpoint') #手動で保存
#--------------------------------------------------------
# callback関数ModelCheckpointをfitの引数に設定すれば
# 学習中の途中経過の重みを自動で保存できる
cp_callback = tf.keras.callbacks.ModelCheckpoint(
checkpoint_path, verbose=1, save_weights_only=True, period=5)
# 重みを5エポックごとに保存
model = create_model()
model.fit(train_images, train_labels,
epochs = 50, callbacks = [cp_callback],
validation_data = (test_images,test_labels),
verbose=0)
モデルを読み出し(ckpt)
# loadする前にモデルを準備する必要がある
model = create_model()
model.load_weights(checkpoint_path)
モデルを保存(hdf5)
hdf5形式の場合、model.save_weight()ではなくmodel.save()を使用します。
model.fit() #学習後
model.save('my_model.h5')
モデルを読み出し(hdf5)
# 重みとオプティマイザを含む全く同じモデルを再作成
new_model = keras.models.load_model('my_model.h5)
まとめ
Kerasの基本的な使い方をまとめてきました。
次回はTensorflowの低水準APIについて整理していきたいと思います。