TensorFlowのrestoreで、NotFoundErrorにいじめられた話
前書き
TensorFlowで学習済みモデルを使って遊ぼうとしたときに躓いたのでメモ。
ここに学習済みパラメータと、その他情報が置いてある。
生じた問題
次のコードで問題が生じた。
import tensorflow as tf
from tensorflow.contrib import slim
from tensorflow.contrib.slim.nets import resnet_v1
#
# Construct Network
inputs = tf.placeholder(tf.float32, shape=[None, 224, 224, 3])
net, end_points = resnet_v1.resnet_v1_50(inputs=inputs)
#
# Read ckpt File
ckpt_filename = "C:/[中略]/resnet_v1_50.ckpt"
with tf.Session() as sess:
saver = tf.train.Saver()
saver.restore(sess, ckpt_filename)
エラーは次の通りである。
tensorflow.python.framework.errors_impl.NotFoundError: Tensor name "resnet_v1_50/conv1/biases" not found in checkpoint files C:/[中略]/resnet_v1_50.ckpt
NotFoundError (see above for traceback): Tensor name "resnet_v1_50/conv1/biases" not found in checkpoint files C:/[中略]/resnet_v1_50.ckpt
かなり省略してあるが、結局必要なデータが見つからんというエラーである。
なお、上記エラーが発生したときも、ckptファイル自体は読み込めている。
かなりの人が躓いているらしく、ネット上でも悲痛な声が散見された。
エラーの原因
Githubのイシューを漁った結果、次のようなスレッドが見つかった。
sugada氏のコード片を見る限り、arg_scopeが解決の鍵のようだ。
arg_scopeはcontrib/framework/python/ops/arg_scope.pyで定義されていて、
Allows one to define models much more compactly by eliminating boilerplate code. This is accomplished through the use of argument scoping (arg_scope).
と書かれている。(たぶん)モジュール性を高めるための工夫らしい。
解決した方法
さきほどのコードを、次のように改変する。
import tensorflow as tf
from tensorflow.contrib import slim
from tensorflow.contrib.slim.nets import resnet_v1
#
# Construct Network
inputs = tf.placeholder(tf.float32, shape=[None, 224, 224, 3])
arg_scope = resnet_v1.resnet_arg_scope()
with slim.arg_scope(arg_scope):
net, end_points = resnet_v1.resnet_v1_50(inputs=inputs)
#
# Read ckpt File
ckpt_filename = "C:/[中略]/resnet_v1_50.ckpt"
with tf.Session() as sess:
saver = tf.train.Saver()
saver.restore(sess, ckpt_filename)
ネットワークモデルを読み取る際に、このような工夫が必要だった。
ここではResNetを用いたが、他のモデルも同様である。
実際のソースコードを見ると、それっぽい関数はすぐ見つかる。
追記 (2017/07/19)
次のページに、この記事へのリンクが張られていた。
TensorFlowのセッション内でrestoreする際に起こるエラーについて | teratail
ここで『どうも、管理人です』と颯爽と回答できればかっこよかったなぁ...
結局、よくわからないままに解消できたらしい。
Jupyter上でやっているのですが、全てを1つのセルにまとめて実行していたことが原因のようでした。
私もJupyterにいじめられたことがあるので... 苦手意識が更に高まる。