Tenserflow(Keras)を使ってモデルを保存する方法はいくつかあります。モデルのチェックの仕方を含めてメモしておきます。
#############################
import numpy as np
X_train =np.load("C:\\Users\\X_train.npy")
Y_train =np.load("C:\\Users\\Y_train.npy")
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,Activation, MaxPool2D, Flatten,Dense,Dropout
input = X_train[0].shape
model = Sequential()
model.add(Conv2D(filters=2,kernel_size=51,input_shape=input))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(8,8)))
model.add(Flatten())
model.add(Dense(units=10))
model.add(Activation('softmax'))
model.compile(optimizer="Adam", loss='categorical_crossentropy', metrics=["accuracy"])
#############################
# チェックポイントを作る(エポックごとに保存する)
from tensorflow.keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(
filepath="C:\\Users\\CNNmodel-{epoch:02d}-{val_loss:.2f}.h5",
save_weights_only=False)
"""いいモデルだけを保存したいとき
checkpointer = ModelCheckpoint(
filepath="C:\\Users\\CNNmodel-{epoch:02d}-{val_loss:.2f}.h5",
save_weights_only=False,
monitor='val_accuracy',
mode='max',
save_best_only=True)
"""
# tensorboardを使うとき
from tensorflow.keras.callbacks import TensorBoard
import os,datetime
logpath = os.path.join("C:\\Users",
datetime.datetime.now().strftime("%Y_%m_%d-%H_%M_%S"))
tensorboard_callback = TensorBoard(
log_dir=logpath,
histogram_freq=1,
write_graph=True,
write_images=True)
model.fit(x = X_train, y= Y_train,
epochs = 5,
validation_split=0.2,
batch_size=32,
callbacks = [tensorboard_callback, checkpointer])
# 保存1 フォルダで保存
model.save("C:\\Users\\my_model")
# 保存2 1つのh5ファイルで保存
model.save("C:\\Users\\my_model.h5")
チェックポイント
チェックポイントを使うと、エポックごとに保存されます。そのため、過学習など起こって後半につれて精度が落ちて行っても、過学習が起こる前のいいところのモデルを使うことができます。詳しくはkerasのページをみてください。https://keras.io/api/callbacks/model_checkpoint/
とりあえずエポックの全部を保存したいなら以下のコードです。
from tensorflow.keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(
filepath=”C:\Users\CNNmodel-{epoch:02d}-{val_loss:.2f}.h5″,
save_weights_only=False)
いいモデルだけを保存するなら以下のコードです。何をもっていいモデルかとするかを、monitorで指定します。そのmonitorの数値がどうなっているときに保存するかをmodeで指定します。’auto’, ‘min’, ‘max’を選べます。
checkpointer = ModelCheckpoint(
filepath=”C:\Users\CNNmodel-{epoch:02d}-{val_loss:.2f}.h5″,
save_weights_only=False,
monitor=’val_accuracy’,
mode=’max’,
save_best_only=True)
tensorboard
tensorboardを使うと、視覚的にどう学習されていっているのかが分かります。詳しくは、kerasのページへ(https://keras.io/api/callbacks/tensorboard/)
logpath = os.path.join(“C:\Users”,
datetime.datetime.now().strftime(“%Y_%m_%d-%H_%M_%S”))
上のコードは保存するパスを変数に代入しています。Usersというフォルダに2021_03_05-19_10_10のような名前のフォルダができるようにします。
tensorboard_callback = TensorBoard(
log_dir=logpath,
histogram_freq=1,
write_graph=True,
write_images=True)
上のコードはtensorboardにどういった項目を保存するのか指定します。log_dirは保存場所です。さきほどの変数を代入します。histogram_freqは、ヒストグラムの頻度です。
左側がhistogram_freq = 1で右側がhistogram_freq = 0.1です。
write_graphは、モデルの構造を図式化してくれます。write_imagesは、それぞれの層がどういったイメージを受け取っているかを視覚化してくれます。
Tensorboardを起動するには、コマンドプロンプトで以下のように打ちます。logdirに指定するのは、2021_03_05-19_10_10のような名前のフォルダが入っているフォルダを指定します。
tensorboard --logdir=C:\Users\
C:\Users\>tensorboard –logdir=C:\Users\
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass –bind_all
TensorBoard 2.3.0 at http://localhost:6006/ (Press CTRL+C to quit)
このような表示がされるのでgoogle choromeのアドレスバーにhttp://localhost:6006/を入れてエンター。するとtensorboardがみれます。終了するときは、コマンドプロンプトでCTRL+Cを押します。
fit時にcallbackを指定する
fitするときに、callbacksパラメーターにさっきつくったcheckpointとtensorboardを指定します。
callbacks = [checkpointer, tensorboard_callback]
保存1 フォルダで保存
model.save(“C:\Users\my_model”)
my_modelのフォルダの中に以下のような構造で保存されます。
ファイルサイズは382KBです。
モデルの読み込みは以下のように行います。
from tensorflow.keras.models import load_model
model = load_model("C:\\Users\\my_model")
保存2 1つのh5ファイルで保存(こっちのほうがいいのでは)
model.save(“C:\Users\my_model.h5”)
my_model.h5 (300KB)
こちらの方がファイルサイズは小さくなります。
モデルの読み込みは以下のように行います。
from tensorflow.keras.models import load_model
model = load_model("C:\\Users\\my_model.h5")