1. ホーム
  2. tensorflow

Tensorflow reports error Attempting to use uninitialized value ***/conv2d/kernel Solve

2022-02-20 09:04:19

SSDを自分で再現してみたところ、列車はすべてうまくいったのですが、モデルを保存するときにこの問題にぶつかりました。

丸々24時間かかってしまい、一時は自分のコードの根本的なロジックがおかしいのではないかと自暴自棄になっていましたので、この問題を解決するまでの過程を記録しておきます。

まず、解決策です。

    #-------------------
    #(1) There should be no network variables here
    #-------------------
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        ...
        ...
        saver = tf.train.
        saver.save(sess, os.path.join('. /save/', 'ckp'), global_step=1)
        #-----------------
        #saver.sava() should be sess here, not tf.Session()
        #-----------------

エラー報告の画面です。

試み1。 をまず読みます。 stackoverflowの質問 を使って、初期化されていないlocal_variablesがあると言って、同じくこの問題を抱えている兄に遭遇しました。

tf.local_variables_initializer()

無効です。

2をお試しください。 そして、私がウェブからコピーした方法を見つけ、モデルを格納し、これを読みます。

saver.save(tf.Session(), os.path.join('. /save/', 'ckp'), global_step=1)

これは、元のプロジェクトでは

with tf.Session() sess:

training/storage モジュールをラップします。ただし、ラップした場合(一番上のコードブロックのように)には は、新しいトークバックを開くことと同じです これは、新しく開いたセッションに変数を保存するものです。これは明らかに間違っています。変数を現在のトークバックに格納する必要がありますが、それはsessであり、sessに変更する必要があります。

このように変更しました。それでもエラーは報告されます。

3をお試しください。 ループ内の変数がすべて正常でなければ、モデルを正しく学習させることができないからです。変数をプリントアウトしてみたら、それも全部正常でした。問題はループの外の変数にあるのでしょう。

すると、一番上のブロックの(1)の位置で、自作のssd_netネットワークモデルを呼び出していることが明らかになったのです。最初はground_truthをバインドするモジュールに6つのレイヤーを提供し、次の処理のためにいくつかのテンソル形状を得るために使用されていたのです。

への呼び出しは、明らかに

tf.global_variables_initializer()

その後、冒頭で呼ばれたssd_netモデルのパラメータに異常が発生します(何が異常かはまだ考え中)。

そこで、コードの構造を変えて、処理の一部を損失関数モジュールに入れ、ループの外側にあるコードは3行だけにしました

最後に、try 2とtry 3を同時に行うと、問題は解決しました。

しかし、その過程はもう少し複雑でした。トライ2がうまくいかなかったので、コードをロールバックしました。そして、トライ3でもまだ同じエラーが出ることがわかり、またコードをロールバックしました。つまり、何度も試行錯誤とロールバックを繰り返したわけです。ネットワーク変数を1つずつプリントアウトして比較したりもしました。最終的に、2つの場所で同時に間違っていて、どちらのエラーも同じエラーを報告することに気がつきました。

tensorflowの理解が少し深まったような気がします。

お祝いに、美味しいご飯を食べましょう