Tensorflow数据集使用许多压缩的numpy文件



我有一个很大的数据集,我想用来在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占位符的数据集对象,然后在我的epoch批处理循环中从我的numpy文件中填充它。

有什么建议吗?

您可以定义一个包装器并使用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或parallel_interleave和from_generator方法的组合。from_generator方法在内部使用py_func,因此您可以直接读取np文件,然后在python中定义生成器。

相关内容

  • 没有找到相关文章

最新更新