Как распаковать целочисленный битовый шаблон в 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]]