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")

Categories:

category