我正在TensorFlow 1.15中尝试位操作API。
我有一个Tensor
of bool
(或int8
带有0或1个值),并且我想将True
orFalse
值密集地包装到的位中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]
,然后沿第一维求和。
如果要在数组中使用整数(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操作和数据类型,则应尽可能使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句