亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀取大型 HDF5 文件

讀取大型 HDF5 文件

藍山帝景 2023-04-18 17:34:54
我剛開始使用 HDF5 文件,我正在嘗試讀取形狀為(20670, 224, 224, 3). 每當我嘗試將 hdf5 的結果存儲到列表或其他數據結構中時,要么花費很長時間以至于我中止執行,要么導致我的計算機崩潰。我需要能夠讀取 3 組 hdf5 文件,使用它們的數據,對其進行操作,使用它來訓練 CNN 模型并進行預測。非常感謝閱讀和使用這些大型 HDF5 文件的任何幫助。目前這是我閱讀 hdf5 文件的方式:db = h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5") training_db = list(db['data'])
查看完整描述

3 回答

?
慕姐8265434

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 為表格格式


查看完整回答
反對 回復 2023-04-18
?
慕森卡

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)來讀取多個圖像,然后適當地處理循環。


查看完整回答
反對 回復 2023-04-18
?
萬千封印

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數據類型的,否則會出錯。


查看完整回答
反對 回復 2023-04-18
  • 3 回答
  • 0 關注
  • 379 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號