当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python tf.io.decode_raw用法及代码示例


将原始字节从输入张量转换为数字张量。

用法

tf.io.decode_raw(
    input_bytes, out_type, little_endian=True, fixed_length=None, name=None
)

参数

  • input_bytes 输入张量的每个元素都转换为字节数组。

    目前,这必须是字符串(字节)的张量,尽管在语义上操作应该支持任何输入。

  • out_type DType 的输出。可接受的类型是 half , float , double , int32 , uint16 , uint8 , int16 , int8 , int64
  • little_endian input_bytes 数据是否为小端格式。如有必要,数据将转换为主机字节顺序。
  • fixed_length 如果设置,第一个fixed_length每个元素的字节将被转换。数据将被零填充或截断到指定的长度。

    fixed_length 必须是 out_type 大小的倍数。

    如果input_bytes 的元素是可变长度的,则必须指定fixed_length

  • name 操作的名称(可选)。

返回

  • 存储解码字节的Tensor 对象。

输入张量的每个分量都被解释为一个字节序列。然后将这些字节解码为 out_type 指定格式的数字。

tf.io.decode_raw(tf.constant("1"), tf.uint8)
<tf.Tensor:shape=(1,), dtype=uint8, numpy=array([49], dtype=uint8)>
tf.io.decode_raw(tf.constant("1,2"), tf.uint8)
<tf.Tensor:shape=(3,), dtype=uint8, numpy=array([49, 44, 50], dtype=uint8)>

请注意,输出张量的秩总是比输入张量多 1:

tf.io.decode_raw(tf.constant(["1","2"]), tf.uint8).shape
TensorShape([2, 1])
tf.io.decode_raw(tf.constant([["1"],["2"]]), tf.uint8).shape
TensorShape([2, 1, 1])

这是因为输入中的每个字节都被转换为输出上的新值(如果输出类型为 uint8int8 ,否则输入块将被转换为新值):

tf.io.decode_raw(tf.constant("123"), tf.uint8)
<tf.Tensor:shape=(3,), dtype=uint8, numpy=array([49, 50, 51], dtype=uint8)>
tf.io.decode_raw(tf.constant("1234"), tf.uint8)
<tf.Tensor:shape=(4,), dtype=uint8, numpy=array([49, 50, 51, 52], ...
# chuncked output
tf.io.decode_raw(tf.constant("12"), tf.uint16)
<tf.Tensor:shape=(1,), dtype=uint16, numpy=array([12849], dtype=uint16)>
tf.io.decode_raw(tf.constant("1234"), tf.uint16)
<tf.Tensor:shape=(2,), dtype=uint16, numpy=array([12849, 13363], ...
# int64 output
tf.io.decode_raw(tf.constant("12345678"), tf.int64)
<tf.Tensor:... numpy=array([4050765991979987505])>
tf.io.decode_raw(tf.constant("1234567887654321"), tf.int64)
<tf.Tensor:... numpy=array([4050765991979987505, 3544952156018063160])>

该操作允许通过 little_endian 参数指定字节顺序。

tf.io.decode_raw(tf.constant("\x0a\x0b"), tf.int16)
<tf.Tensor:shape=(1,), dtype=int16, numpy=array([2826], dtype=int16)>
hex(2826)
'0xb0a'
tf.io.decode_raw(tf.constant("\x0a\x0b"), tf.int16, little_endian=False)
<tf.Tensor:shape=(1,), dtype=int16, numpy=array([2571], dtype=int16)>
hex(2571)
'0xa0b'

如果 input_bytes 的元素长度不同,则必须指定 fixed_length

tf.io.decode_raw(tf.constant([["1"],["23"]]), tf.uint8, fixed_length=4)
<tf.Tensor:shape=(2, 1, 4), dtype=uint8, numpy=
array([[[49,  0,  0,  0]],
       [[50, 51,  0,  0]]], dtype=uint8)>

如果 fixed_length 值大于 out_type dtype 的长度,则会生成多个值:

tf.io.decode_raw(tf.constant(["1212"]), tf.uint16, fixed_length=4)
<tf.Tensor:shape=(1, 2), dtype=uint16, numpy=array([[12849, 12849]], ...

如果输入值大于 fixed_length ,则将其截断:

x=''.join([chr(1), chr(2), chr(3), chr(4)])
tf.io.decode_raw(x, tf.uint16, fixed_length=2)
<tf.Tensor:shape=(1,), dtype=uint16, numpy=array([513], dtype=uint16)>
hex(513)
'0x201'

如果指定了little_endianfixed_length,则在字节序转换之前截断到固定长度:

x=''.join([chr(1), chr(2), chr(3), chr(4)])
tf.io.decode_raw(x, tf.uint16, fixed_length=2, little_endian=False)
<tf.Tensor:shape=(1,), dtype=uint16, numpy=array([258], dtype=uint16)>
hex(258)
'0x102'

如果输入值都具有相同的长度,则指定 fixed_length 等于字符串的大小不应更改输出:

x = ["12345678", "87654321"]
tf.io.decode_raw(x, tf.int16)
<tf.Tensor:shape=(2, 4), dtype=int16, numpy=
array([[12849, 13363, 13877, 14391],
       [14136, 13622, 13108, 12594]], dtype=int16)>
tf.io.decode_raw(x, tf.int16, fixed_length=len(x[0]))
<tf.Tensor:shape=(2, 4), dtype=int16, numpy=
array([[12849, 13363, 13877, 14391],
       [14136, 13622, 13108, 12594]], dtype=int16)>

相关用法


注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.io.decode_raw。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。