使用许多压缩的 numpy 文件的 Tensorflow 数据集
Tensorflow Dataset using many compressed numpy files
我有一个大型数据集,想用它在 Tensorflow 中进行训练。
数据以压缩的numpy格式存储(使用numpy.savez_compressed
)。由于制作方式的不同,每个文件的图像数量不定。
目前我使用基于 Keras 序列的生成器对象进行训练,但我想完全转移到没有 Keras 的 Tensorflow。
我正在查看 TF 网站上的数据集 API,但不清楚如何使用它来读取 numpy 数据。
我的第一个想法是
import glob
import tensorflow as tf
import numpy as np
def get_data_from_filename(filename):
npdata = np.load(open(filename))
return npdata['features'],npdata['labels']
# get files
filelist = glob.glob('*.npz')
# create dataset of filenames
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_from_filename)
但是,这会将 TF 张量占位符传递给真正的 numpy 函数,并且 numpy 需要标准字符串。这导致错误:
File "test.py", line 6, in get_data_from_filename
npdata = np.load(open(filename))
TypeError: coercing to Unicode: need string or buffer, Tensor found
我正在考虑的另一个选项(但看起来很乱)是创建一个基于 TF 占位符的数据集对象,然后我在我的 numpy 文件的 epoch-batch 循环中填充它。
有什么建议吗?
您可以定义一个包装器并像这样使用 pyfunc:
def get_data_from_filename(filename):
npdata = np.load(filename)
return npdata['features'], npdata['labels']
def get_data_wrapper(filename):
# Assuming here that both your data and label is float type.
features, labels = tf.py_func(
get_data_from_filename, [filename], (tf.float32, tf.float32))
return tf.data.Dataset.from_tensor_slices((features, labels))
# Create dataset of filenames.
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_wrapper)
如果您的数据集非常大并且存在内存问题,您可以考虑使用 interleave or parallel_interleave and from_generator 方法的组合。 from_generator 方法在内部使用 py_func 所以你可以直接读取你的 np 文件,然后在 python.
中定义你的生成器
我有一个大型数据集,想用它在 Tensorflow 中进行训练。
数据以压缩的numpy格式存储(使用numpy.savez_compressed
)。由于制作方式的不同,每个文件的图像数量不定。
目前我使用基于 Keras 序列的生成器对象进行训练,但我想完全转移到没有 Keras 的 Tensorflow。
我正在查看 TF 网站上的数据集 API,但不清楚如何使用它来读取 numpy 数据。
我的第一个想法是
import glob
import tensorflow as tf
import numpy as np
def get_data_from_filename(filename):
npdata = np.load(open(filename))
return npdata['features'],npdata['labels']
# get files
filelist = glob.glob('*.npz')
# create dataset of filenames
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_from_filename)
但是,这会将 TF 张量占位符传递给真正的 numpy 函数,并且 numpy 需要标准字符串。这导致错误:
File "test.py", line 6, in get_data_from_filename
npdata = np.load(open(filename))
TypeError: coercing to Unicode: need string or buffer, Tensor found
我正在考虑的另一个选项(但看起来很乱)是创建一个基于 TF 占位符的数据集对象,然后我在我的 numpy 文件的 epoch-batch 循环中填充它。
有什么建议吗?
您可以定义一个包装器并像这样使用 pyfunc:
def get_data_from_filename(filename):
npdata = np.load(filename)
return npdata['features'], npdata['labels']
def get_data_wrapper(filename):
# Assuming here that both your data and label is float type.
features, labels = tf.py_func(
get_data_from_filename, [filename], (tf.float32, tf.float32))
return tf.data.Dataset.from_tensor_slices((features, labels))
# Create dataset of filenames.
ds = tf.data.Dataset.from_tensor_slices(filelist)
ds.flat_map(get_data_wrapper)
如果您的数据集非常大并且存在内存问题,您可以考虑使用 interleave or parallel_interleave and from_generator 方法的组合。 from_generator 方法在内部使用 py_func 所以你可以直接读取你的 np 文件,然后在 python.
中定义你的生成器