我試圖通過生成器將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