在 TensorFlow 中使用 FixedLengthRecordDataset 加载二进制数据

Loading binary data with FixedLengthRecordDataset in TensorFlow

我正在尝试弄清楚如何使用 FixedLengthRecordDataset:

加载二进制数据文件
import tensorflow as tf
import struct
import numpy as np

RAW_N = 2 + 20*20 + 1

def convert_binary_to_float_array(register):
    return struct.unpack('f'*RAW_N, register.numpy())

raw_dataset = tf.data.FixedLengthRecordDataset(filenames=['mydata.bin'],record_bytes=RAW_N*4)
float_ds = raw_dataset.map(map_func=convert_binary_to_float_array)

此代码抛出:

AttributeError: in user code:

tf-load-data.py:14 convert_binary_to_float_array  *
    return struct.unpack('f'*RAW_N, register.numpy())

AttributeError: 'Tensor' object has no attribute 'numpy'
如果我尝试遍历数据集,

numpy() 可用:

raw_dataset = tf.data.FixedLengthRecordDataset(filenames=['mydata.bin'],record_bytes=RAW_N*4)

for register in raw_dataset:
    print(struct.unpack('f'*RAW_N, register.numpy()))

通过阅读 Tensor 类型描述,我意识到 numpy() 仅在急切执行期间可用。因此,我可以推断在 map() 调用期间,元素未作为 EagerTensor.

提供

如何将此数据加载到数据集中?

我正在使用 TensorFlow 2.4.1

我建议使用 tf.io.decode_raw。不幸的是,我不知道 mydata.bin 是什么样子,所以我创建了一些虚拟数据:

import random
import struct
import tensorflow as tf
import numpy as np

RAW_N = 2 + 20*20 + 1

bytess = random.sample(range(1, 5000), RAW_N*4)
with open('mydata.bin', 'wb') as f:
  f.write(struct.pack('1612i', *bytess))

def convert_binary_to_float_array(register):
    return tf.io.decode_raw(register, out_type=tf.float32)

raw_dataset = tf.data.FixedLengthRecordDataset(filenames=['/content/mydata.bin'], record_bytes=RAW_N*4)
raw_dataset = raw_dataset.map(convert_binary_to_float_array)

for register in raw_dataset:
  print(register)

您也可以尝试先使用 tf.io.decode_raw 将数据解码为整数,然后使用 tf.cast 转换为浮点数,但我不确定这是否会产生影响。