在 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
转换为浮点数,但我不确定这是否会产生影响。
我正在尝试弄清楚如何使用 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
转换为浮点数,但我不确定这是否会产生影响。