首页 > 解决方案 > 如何将布尔张量打包成 int32 张量的位?

问题描述

我正在尝试 TensorFlow 1.15 中的位操作 API。

我有一个Tensorof bool(或int80 或 1 个值),我想将TrueorFalse值密集打包成int32 Tensor.

例如(假设目标是int8),给定Tensor形状 16: [0,0,0,0, 0,0,0,1, 0,0,0,1, 0,0,1,0],我想得到Tensor形状 2 的 a:[0x01, 0x12]

我怎样才能有效地做到这一点?

TensorFlow 2.x 是否为此提供了更好的操作?

原来Tensor是比较运算符的结果。有没有办法让比较返回位压缩Tensor

PS现在我正在将原件重塑Tensor为 32xN,然后通过常数 32x1 张量进行位移位:[31..0]然后沿第一个维度求和。

标签: pythontensorflow

解决方案


如果您正在使用数组中的整数(1 和 0)

您可以尝试这种常见的方法。

import tensorflow as tf  # TensorFlow 2.1.0
import numpy as np


def convert_bits(storage, bit_array, bit_size):
  for n_bit in range(bit_size):
    storage.assign_add(tf.reverse(bit_array, axis = [-1])[n_bit]*(2**n_bit))

data = [0,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0]
tf_data = tf.convert_to_tensor(data)

bit_size = 8 ## int8
np_array = np.array([])

for index in range(int(len(data)/bit_size)):
  temp_storage = tf.Variable(initial_value=0)
  convert_bits(temp_storage, tf_data[int(index*bit_size):int((index+1)*bit_size)], bit_size)
  np_array = np.append(np_array, temp_storage.numpy())
  print(np_array)

tf_array = tf.convert_to_tensor(np_array, dtype = tf.int32)

print(tf_array) # tf.Tensor([65 10], shape=(2,), dtype=int32)

tf.reverse您可以根据位的字节顺序修改和删除。此外,如果您可以在代码中使用 TensorFlow 操作和数据类型,则应尽可能使用它。


推荐阅读