需要のないページ

プログラミングや趣味や。

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にいじめられたことがあるので... 苦手意識が更に高まる。