當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。