Tensorflow: вычислить обратное количество меток

Merlin1896 спросил: 03 ноября 2018 в 08:34 в: python

У меня есть тензор labels формы (b, n) целых чисел со значениями в [0,1,2,3,4,5]. Я хочу создать тензор weights формы (b, n), которая несет в позиции (i, j) обратное число раз, когда целое число labels[i,j] встречается в метках.

Рабочий пример кода :

import tensorflow as tf
import numpy as np
tf.InteractiveSession()
labels=tf.convert_to_tensor(np.array([[1,0,0,1,2,4],[2,2,2,4,2,1]]), dtype=tf.int32)
weights=tf.ones_like(labels, dtype=tf.float32)
bc=tf.bincount(labels, minlength=6, maxlength=6)
for i in range(6):
    cur_count = 1.0/(1e-10+tf.cast(bc[i], tf.float32))
    count_tensor = tf.ones_like(labels, dtype=tf.float32)*cur_count
    weights = tf.where(tf.equal(labels,i), count_tensor, weights)
weights.eval()
# array([[0.3333, 0.5, 0.5, 0.3333, 0.2, 0.5],
#        [0.2, 0.2, 0.2, 0.5, 0.2, 0.3333]], dtype=float32)

Так, например, метка 1 трижды появляется в тензоре labels, так что в weights значение 1/3 появляется в каждой позиции, где 1 находится в labels.

Что мне не нравится в этом коде, так это то, что tf .bincount не работает на графическом процессоре в моей версии tenorflow (1.4.0), и я не могу обновлять. Кроме того, я не уверен, как цикл for обрабатывается тензорным потоком и какая дополнительная нагрузка создается этим.

0 ответов