この問題の原因は複数考えられます。最初に気になるのは、モデルのウェイトがインポート時にゼロに初期化されている可能性があることです。これは、グラフに初期化が定義されている場合に発生します(c.f. the loader)。これを確認するには、次のコマンドを使用します。
from tensorflow.contrib.session_bundle import session_bundle
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
print(s.graph.get_collection("serving_init_op"))
コレクションに何かがある場合は、変数が初期化されていないことを確認してください。
何の初期化子がない場合、重み自体は合理的に見えることを確認し、例えば、
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
print(session.run("name_of_var:0"))
そのすべてがチェックアウトした場合、あなたはおそらく、グラフへの入力に注意を払うことになるでしょうし、それらの入力を変換した後の出力この目的のために、session.run
を使用してグラフの一部を実行することができます。たとえば、jpegストリングをフィードし、session.run
へのコールで適切なフィードとフェッチを使用して、さまざまなステップの出力を表示することができます。
は例えば、this postからの例を使用して、我々は、ディスクからのJPEGをロードすることができ、グラフにそれを養う、とリサイズ後およびスケーリング後のデータがどのように見えるかを参照してください。戦略的に配置することにより
INPUT_PLACEHOLDER = 'Placeholder:0'
DECODE_AND_RESIZE = 'map/TensorArrayPack_1/TensorArrayGather:0'
SCALED = 'Mul:0'
# Read in a sample image, preferably with small dimensions.
jpg = open("/tmp/testing22222.jpg", "rb").read()
session, _ = session_bundle.load_session_bundle_from_path("/path/to/model")
resized, scaled = session.run([DECODE_AND_RESIZE, SCALED], feed_dict={INPUT_PLACEHOLDER: [jpg]})
fetch
リストにあるグラフのテンソルの名前を使用すると、ニューラルネットの任意の層で何が起こっているのかを調べることができますが、入力や変数に問題がある可能性が最も高いです。
トリッキーな部分は、テンソルの名前を把握しています。ほとんどの操作を定義するときにname
プロパティを使用すると便利です。
print([o.name for o in session.graph.get_operations()])
グラフの操作を調べるのに役立ちます。
最後に、デバッグ中のフィードバックサイクルを最小限に抑えるためにグラフをローカルで実行することもできます。これを行う方法の例については、サンプルのlocal_predict.pyを参照してください。これにより、モデル自体の問題をすばやく確認することができます。