PaddlePaddleテストデータセットのテスト中にエラー:Cannot find fetch variable in scope


  • キーワード:
  • 問題の説明:メインプログラムからテストプログラムとしてプログラムをクローンし、このテストプログラムを使用して訓練後にテストデータセットを使用してテストを行い、テストプログラムの実行時にエラーが発生し、エラープロンプトでfetch変数が見つからない.
  • エラーメッセージ:
  • /usr/local/lib/python3.5/dist-packages/paddle/fluid/executor.py in run(self, program, feed, fetch_list, feed_var_name, fetch_var_name, scope, return_numpy, use_program_cache)
        468 
        469         self._feed_data(program, feed, feed_var_name, scope)
    --> 470         self.executor.run(program.desc, scope, 0, True, True)
        471         outs = self._fetch_data(fetch_list, fetch_var_name, scope)
        472         if return_numpy:
    
    EnforceNotMet: Cannot find fetch variable in scope, fetch_var_name is mean_0.tmp_0 at [/paddle/paddle/fluid/operators/fetch_op.cc:37]
    PaddlePaddle Call Stacks: 
    
  • 問題の再現:最適化方法を定義する前にメインプログラムdefault_main_program()からテストプログラムをクローンし、このテストプログラムを使用して、アクチュエータを介してテストプログラムを実行するとエラーが発生します.エラーコードは次のとおりです:
  • test_program = fluid.default_main_program().clone(for_test=True)
    
    cost = fluid.layers.cross_entropy(input=model, label=label)
    avg_cost = fluid.layers.mean(cost)
    acc = fluid.layers.accuracy(input=model, label=label)
    
  • 問題解決:損失関数と最適化方法を定義すると、都メインプログラムdefault_main_program()に追加されますが、テストはトレーニング時に使用されるいくつかの操作を使用する必要はありません.そのため、テストプログラムをクローンする際には、損失関数の後、最適化方法の前に定義する必要があります.正しいコードは次のとおりです:
  • cost = fluid.layers.cross_entropy(input=model, label=label)
    avg_cost = fluid.layers.mean(cost)
    acc = fluid.layers.accuracy(input=model, label=label)
    
    test_program = fluid.default_main_program().clone(for_test=True)
    
  • 問題の拡張:PaddlePaddleのProgramはFluidプログラムの主要な構成部分の一つであり、Fluidプログラムには通常2つのProgramが存在する.fluid.default_startup_programは、モデルパラメータの作成、入出力、およびモデル内の学習可能なパラメータの初期化などの様々な動作を定義する.一方、fluid.default_main_programは、ニューラルネットワークモデル、順方向逆計算、および最適化アルゴリズムによるネットワーク内の学習可能なパラメータの更新を定義する.