Как распаковать целочисленный битовый шаблон в tf.Tensor?

У меня есть большой набор данных, который относительно эффективно хранится на диске, а горячие векторы упакованы в кусочки целого ряда целых. Формат данных фиксированной ширины, поэтому я могу читать его в tf.data.FixedLengthRecordDataset, и с tf.decode_raw() а также tf.bitwise.* Я преобразовал входными данными в кучу 64-битных целых чисел, представляющих входные векторы. Но я нахожусь в тупике при расширении целочисленных битовых комбинаций в тензор.

Конкретно (для краткости используя байты вместо длинных), скажем, я получил значение 0xba (0b10111010). В этом случае я хочу расширить это до вектора (1, 0, 1, 1, 1, 0, 1, 0), Каков наилучший способ достичь этого?

1 ответ

Решение

Вы можете сделать это так:

import tensorflow as tf

def bits_to_one_hot(bits, depth, dtype=None):
    bits = tf.convert_to_tensor(bits)
    masks = tf.bitwise.left_shift(tf.ones([], dtype=bits.dtype),
                                  tf.range(depth, dtype=bits.dtype))
    masked = tf.bitwise.bitwise_and(tf.expand_dims(bits, -1), masks)
    dtype = dtype or bits.dtype
    return tf.cast(tf.not_equal(masked, 0), dtype)

data = [0b10111010, 0b00101101]
depth = 8
input_bits = tf.placeholder(tf.int64, [None])
one_hot = bits_to_one_hot(input_bits, depth)
with tf.Session() as sess:
    print(sess.run(one_hot, feed_dict={input_bits: data}))

Выход:

[[0 1 0 1 1 1 0 1]
 [1 0 1 1 0 1 0 0]]
Другие вопросы по тегам