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)
这将创建一个现有训练数据的虚拟数据集。现在,如果你想操作你的数据,你应该以r+这样的模式打开你的文件
with h5py.File(os.getcwd() + "/virtual_training_dataset.hdf5", 'r+', libver = 'latest') as file:
# Do whatever manipulation you want to do here
我想建议的另一件事是确保切片时的索引是int数据类型的,否则会出错。
添加回答
举报