我试图通过生成器将1D numpy数组(平展图像)送入H5py数据文件以创建训练和验证矩阵。H5py - 使用生成器创建数据集 - ValueError:设置数组元素的序列
以下代码改编自溶液(找不到它现在),其中H5py的File
对象的create_dataset
函数的data
属性提供的数据中的呼叫的形式np.fromiter
它具有发电机的功能的一个其论据。
from scipy.misc import imread
import h5py
import numpy as np
import os
# Creating h5 data file
f = h5py.File('../data.h5', 'w')
# Source directory for image data
src = '/datasets/aic540/train/images/'
# Showing quantity and dimensionality of data
images = os.listdir(src)
ex_img = imread(src + images[0])
flat_img = ex_img.flatten()
print "# of images is {}".format(len(images))
print "image shape is {}".format(ex_img.shape)
print "flattened image shape is {}".format(flat_img.shape)
# Creating generator to feed in data to h5py's `create_dataset` function
gen = (imread(src + i).flatten().astype(np.int8) for i in os.listdir(src))
# Creating h5 dataset
f.create_dataset(name='training',
#shape=(59482, 1555200),
data=np.fromiter(gen, dtype=np.int8))
输出:
# of images is 59482
image shape is (540, 960, 3)
flattened image shape is (1555200,)
Traceback (most recent call last):
File "process_images.py", line 30, in <module>
data=np.fromiter(gen, dtype=np.int8))
ValueError: setting an array element with a sequence.
我已经为这个错误在这种情况下搜索时读到的问题是,np.fromiter()
需要一个列表,而不是生成功能(这似乎反对功能名称“fromiter”意味着) - 将生成器封装在列表调用list(gen)
中允许代码运行,但在调用create_dataset
之前,它将耗尽此列表扩展中的所有内存。
如何使用生成器将数据送入H5py数据文件?
如果我的方法完全错误,那么构建一个不适合内存的非常大的numpy矩阵的正确方法是什么? - 使用H5py还是其他?
你必须写出块。 'NP。fromiter(...,dtype = np.int8)'产生一个数组 - 1d。所以即使它可以从一个生成器创建数组,它仍然会在将内容传递到文件之前创建内存中的所有内容。 – hpaulj
@hpaulj与ali_m在本文中建议的方式如此相似? https://stackoverflow.com/questions/34531479/writing-a-large-hdf5-dataset-using-h5py 这似乎是相当不雅/曲...... 我用更简单的看'chunk'尝试'create_dataset'函数的属性,但不幸的是无法正常工作。 – aweeeezy