3 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
崩潰可能意味著您的內(nèi)存不足,我會(huì)嘗試將數(shù)據(jù)分塊并一次處理其中的一小部分。如果您使用的是 pandas 方法read_hdf,則可以使用 iterator 和 chunksize 參數(shù)來(lái)控制分塊:
import pandas as pd
data_iter = pd.read_hdf('/tmp/test.hdf', key='test_key', iterator=True, chunksize=100)
for chunk in data_iter:
? ?#train cnn on chunk here
? ?print(chunk.shape)
請(qǐng)注意,這要求 hdf 為表格格式

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的內(nèi)存不足。讀取一個(gè)shape為(20670, 224, 224, 3)的數(shù)據(jù)集,會(huì)變成一個(gè)3.1G實(shí)體的列表。如果您讀取 3 個(gè)圖像集,則需要更多的 RAM。我假設(shè)這是圖像數(shù)據(jù)(可能是 20670 個(gè)形狀為 (224, 224, 3) 的圖像)?h5py如果是這樣,您可以使用和(Pytables)讀取切片中的數(shù)據(jù)tables。這會(huì)將數(shù)據(jù)作為 NumPy 數(shù)組返回,您可以直接使用它(無(wú)需操作成不同的數(shù)據(jù)結(jié)構(gòu))。
基本過(guò)程如下所示:
with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5",'r') as db:
? ? ?training_db = db['data']
? ? ?# loop to get images 1 by 1
? ? ?for icnt in range(20670) :
? ? ? ? ?image_arr = training_db [icnt,:,:,:}
? ? ?# then do something with the image
您還可以通過(guò)將第一個(gè)索引設(shè)置為一個(gè)范圍(比如icnt:icnt+100)來(lái)讀取多個(gè)圖像,然后適當(dāng)?shù)靥幚硌h(huán)。

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
當(dāng)您的內(nèi)存不足時(shí),就會(huì)出現(xiàn)您的問(wèn)題。因此,在處理像您這樣的大型數(shù)據(jù)集時(shí),虛擬數(shù)據(jù)集會(huì)派上用場(chǎng)。虛擬數(shù)據(jù)集允許通過(guò)接口層將多個(gè)真實(shí)數(shù)據(jù)集映射到一個(gè)單一的、可切片的數(shù)據(jù)集。
我建議您一次從一個(gè)文件開(kāi)始。首先,創(chuàng)建一個(gè)現(xiàn)有數(shù)據(jù)的虛擬數(shù)據(jù)集文件,例如
with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5", 'r') as db:
? ? ?data_shape = db['data'].shape
? ? ?layout = h5py.VirtualLayout(shape = (data_shape), dtype = np.uint8)
? ? ?vsource = h5py.VirtualSource(db['data'])
? ? ?with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'w', libver = 'latest') as file:
? ? ? ? ?file.create_virtual_dataset('data', layout = layout, fillvalue = 0)
? ? ?
這將創(chuàng)建一個(gè)現(xiàn)有訓(xùn)練數(shù)據(jù)的虛擬數(shù)據(jù)集?,F(xiàn)在,如果你想操作你的數(shù)據(jù),你應(yīng)該以r+這樣的模式打開(kāi)你的文件
with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'r+', libver = 'latest') as file:
? ? # Do whatever manipulation you want to do here
我想建議的另一件事是確保切片時(shí)的索引是int數(shù)據(jù)類(lèi)型的,否則會(huì)出錯(cuò)。
添加回答
舉報(bào)