2016-12-02 15 views
2

私は機械学習に取り組んでいます。私はGoogle Cloud mlサービスを使いたいと思います。Google cloudml常に同じ結果を返します

私はTensorflowのretrain.pyコード(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/image_retraining/retrain.py#L103)でモデルを訓練し、その結果をcloudml(exportとexport.metaファイル)にエクスポートしました。しかし、私はコマンドを使用して新しいデータの予測を行うしようとすると、(https://cloud.google.com/ml/reference/commandline/predict):

gcloud beta ml predict 

それは常に同じ結果を(私は別のデータを予測したい)を返します。どのように可能ですか?

私のデータはでテキスト形式のJPEGからデコードされた画像である。

echo "{\"image_bytes\": {\"b64\": \"`base64 image.jpg`\"}}" > instances 

あなたが何か提案はありますか?

答えて

2

この問題の原因は複数考えられます。最初に気になるのは、モデルのウェイトがインポート時にゼロに初期化されている可能性があることです。これは、グラフに初期化が定義されている場合に発生します(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を参照してください。これにより、モデル自体の問題をすばやく確認することができます。

1

また、入力を拡大縮小する必要がある場合もあります。他のすべてのものを圧倒している入力が1つあると、最適化が貧弱になることがあります。これは、得られる結果がターゲット変数の平均値に近い場合に起こります。

あなたの入力が画像であるため、このケースはあまりありませんが、入力値はおそらく同様に拡大縮小されますが、csvファイルなどから訓練を受けた方が一般的です。

1

Googleは画像認識タスクにblog postを、一部にはcodeを公開しました。これはあなたが言及したretrain.pyの例から始まりますが、CloudML上で実行するためのすべての変更を行いました。

関連する問題