私は、Tensorflowがグラフを管理しているように見える方法で、いくつかのファンキーなことが起こっていることを認識しました。Tensorflowはどのようにグラフを管理しますか?
モデルのビルド(および再構築)が面倒なので、カスタムモデルをクラスにラップして他の場所で簡単にインスタンス化できるようにしました。
私は訓練をしていて、元の場所でコードをテストしていましたが、グラフの変数をロードしたコードでは変わった再定義やその他すべての奇妙なエラーが発生します。これは(似たようなことについての私の最後の質問から)、すべてが2回呼び出されたというヒントでした。
トレースのトーンを実行した後、ロードされたコードを使用していた方法になりました。それはそう
class MyModelUser(object):
def forecast(self):
# .. build the model in the same way as in the training code
# load the model checkpoint
# call the "predict" function on the model
# manipulate the prediction and return it
のような構造を持っていたし、いくつかのコードでは、私は
def test_the_model(self):
model_user = MyModelUser()
print(model_user.forecast()) # 1
print(model_user.forecast()) # 2
を持っていたし、(明らかに)私は2つの予測これを見ると期待MyModelUser
使用して、そのクラスの中から使用されていましたと呼ばれていました。代わりに、最初の予測が呼ばれ、期待通りに働いたが、2回目の呼び出しは、変数の再利用のTONとValueErrorこれらのいずれかの例を投げたのだった。
ValueError: Variable weight_def/weights already exists, disallowed. Did you mean to set reuse=True in VarScope?
私はシリーズを追加することで、エラーを鎮めるために管理変数を作成するためにget_variable
を使用し、スコープでreuse_variables
と呼ばれ、例外としてget_variable
と名前を付けずにtry/exceptブロックを削除しました。私が言った気まぐれで
tensorflow.python.framework.errors.NotFoundError: Tensor name "weight_def/weights/Adam_1" not found in checkpoint files
:これはだったそのうちの一つの厄介なエラーの新しいセット、上もたらした「私は__init__
にモデリング建物のコードを移動した場合ので、その一度だけ組み込まれて何?」
私の新しいモデルのユーザー:今
class MyModelUser(object):
def __init__(self):
# ... build the model in the same way as in the training code
# load the model checkpoint
def forecast(self):
# call the "predict" function on the model
# manipulate the prediction and return it
と:期待など
def test_the_model(self):
model_user = MyModelUser()
print(model_user.forecast()) # 1
print(model_user.forecast()) # 2
作品、エラーなしで2人の予想を印刷します。これは、私が変数を再利用するものを取り除くこともできると私につながります。
私の質問は次のとおりです。
なぜこれを修正しましたか?理論的には、元の予測方法で毎回グラフを再インスタンス化する必要があるため、複数のグラフを作成してはいけません。関数が完了した後もTensorflowはグラフを保持しますか?これで、作成コードを__init__
に移動するのはなぜですか?これは私を絶望的に混乱させてしまった。