#Tensor Flow2.XにおけるSaved Model読み込みについて.
##利用環境
Tensor flow 2.3
Python 3.6.9
問題点
TensorFlowでsaved model形式でモデルを保存し,読み込んだ際に,モデルを再コンパイルしないと,正しい精度が出ないようです.
モデル読み込み次にコンパイルを自動で行わせ,モデルを利用する際は,saved modelを読み込むだけにするような方法はありますか?
症状
まず,以下のようにモデルを学習させ,コールバックにより保存します
python
1model = create_model() 2checkpoint_path = "training_1/cp.ckpt" 3checkpoint_dir = os.path.dirname(checkpoint_path) 4 5# チェックポイントコールバックを作る 6cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, 7 verbose=1) 8# 新しいコールバックを用いるようモデルを訓練 9model.fit(train_images, 10 train_labels, 11 epochs=10, 12 validation_data=(test_images,test_labels), 13 callbacks=[cp_callback]) # 訓練にコールバックを渡す
次に,モデルを以下のコードで読み込み,精度を評価します.
python
1# リストアされたモデルを評価 2new_model = tf.keras.models.load_model('training_1/cp.ckpt') 3 4# loss関数を手動で設定する必要がある? 5# new_model.compile(optimizer='adam', 6# loss='sparse_categorical_crossentropy', 7# metrics=['accuracy']) 8 9# new_model = create_model() 10 11new_model.load_weights("training_2/cp-0050.ckpt") 12 13loss, acc = new_model.evaluate(test_images, test_labels, verbose=2) 14print('Restored model, accuracy: {:5.2f}%'.format(100*acc))
32/32 - 0s - loss: 0.4815 - accuracy: 0.0900
Restored model, accuracy: 9.00%
このとき,モデルの正答率が9%程度と,かなり低くなってしまいます.
ただし,モデルロードの後にモデルコンパイルを実行すると,精度は学習時と同様になるようです.
python
1# リストアされたモデルを評価 2new_model = tf.keras.models.load_model('training_1/cp.ckpt') 3 4# loss関数を手動で設定する必要がある? 5new_model.compile(optimizer='adam', 6 loss='sparse_categorical_crossentropy', 7 metrics=['accuracy']) 8 9# new_model = create_model() 10 11new_model.load_weights("training_2/cp-0050.ckpt") 12 13loss, acc = new_model.evaluate(test_images, test_labels, verbose=2) 14print('Restored model, accuracy: {:5.2f}%'.format(100*acc))
32/32 - 0s - loss: 0.4815 - accuracy: 0.8830
Restored model, accuracy: 88.30%
モデルを構築した関数は,以下です.
python
1# 短いシーケンシャルモデルを返す関数 2def create_model(): 3 model = tf.keras.models.Sequential([ 4 keras.layers.Dense(512, activation='relu', input_shape=(784,)), 5 keras.layers.Dropout(0.2), 6 keras.layers.Dense(10, activation='softmax') 7 ]) 8 9 model.compile(optimizer='adam', 10 loss='sparse_categorical_crossentropy', 11 metrics=['accuracy']) 12 13 return model
##参考:
今回のコードは下記リンクのものを流用しています.
TensorFlowドキュメント モデルの保存と復元
あなたの回答
tips
プレビュー