2017-03-16 122 views
2

我有一個TensorFlow模型,其中的一些特點:如何解釋TensorFlow預測,他們似乎有錯誤的形狀

state_size = 800, 
    num_classes = 14313, 
    batch_size = 10, 
    num_steps = 16, # width of the tensor 
    num_layers = 3 

    x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder') 
    y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder') 
    rnn_inputs = [tf.squeeze(i, squeeze_dims=[1]) for i in 
        tf.split(x_one_hot, num_steps, 1)] # still a list of tensors (batch_size, num_classes) 
    ... 
    logits = tf.matmul(rnn_outputs, W) + b 

    predictions = tf.nn.softmax(logits) 

現在我想給它一個np.array(形狀的batch_size = X num_steps,所以10×16),我得到一個預測張量。

奇怪的是,它的形狀是160 x 14313.後者是類的數量。但是160從哪裏來?我不明白這一點。我希望每個類的概率對於批次中的每個元素(即10個)都是可能的。 num_steps如何捲入,如何從這個pred讀取。張量這是16個數字之後的預期元素?

回答

1

在這種情況下,160來自您懷疑的形狀。
這意味着對於每批10個,有16個時步,當你做形變時,這在技術上是扁平的。
在這一點上,你有形狀160 *類的logits。所以你可以爲每個批次做predictions[i],然後每個班級有可能成爲所需的班級。
這就是爲什麼要得到選擇的類,你會做類似tf.argmax(predictions, 1)得到一個張量與分類
這將有你的情況160的形狀,所以這將是預計 類爲每個批次。

爲了獲得概率,你可以使用logits

def prob(logit): 
    return 1/(1 + np.exp(-logit)   
+0

我明白了,謝謝你。 softmax不給我正確的概率嗎?我應該使用exp函數?所以我認爲我應該只預測一個值而不是16個。爲了避免混淆,我在另一個問題中發佈了這個問題。 https://stackoverflow.com/questions/42766458/tensorflow-predicting-sequences-what-is-x-and-y – dorien

+1

tf.nn.softmax計算通過softmax層的前向傳播。在計算模型輸出的概率時,可以在評估模型時使用它。所以是的,它會給你正確的概率,我想提供另一種方式,只是與logits。 – SerialDev

+0

與此相關。我似乎不知道哪個標籤與哪個預測值有關。這應該很容易得到正確的? https://stackoverflow.com/questions/43039055/how-to-get-class-labels-from-tensorflow-prediction – dorien