python - 如何将布尔张量打包成 int32 张量的位?
问题描述
我正在尝试 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 操作和数据类型,则应尽可能使用它。
推荐阅读
- mongodb - 如何使用聚合展平数组数组
- java - 如何在没有任何公共密钥的情况下在两个 Kafka 主题之间执行数据匹配?
- javascript - 未触发 Javascript 按钮 onclick 事件
- unicode - `? 的用法 :` 在 Arduino 的二维码生成器中
- amazon-web-services - AWS cli JMESpath 查询标签值
- java - 在 Android 中写入 .csv 文件
- sql - SQL Server 为某些错误代码启用日志记录
- database - Rust 返回 leveldb 数据库实例
- python - 当我们有多个目标时,sklearn 中 LASSO 的目标函数是什么?
- tensorflow - Tensorflow Federated 中的联邦学习,有没有办法在客户端应用早期停止?