3 回答

TA貢獻1813條經驗 獲得超2個贊
崩潰可能意味著您的內存不足,我會嘗試將數據分塊并一次處理其中的一小部分。如果您使用的是 pandas 方法read_hdf,則可以使用 iterator 和 chunksize 參數來控制分塊:
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)
請注意,這要求 hdf 為表格格式

TA貢獻1806條經驗 獲得超8個贊
您的內存不足。讀取一個shape為(20670, 224, 224, 3)的數據集,會變成一個3.1G實體的列表。如果您讀取 3 個圖像集,則需要更多的 RAM。我假設這是圖像數據(可能是 20670 個形狀為 (224, 224, 3) 的圖像)?h5py如果是這樣,您可以使用和(Pytables)讀取切片中的數據tables。這會將數據作為 NumPy 數組返回,您可以直接使用它(無需操作成不同的數據結構)。
基本過程如下所示:
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
您還可以通過將第一個索引設置為一個范圍(比如icnt:icnt+100)來讀取多個圖像,然后適當地處理循環。

TA貢獻1891條經驗 獲得超3個贊
當您的內存不足時,就會出現您的問題。因此,在處理像您這樣的大型數據集時,虛擬數據集會派上用場。虛擬數據集允許通過接口層將多個真實數據集映射到一個單一的、可切片的數據集。
我建議您一次從一個文件開始。首先,創建一個現有數據的虛擬數據集文件,例如
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)
? ? ?
這將創建一個現有訓練數據的虛擬數據集?,F在,如果你想操作你的數據,你應該以r+這樣的模式打開你的文件
with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'r+', libver = 'latest') as file:
? ? # Do whatever manipulation you want to do here
我想建議的另一件事是確保切片時的索引是int數據類型的,否則會出錯。
添加回答
舉報