将十六进制字符串的张量转换为int



我有一个tf.RaggedTensors的数据集,其中包含表示十六进制数字的字符串,如下所示:

[
[[b'F6EE', b'BFED', b'4EEA', b'00EE', b'77AE', b'1FBE', b'1A6E',
b'5AEB', b'6A0E', b'212F'],
...
[b'FFEE', b'FFED', b'FEED', b'FDEE', b'FAAE', b'FFBE', b'FA8E',
b'FAEB', b'FA0E', b'E12F']],
...
[[b'FFEE', b'FFED', b'FEED', b'FDEE', b'FAAE', b'FFBE', b'FA8E',
b'FAEB', b'FA0E', b'E12F'],
...
[b'B6EE', b'BFED', b'4EEA', b'00EE', b'77AE', b'1FBE', b'1A6E',
b'5AEB', b'6A0E', b'212F']]
]

我想将其转换为int值的张量,但tf.strings.to_number(tensor, tf.int32)没有将基指定为base16的选项。有其他选择吗?

数据集包含tf.RaggedTensors,但目标形状是(batch_size, 100, 10)。我想,如果我们为此制作一个自定义函数,这可能会有所帮助。

我想你正在寻找这样的东西。

我首先创建了一个三维形状的张量示例,就像你所拥有的那个。

import tensorflow as tf
>> a = tf.convert_to_tensor(['F6EE', 'BFED', '4EEA', '00EE', '77AE', '1FBE', '1A6E',
'5AEB', '6A0E', '212F'])
>> b = tf.convert_to_tensor(['FFEE', 'FFED', 'FEED', 'FDEE', 'FAAE', 'FFBE', 'FA8E',
'FAEB', 'FA0E', 'E12F'])
>> tensor = tf.ragged.stack([[a, b]]).to_tensor()
tf.Tensor(
[[[b'F6EE' b'BFED' b'4EEA' b'00EE' b'77AE' b'1FBE' b'1A6E' b'5AEB'
b'6A0E' b'212F']
[b'FFEE' b'FFED' b'FEED' b'FDEE' b'FAAE' b'FFBE' b'FA8E' b'FAEB'
b'FA0E' b'E12F']]], shape=(1, 2, 10), dtype=string)

然后,基于这个答案,我创建了一个自定义函数,我将其映射到张量的每个值,以便应用转换,在本例中为强制转换。

def my_cast(t):
val = tf.keras.backend.get_value(t)
return int(val, 16)
shape = tf.shape(tensor)
elems = tf.reshape(tensor, [-1])
res = tf.map_fn(fn=lambda t: my_cast(t), elems=elems, fn_output_signature=tf.int32)
res = tf.reshape(res, shape)
print(res)

输出是张量:

tf.Tensor(
[[[63214 49133 20202   238 30638  8126  6766 23275 27150  8495]
[65518 65517 65261 65006 64174 65470 64142 64235 64014 57647]]], 
shape=(1, 2, 10), 
dtype=int32
)

fn_output_signature=tf.int32添加到tf.map_fn非常重要,因为它可以让您获得相对于输入张量具有不同类型的张量。

最新更新