2017-04-02 12 views
0

私はTensorflowの新機能です。iPhoneアプリで使用するために、開始v3ネットワークを使用して何かを訓練しようとしています。私は手動で(私は願って、正しく)ドロップアウト・ノードを削除し、protocolbufferファイルとして私のグラフをエクスポートするために管理し、私のiOSのプロジェクトでその.pbファイルを配置しているが、今、私は次のエラー受け付けております:iOSサンプルアプリケーションで使用するレイヤー名を取得するにはどうすればよいですか? (Tensorflow)

Running model failed:Not found: FeedInputs: unable to find feed output input 

これは、iOSアプリの変数input_layer_nameoutput_layer_nameが誤って設定されているようです。

開始時刻v3では、それぞれMulsoftmaxになるはずですが、これらの値は私にとってはうまくいきません。

私の質問は次のとおりです。レイヤーとは何ですか(このコンテキストに関して)、どのように私の鉱山があるのですか?

Thisは、私が訓練したモデルの正確な定義ですが、「Mul」または「softmax」は表示されません。

This私はレイヤについて学ぶことができましたが、 "Mul"はそのリストに存在しないため、別のコンセプトのようです。

私はこれがthis questionの重複であるかもしれないことを心配しているが、「層」が説明されていない(彼らはテンソルている?)とgraph.get_operations()は廃止されるようだ、または多分私はそれが間違って使用しています。

答えて

0

MohamedEzzと書いてありますが、Tensorflowグラフにはレイヤーがありません。同じ名前のスコープの下に置くことができる操作しかありません。

通常、同じ範囲内に配置された単一のレイヤーの操作と、名前の有効範囲の概念を認識するアプリケーションは、それらをグループ化して表示できます。

このアプリケーションの1つはTensorboardです。私はTensorboardを使うのがノード名を見つけるのに最も簡単な方法だと思います。

次の例を考えてみます。

import tensorflow as tf 
import tensorflow.contrib.slim.nets as nets 

input_placeholder = tf.placeholder(tf.float32, shape=(None, 224, 224, 3)) 

network = nets.inception.inception_v3(input_placeholder) 

writer = tf.summary.FileWriter('.', tf.get_default_graph()) 

writer.close() 

それはインセプションv3のネットワークを作成し、現在のディレクトリに(グラフで)イベントデータを保存し、入力データのプレースホルダを作成します。

同じディレクトリにTensorflowを起動すると、グラフ構造を表示することができます。

tensorboard --logdir . 

Tensorboardコンソール以下

Starting TensorBoard 41 on port 6006 
(You can navigate to http://192.168.128.73:6006) 

にUIのURLを印刷するには、このグラフの画像です。 enter image description here

あなたが興味のあるノードを見つけて、それを選択して(左上の情報ペインで)その名前を探します。

入力: enter image description here 出力: enter image description here

通常は、ノード名が、テンソル名である必要はないことに注意してください。ほとんどの場合、ノード名に:0を追加してテンソル名を取得すれば十分です。

次のコード(上記のコードの継続)を使用し、グラフから名前を使用して、上記作成したインセプションv3ネットワークに実行するたとえば

:私は、私は問題を抱えているかわからない

import numpy as np 

data = np.random.randn(1, 224, 224, 3) # just random data 
session = tf.InteractiveSession() 
session.run(tf.global_variables_initializer()) 
result = session.run('InceptionV3/Predictions/Softmax:0', feed_dict={'Placeholder:0': data}) 
# result.shape = (1, 1000) 
+0

これは最も包括的な答えであり、貴重な点をカバーしています。 Tensorboardを使うのではなく、グラフのすべてのノードをループして印刷して名前を見つけました。結局のところ、あなたが最後に持っている推論コードのようなものでした。あなたの答えはまた、すでにGithubのInception v3モデルに存在しないようなプレースホルダーノードの重要性を強調しています。私は自分自身を追加して渡しました。私はあなたの答えを受け入れられた答えとします。すべてのあなたの助けをありがとう! –

0

テンソルフローのコアには、ops(操作)とテンソル(n次元配列)があります。各演算子はテンソルを取り、テンソルを戻します。レイヤーは、ニューラルネットワークレイヤーを表す多くの操作の周りの便利なラッパーです。

  1. conv2d OP:

    例えば畳み込み層は、主に3 OPSから構成され、これは、入力テンソル上カーネルをスライドものであり、カーネルお​​よび基礎となる入力ウィンドウの間で要素毎の乗算を行います。

  2. bias_add opは:conv2d OP
  3. 活性化OPから出てくるテンソルにバイアスを追加します。tensorflowモデルを実行するにはbias_add OP

の出力テンソルに要素ごとの活性化関数を適用しますフィード(入力)と取り出し(希望の出力)を提供します。これらはテンソルまたはテンソルの名前です。

コードInception_modelのこの行から、n_class出力確率を持つ'predictions'という名前のテンソルがあるようです。あなたが観察何

softmax)が入力されたテンソル名についてはpredictionsテンソル

を生成OPの一種であり、それは関数の引数なので、入力テンソル名が表示されないinception_model.pyコード。したがって、あなたはその入力テンソルに与えた名前に依存します。

0

あなたの層または変数を作成し、この場合は名前

with tf.name_scope("output"): 
    W2 = tf.Variable(tf.truncated_normal([num_filters, num_classes], stddev=0.1), name="W2") 
    b2 = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b2") 
    scores = tf.nn.xw_plus_b(h_pool_flat, W2, b2, name="scores") 
    pred_y = tf.nn.softmax(scores,name="pred_y") 

というパラメータを追加し、私は、「出力/ pred_y」を使用することにより、最終的な予測値にアクセスすることができます。あなたはname_scope持っていけない場合は、ちょうど私が層「CONV」と呼ばれ、次の層でそれを使用した値

conv = tf.nn.conv1d(word_embeddedings, 
        W1, 
        stride=stride_size, 
        padding="VALID", 
        name="conv") #will have dimensions [batch_size,out_width,num_filters] out_width is a function of max_words,filter_size and stride_size 
# Apply nonlinearity 
h = tf.nn.relu(tf.nn.bias_add(conv, b1), name="relu") 

に到達するために「pred_y」を使用することができます。ここで行ったようにスニペットを貼り付けてください

+0

を私のケースでは出力にアクセスして、私はアプリが "入力"という名前のFeedInputを見つけることができないと思う。私は最初のConv2d opに 'name'引数を追加し、それを" image_input "と呼び、一致するようにアプリケーションの' input_layer_name'変数に名前を付けましたが、まだそれを見つけることはできません。 –

+0

そのコードを貼り付けることができますか?私はconvレイヤーを含める答えを編集中です – LGG

+1

これは実際にはios_cameraサンプルアプリケーション内にありますが、実際にはすでに動作しています。私が探していた答えは多面的なものです:アプリケーションはプレースホルダーテンソルの名前を探していて、グラフの各ノードをループして各名前を印刷することで見つけたフルネームを探しています。フルネームはtower_0/image_input:0となりました(もちろん、最初にその名前のプレースホルダTensorを作成した後)。私はそれがまだ存在していない、またはインセプションモデルに名前が付けられていないと信じることができません。これは初心者が拡張するのを困難にします。 –

関連する問題