Вход в тензор потока in_top_k должен иметь ранг 1 или ранг 2? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь поэкспериментировать с функцией in_top_k, чтобы увидеть, что именно делает эта функция.Но я обнаружил немного странное поведение.

Сначала я кодировал следующим образом

import numpy as np
import tensorflow as tf

target = tf.constant(np.random.randint(2, size=30).reshape(30,-1), dtype=tf.int32, name="target")
pred = tf.constant(np.random.rand(30,1), dtype=tf.float32, name="pred")
result = tf.nn.in_top_k(pred, target, 1)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    targetVal = target.eval()
    predVal = pred.eval()
    resultVal = result.eval()

Затем генерируется следующая ошибка:

ValueError: Shape must be rank 1 but is rank 2 for 'in_top_k/InTopKV2' (op: 'InTopKV2') with input shapes: [30,1], [30,1], [].

Затем я изменил свой код на

import numpy as np
import tensorflow as tf
target = tf.constant(np.random.randint(2, size=30), dtype=tf.int32, name="target")
pred = tf.constant(np.random.rand(30,1).reshape(-1), dtype=tf.float32, name="pred")
result = tf.nn.in_top_k(pred, target, 1)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    targetVal = target.eval()
    predVal = pred.eval()
    resultVal = result.eval()

Но теперь ошибка становится

ValueError: Shape must be rank 2 but is rank 1 for 'in_top_k/InTopKV2' (op: 'InTopKV2') with input shapes: [30], [30], [].

Так должен ли ввод быть рангом 1 или рангом 2?

1 Ответ

0 голосов
/ 10 октября 2018

Для in_top_k targets должно быть ранга 1 (индексы классов) и predictions ранга 2 (баллы для каждого класса).Это легко можно увидеть из документов .
Это означает, что два сообщения об ошибках на самом деле жалуются на разные входные данные каждый раз (нацеливаются на первый раз и предсказывают во второй раз),что, как ни странно, вообще не упоминается в сообщениях ... В любом случае, следующий фрагмент должен быть больше похож на него:

import numpy as np
import tensorflow as tf

target = tf.constant(np.random.randint(2, size=30), dtype=tf.int32, name="target")
pred = tf.constant(np.random.rand(30,1), dtype=tf.float32, name="pred")
result = tf.nn.in_top_k(pred, target, 1)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    targetVal = target.eval()
    predVal = pred.eval()
    resultVal = result.eval()

Здесь мы в основном объединяем «лучшее из обоих фрагментов»: прогнозыот первого и цели от второго.Однако, как я понимаю документы, даже для двоичной классификации нам нужно два значения для прогнозов, по одному для каждого класса.Так что-то вроде

import numpy as np
import tensorflow as tf

target = tf.constant(np.random.randint(2, size=30), dtype=tf.int32, name="target")
pred = tf.constant(np.random.rand(30,1), dtype=tf.float32, name="pred")
pred = tf.concat((1-pred, pred), axis=1)
result = tf.nn.in_top_k(pred, target, 1)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    targetVal = target.eval()
    predVal = pred.eval()
    resultVal = result.eval()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...