2017-04-02 69 views
0

我對Tensorflow非常陌生,我正在嘗試使用inception v3網絡來訓練iPhone應用程序中使用的東西。我設法我的圖形導出爲protocolbuffer文件,手動刪除差節點(正確的,我希望如此),並放置在.pb文件在我的iOS項目,但現在我收到以下錯誤:如何獲取用於iOS示例應用程序的圖層名稱? (Tensorflow)

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

這似乎表明我的input_layer_nameoutput_layer_name變量在iOS應用程序中配置錯誤。

我在各個地方看到,它應該分別爲Mulsoftmax,對於初始版本v3,但這些值對我不起作用。

我的問題是:什麼是一層(關於這個上下文),以及如何找出我的是什麼?

This是我訓練的模型的確切定義,但我沒有看到「Mul」或「softmax」出現。

This是我已經能夠了解圖層,但它似乎是一個不同的概念,因爲「Mul」不在該列表中。

我擔心這可能是this question重複,但「層」不解釋(他們是張量?)和graph.get_operations()似乎被棄用,或者也許我用錯了。

回答

0

由於MohamedEzz寫道Tensorflow圖中沒有圖層。只有可以放在同一名稱範圍內的操作。

通常位於相同範圍內的單層操作和知道名稱範圍概念的應用程序可以顯示它們的分組。

這樣的應用之一是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打印UI URL到控制檯

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

下面是該曲線圖的圖像。 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

在tensorflow的核心,有ops(運算)和tensors(n維數組)。每個運算都需要張量並給出張量。圖層只是代表神經網絡層的許多操作的便利包裝。

例如卷積層由主要3 OPS:

  1. conv2d運算:這是在輸入張量滑動的內核並執行內核和底層輸入窗口之間逐元素乘法。
  2. bias_add OP:添加偏壓到出來的conv2d運算
  3. 激活OP的張量:施加激活函數逐元素到bias_add運算

的輸出張量要運行tensorflow模型,你提供飼料(輸入)和提取(所需的輸出)。這些是張量或張量名稱。

從這行代碼Inception_model看來,您需要的是一個名爲'predictions'的張量,它具有n_class輸出概率。

你觀察到的(softmax)是生產的predictions

至於輸入張名運算的類型,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,你可以用「pred_y」去值

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") 

我叫層「轉化」,並在接下來的層中使用它。粘貼你的片段就像​​我在這裏做的

+0

我不知道我有問題在我的情況下訪問輸出,我認爲應用程序找不到名爲「input」的FeedInput。我爲我的第一個Conv2d操作添加了一個'name'參數,並將其命名爲「image_input」,並在應用中將'input_layer_name'變量命名爲匹配,但仍無法找到它。 –

+0

你可以粘貼這段代碼嗎?我正在編輯包含conv層的答案 – LGG

+1

這實際上只是在ios_camera示例應用程序中,但我實際上已經掌握了它的工作。我一直在尋找的答案是多方面的:應用程序正在尋找佔位符張量的名稱,它正在尋找完整名稱,我通過循環遍歷圖中的每個節點並打印每個名稱找到了全名。全名最終成爲了tower_0/image_input:0(當然,我在第一個位置創建了佔位符Tensor之後)。我不能相信它已經不存在或者沒有在Inception模型中命名,這使初學者很難擴展。 –

相關問題