Missed TensorFlow World? Check out the recap. Learn more

モデルの保存と復元

View on TensorFlow.org Run in Google Colab View source on GitHub

モデルは訓練中にも、訓練が終わったあとも保存できます。このことは、長い訓練時間を掛けなくても、やめたところから再開できるということを意味します。モデルが保存可能であることは、あなたが作ったモデルを他の人と共有できるということでもあります。研究結果であるモデルや手法を公開する際、機械学習の実務家はほとんど次のものを共有します。

  • モデルを構築するプログラム
  • 学習済みモデルの重みあるいはパラメータ

このデータを共有することで、他の人がモデルだどの様に動作するかを理解したり、新しいデータに試してみたりすることが容易になります。

注意:信頼できないプログラムには気をつけましょう。TensorFlowのモデルもプログラムです。詳しくは、Using TensorFlow Securelyを参照してください。

オプション

TensorFlowのモデルを保存する方法は、使っているAPIによって異なります。このガイドはTensorFlowのモデルを構築し訓練するためのハイレベルなAPIであるtf.kerasを使っています。この他のアプローチについては、TensorFlowの Save and Restore ガイド、あるいは、Saving in eagerを参照してください。

設定

インストールとインポート

TensorFlowと依存関係のライブラリをインストールし、インポートします。

!pip install -q h5py pyyaml 

サンプルデータセットの取得

ここでは、モデルを訓練し重みの保存をデモするために、 MNIST dataset を使います。デモの実行を速くするため、最初の1,000件のサンプルだけを使います。

from __future__ import absolute_import, division, print_function, unicode_literals

import os

import tensorflow as tf
from tensorflow import keras

tf.__version__
'2.0.0'
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()

train_labels = train_labels[:1000]
test_labels = test_labels[:1000]

train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0
test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.0

モデルの定義

重みの保存と読み込みのデモを行うための簡単なモデルを定義しましょう。

# 短いシーケンシャルモデルを返す関数
def create_model():
  model = tf.keras.models.Sequential([
    keras.layers.Dense(512, activation='relu', input_shape=(784,)),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
  ])
  
  model.compile(optimizer='adam', 
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])
  
  return model


# 基本的なモデルのインスタンスを作る
model = create_model()
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 512)               401920    
_________________________________________________________________
dropout (Dropout)            (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

訓練中にチェックポイントを保存する

主な用途は訓練の途中あるいは終了後にチェックポイントを自動的に保存することです。こうすることにより、再び訓練を行うことなくモデルを使用することができ、また、訓練が中断された場合に、中止したところから再開できます。

tf.keras.callbacks.ModelCheckpointがこれを行うためのコールバックです。このコールバックにはチェックポイントを構成するためのいくつかの引数があります。

チェックポイントコールバックの使い方

モデルの訓練時に、ModelCheckpointを渡します。

checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# チェックポイントコールバックを作る
cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path, 
                                                 save_weights_only=True,
                                                 verbose=1)

model = create_model()

model.fit(train_images, train_labels,  epochs = 10, 
          validation_data = (test_images,test_labels),
          callbacks = [cp_callback])  # 訓練にコールバックを渡す

# オプティマイザの状態保存についての警告が表示されるかもしれません。
# これらの警告は(このノートブックで発生する同様な警告を含めて)
# 古い用法を非推奨にするためのもので、無視して構いません。
Train on 1000 samples, validate on 1000 samples
Epoch 1/10
 608/1000 [=================>............] - ETA: 0s - loss: 1.3936 - accuracy: 0.6003 
Epoch 00001: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 1s 1ms/sample - loss: 1.1288 - accuracy: 0.6810 - val_loss: 0.6994 - val_accuracy: 0.7860
Epoch 2/10
 576/1000 [================>.............] - ETA: 0s - loss: 0.4422 - accuracy: 0.8958
Epoch 00002: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 226us/sample - loss: 0.4146 - accuracy: 0.8890 - val_loss: 0.5396 - val_accuracy: 0.8360
Epoch 3/10
 576/1000 [================>.............] - ETA: 0s - loss: 0.2893 - accuracy: 0.9167
Epoch 00003: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 227us/sample - loss: 0.2705 - accuracy: 0.9200 - val_loss: 0.4685 - val_accuracy: 0.8510
Epoch 4/10
 608/1000 [=================>............] - ETA: 0s - loss: 0.2040 - accuracy: 0.9441
Epoch 00004: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 195us/sample - loss: 0.2109 - accuracy: 0.9460 - val_loss: 0.4341 - val_accuracy: 0.8690
Epoch 5/10
 672/1000 [===================>..........] - ETA: 0s - loss: 0.1512 - accuracy: 0.9643
Epoch 00005: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 187us/sample - loss: 0.1493 - accuracy: 0.9620 - val_loss: 0.4388 - val_accuracy: 0.8650
Epoch 6/10
 704/1000 [====================>.........] - ETA: 0s - loss: 0.1248 - accuracy: 0.9716
Epoch 00006: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 182us/sample - loss: 0.1178 - accuracy: 0.9740 - val_loss: 0.4046 - val_accuracy: 0.8740
Epoch 7/10
 672/1000 [===================>..........] - ETA: 0s - loss: 0.0825 - accuracy: 0.9881
Epoch 00007: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 180us/sample - loss: 0.0849 - accuracy: 0.9870 - val_loss: 0.4088 - val_accuracy: 0.8680
Epoch 8/10
 672/1000 [===================>..........] - ETA: 0s - loss: 0.0682 - accuracy: 0.9940
Epoch 00008: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 182us/sample - loss: 0.0657 - accuracy: 0.9940 - val_loss: 0.4210 - val_accuracy: 0.8620
Epoch 9/10
 672/1000 [===================>..........] - ETA: 0s - loss: 0.0452 - accuracy: 0.9985
Epoch 00009: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 185us/sample - loss: 0.0485 - accuracy: 0.9970 - val_loss: 0.4043 - val_accuracy: 0.8710
Epoch 10/10
 640/1000 [==================>...........] - ETA: 0s - loss: 0.0361 - accuracy: 1.0000
Epoch 00010: saving model to training_1/cp.ckpt
1000/1000 [==============================] - 0s 189us/sample - loss: 0.0395 - accuracy: 0.9990 - val_loss: 0.4076 - val_accuracy: 0.8750

<tensorflow.python.keras.callbacks.History at 0x7f5ae14b16d8>

この結果、エポックごとに更新される一連のTensorFlowチェックポイントファイルが作成されます。

!ls {checkpoint_dir}
checkpoint           cp.ckpt.data-00001-of-00002
cp.ckpt.data-00000-of-00002  cp.ckpt.index

訓練していない新しいモデルを作ります。重みだけからモデルを復元する場合には、元のモデルと同じアーキテクチャのモデルが必要です。モデルのアーキテクチャが同じであるため、モデルの異なるインスタンスであっても重みを共有することができるのです。

訓練していない全く新しいモデルを作り、テストデータセットで評価します。訓練をしていないモデルは偶然のレベル(正解率10%以下)の性能しか無いはずです。

model = create_model()

loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 2.3553 - accuracy: 0.1010
Untrained model, accuracy: 10.10%

次に、チェックポイントから重みをロードし、再び評価します。

model.load_weights(checkpoint_path)
loss,acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.4548 - accuracy: 0.8750
Restored model, accuracy: 87.50%

チェックポイントコールバックのオプション

このコールバックには、チェックポイントに一意な名前をつけたり、チェックポイントの頻度を調整するためのオプションがあります。

新しいモデルを訓練し、5エポックごとに一意な名前のチェックポイントを保存します。

# ファイル名に(`str.format`を使って)エポック数を埋め込みます
checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(
    checkpoint_path, verbose=1, save_weights_only=True,
    # 重みを5エポックごとに保存します
    period=5)

model = create_model()
model.fit(train_images, train_labels,
          epochs = 50, callbacks = [cp_callback],
          validation_data = (test_images,test_labels),
          verbose=0)
WARNING:tensorflow:`period` argument is deprecated. Please use `save_freq` to specify the frequency in number of samples seen.

Epoch 00005: saving model to training_2/cp-0005.ckpt

Epoch 00010: saving model to training_2/cp-0010.ckpt

Epoch 00015: saving model to training_2/cp-0015.ckpt

Epoch 00020: saving model to training_2/cp-0020.ckpt

Epoch 00025: saving model to training_2/cp-0025.ckpt

Epoch 00030: saving model to training_2/cp-0030.ckpt

Epoch 00035: saving model to training_2/cp-0035.ckpt

Epoch 00040: saving model to training_2/cp-0040.ckpt

Epoch 00045: saving model to training_2/cp-0045.ckpt

Epoch 00050: saving model to training_2/cp-0050.ckpt

<tensorflow.python.keras.callbacks.History at 0x7f5abc4efe10>

次に、出来上がったチェックポイントを確認し、最後のものを選択します。

! ls {checkpoint_dir}
checkpoint            cp-0030.ckpt.data-00000-of-00002
cp-0005.ckpt.data-00000-of-00002  cp-0030.ckpt.data-00001-of-00002
cp-0005.ckpt.data-00001-of-00002  cp-0030.ckpt.index
cp-0005.ckpt.index        cp-0035.ckpt.data-00000-of-00002
cp-0010.ckpt.data-00000-of-00002  cp-0035.ckpt.data-00001-of-00002
cp-0010.ckpt.data-00001-of-00002  cp-0035.ckpt.index
cp-0010.ckpt.index        cp-0040.ckpt.data-00000-of-00002
cp-0015.ckpt.data-00000-of-00002  cp-0040.ckpt.data-00001-of-00002
cp-0015.ckpt.data-00001-of-00002  cp-0040.ckpt.index
cp-0015.ckpt.index        cp-0045.ckpt.data-00000-of-00002
cp-0020.ckpt.data-00000-of-00002  cp-0045.ckpt.data-00001-of-00002
cp-0020.ckpt.data-00001-of-00002  cp-0045.ckpt.index
cp-0020.ckpt.index        cp-0050.ckpt.data-00000-of-00002
cp-0025.ckpt.data-00000-of-00002  cp-0050.ckpt.data-00001-of-00002
cp-0025.ckpt.data-00001-of-00002  cp-0050.ckpt.index
cp-0025.ckpt.index
latest = tf.train.latest_checkpoint(checkpoint_dir)
latest
'training_2/cp-0050.ckpt'

注意:デフォルトのtensorflowフォーマットは、直近の5つのチェックポイントのみを保存します。

テストのため、モデルをリセットし最後のチェックポイントをロードします。

model = create_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
1000/1 - 0s - loss: 0.5450 - accuracy: 0.8780
Restored model, accuracy: 87.80%

これらのファイルは何?

上記のコードでは、重みだけをバイナリでcheckpoint形式の一連のファイルに保存します。チェックポイントには、次のものが含まれます。

  • 1つ以上のモデルの重みの断片
  • どの重みがどの断片に保存されているかを示すインデックスファイル

1台のマシンだけでモデルの訓練を行っている場合には、.data-00000-of-00001のようなサフィックスのついたファイルが1つだけ作成されます。

手動で重みを保存する

上記では重みをモデルにロードする方法を見ました。

手動で重みを保存するのも同じ様に簡単です。Model.save_weights メソッドを使います。

# 重みの保存
model.save_weights('./checkpoints/my_checkpoint')

# 重みの復元
model = create_model()
model.load_weights('./checkpoints/my_checkpoint')

loss,acc = model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
1000/1 - 0s - loss: 0.5450 - accuracy: 0.8780
Restored model, accuracy: 87.80%

モデル全体の保存

モデルとオプティマイザを、その状態(重みと変数)とモデルの設定の両方を含む1つのファイルに保存することができます。これにより、モデルをオリジナルのPythonコードにアクセスしなくとも使用できるようにエクスポートできます。オプティマイザの状態が復元されるので、中断したところから訓練を再開することも可能です。

完全に機能するモデルを保存できるのは便利です。保存したモデルをTensorFlow.js (HDF5, Saved Model)でロードし、ブラウザで訓練したり、実行したりすることができるほか、TensorFlow Lite (HDF5, Saved Model) を使ってモバイルデバイスで実行できるように変換することも可能です。

HDF5ファイルとして

Kerasでは、HDF5 標準を使った基本的なファイルフォーマットが利用できます。ここでの利用目的では、保存されたモデルは単独のバイナリラージオブジェクト(blob)として扱うことができます。

model = create_model()

model.fit(train_images, train_labels, epochs=5)

# モデル全体を1つのHDF5ファイルに保存します。
model.save('my_model.h5')
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 417us/sample - loss: 1.1274 - accuracy: 0.6960
Epoch 2/5
1000/1000 [==============================] - 0s 79us/sample - loss: 0.4218 - accuracy: 0.8730
Epoch 3/5
1000/1000 [==============================] - 0s 78us/sample - loss: 0.2864 - accuracy: 0.9250
Epoch 4/5
1000/1000 [==============================] - 0s 82us/sample - loss: 0.2057 - accuracy: 0.9440
Epoch 5/5
1000/1000 [==============================] - 0s 81us/sample - loss: 0.1497 - accuracy: 0.9670

保存したファイルを使ってモデルを再作成します。

# 重みとオプティマイザを含む全く同じモデルを再作成
new_model = keras.models.load_model('my_model.h5')
new_model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_12 (Dense)             (None, 512)               401920    
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_13 (Dense)             (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

正解率を検査します。

loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
1000/1 - 0s - loss: 0.6344 - accuracy: 0.8600
Restored model, accuracy: 86.00%

この方法では、次のすべてが保存されます。

  • 重みの値
  • モデルの設定(アーキテクチャ)
  • オプティマイザの設定

Kerasは保存する際にアーキテクチャを調べます。いまのところ、TensorFlowのオプティマイザ(tf.trainに含まれるもの)を保存することはできません。TensorFlowのオプティマイザを使用している場合には、モデルをロードしたあと再コンパイルする必要があり、オプティマイザの状態は失われます。

saved_modelとして

注意:この手法によるtf.kerasモデルの保存は実験的なもので、将来のバージョンで変更される可能性があります。

新しいモデルを作ります。

model = create_model()

model.fit(train_images, train_labels, epochs=5)
Train on 1000 samples
Epoch 1/5
1000/1000 [==============================] - 0s 410us/sample - loss: 1.1498 - accuracy: 0.6770
Epoch 2/5
1000/1000 [==============================] - 0s 80us/sample - loss: 0.4384 - accuracy: 0.8710
Epoch 3/5
1000/1000 [==============================] - 0s 82us/sample - loss: 0.2924 - accuracy: 0.9180
Epoch 4/5
1000/1000 [==============================] - 0s 79us/sample - loss: 0.2001 - accuracy: 0.9570
Epoch 5/5
1000/1000 [==============================] - 0s 85us/sample - loss: 0.1527 - accuracy: 0.9650

<tensorflow.python.keras.callbacks.History at 0x7f5a8c1a0710>

saved_modelを作成し、タイムスタンプ付きのディレクトリに保存します。

import time
saved_model_path = "./saved_models/{}".format(int(time.time()))

tf.keras.experimental.export_saved_model(model, saved_model_path)
saved_model_path
WARNING:tensorflow:From <ipython-input-20-9d5aff309515>:4: export_saved_model (from tensorflow.python.keras.saving.saved_model_experimental) is deprecated and will be removed in a future version.
Instructions for updating:
Please use `model.save(..., save_format="tf")` or `tf.keras.models.save_model(..., save_format="tf")`.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_core/python/saved_model/signature_def_utils_impl.py:253: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Train: ['train']
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: None
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: ['eval']
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:No assets to save.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: ./saved_models/1571259640/saved_model.pb

'./saved_models/1571259640'

作成したsaved_modelsを一覧表示します。

!ls saved_models/
1571259640

保存されたモデル(SavedModel)から新しいKerasモデルをリロードします。

new_model = tf.keras.experimental.load_from_saved_model(saved_model_path)
new_model.summary()
WARNING:tensorflow:From <ipython-input-22-74d99c8332aa>:1: load_from_saved_model (from tensorflow.python.keras.saving.saved_model_experimental) is deprecated and will be removed in a future version.
Instructions for updating:
The experimental save and load functions have been  deprecated. Please switch to `tf.keras.models.load_model`.
Model: "sequential_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_14 (Dense)             (None, 512)               401920    
_________________________________________________________________
dropout_7 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_15 (Dense)             (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

復元されたモデルを実行します。

model.predict(test_images).shape
(1000, 10)
# モデルを評価する前にコンパイルする必要があります。
# モデルをデプロイするだけであればこのステップは不要です。

new_model.compile(optimizer=model.optimizer,  # ロードしてあったオプティマイザを保持
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルを評価します。
loss, acc = new_model.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.iter
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_1
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.beta_2
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.decay
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer.learning_rate
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'm' for (root).layer_with_weights-1.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-0.bias
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.kernel
WARNING:tensorflow:Unresolved object in checkpoint: (root).optimizer's state 'v' for (root).layer_with_weights-1.bias
WARNING:tensorflow:A checkpoint was restored (e.g. tf.train.Checkpoint.restore or tf.keras.Model.load_weights) but not all checkpointed values were used. See above for specific issues. Use expect_partial() on the load status object, e.g. tf.train.Checkpoint.restore(...).expect_partial(), to silence these warnings, or use assert_consumed() to make the check explicit. See https://www.tensorflow.org/alpha/guide/checkpoints#loading_mechanics for details.
1000/1 - 0s - loss: 0.5051 - accuracy: 0.8620
Restored model, accuracy: 86.20%

この先は?

tf.kerasを使った保存とロードのクイックガイドでした。

  • tf.keras guide にはtf.kerasでの保存とロードについて、もう少し記載されています

  • Eager Executionでの保存についてはSaving in eager を参照ください

  • Save and Restoreガイドには、TensorFlowでの保存についてローレベルの詳細が記載されています

#@title MIT License
#
# Copyright (c) 2017 François Chollet
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.