【发布时间】:2018-07-18 05:37:51
【问题描述】:
我正在尝试将瓶颈值保存到新创建的 hdf5 文件中。
瓶颈值以(120,10,10, 2048) 的形式出现。
保存一个单独的批次占用了超过 16 个演出,python 似乎在这一批次中冻结了。根据最近的发现(见更新,看来hdf5占用大内存还可以,但冻结部分似乎是个小故障。
我只是想保存前 2 个批次用于测试目的,而且只有 训练数据集(再次,这是一个测试运行),但我什至无法通过第一批。它只是停在第一批,不会循环到下一次迭代。如果我尝试检查 hdf5,资源管理器会变得迟缓,Python 会冻结。如果我试图杀死 Python(即使没有检查 hdf5 文件),Python 也不会正确关闭并强制重启。
以下是相关代码和数据:
总数据点约为 90,000 个,分批发布 120 个。
Bottleneck shape is (120,10,10,2048)
所以我要保存的第一批是(120,10,10,2048)
这是我尝试保存数据集的方法:
with h5py.File(hdf5_path, mode='w') as hdf5:
hdf5.create_dataset("train_bottle", train_shape, np.float32)
hdf5.create_dataset("train_labels", (len(train.filenames), params['bottle_labels']),np.uint8)
hdf5.create_dataset("validation_bottle", validation_shape, np.float32)
hdf5.create_dataset("validation_labels",
(len(valid.filenames),params['bottle_labels']),np.uint8)
#this first part above works fine
current_iteration = 0
print('created_datasets')
for x, y in train:
number_of_examples = len(train.filenames) # number of images
prediction = model.predict(x)
labels = y
print(prediction.shape) # (120,10,10,2048)
print(y.shape) # (120, 12)
print('start',current_iteration*params['batch_size']) # 0
print('end',(current_iteration+1) * params['batch_size']) # 120
hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = prediction
hdf5["train_labels"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = labels
current_iteration += 1
print(current_iteration)
if current_iteration == 3:
break
这是打印语句的输出:
(90827, 10, 10, 2048) # print(train_shape)
(6831, 10, 10, 2048) # print(validation_shape)
created_datasets
(120, 10, 10, 2048) # print(prediction.shape)
(120, 12) #label.shape
start 0 #start of batch
end 120 #end of batch
# Just stalls here instead of printing `print(current_iteration)`
它只是在这里停顿一段时间(20 分钟 +),hdf5 文件的大小慢慢增长(现在大约 20 个演出,在我强行杀死之前)。实际上我什至不能用任务管理器强制杀死,我必须重新启动操作系统,在这种情况下才能真正杀死 Python。
更新
在玩了一会儿我的代码之后,似乎有一个奇怪的错误/行为。
相关部分在这里:
hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = prediction
hdf5["train_labels"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] = labels
如果我运行这些行中的任何一个,我的脚本将通过迭代,并按预期自动中断。因此,如果我运行非此即彼,则不会冻结。它也发生得相当快——不到一分钟。
如果我运行第一行 ('train_bottle'),我的内存占用了大约 69-72 gigs,即使它只是几批。如果我尝试更多批次,内存是一样的。所以我假设train_bottle 决定存储基于我分配数据集的大小参数,而不是实际填充时。
因此,尽管有 72 个演出,但它的运行速度相当快(一分钟)。
如果我运行第二行 train_labels ,我的内存会占用几兆字节。
迭代没有问题,执行break语句。
但是,现在出现了问题,如果我尝试运行两条线(在我的情况下这是必要的,因为我需要同时保存“train_bottle”和“train_labels”),我在第一次迭代时遇到了冻结,并且它不会继续到第二次迭代,即使在 20 分钟后也是如此。 Hdf5 文件正在缓慢增长,但如果我尝试访问它,Windows 资源管理器会变慢,而且我无法关闭 Python——我必须重新启动操作系统。
所以我不确定在尝试运行两条线路时出现什么问题——就好像我运行了内存饥饿的train_data 线路,如果运行良好并在一分钟内结束。
【问题讨论】:
-
我不知道
16GB的估计值来自哪里,但我认为这是一个错误的假设。单个批次需要120 * 10 * 10 * 2048 * 4 bytes* what is approximately94MB. So a full dataset which you want to save has94 * 90000 MB` 大约等于9TB。这就是您的错误的来源。 -
感谢您的回复。它实际上总共有 90000 张图像,所以批次将是 (90000/120) = 750 * 94 MB。哪个应该 7.5 演出?但是,我只是想保存前两批,应该是 94 * 2。至于估计,我实际上每 30 秒左右手动检查一次文件,我一直看到它增加了这些演出。我无法弄清楚我的代码中是否存在导致此问题的错误。我正在使用外部硬盘驱动器,想知道这是否会导致问题(太慢?)。我的内部硬盘快满了,我必须找到要删除的东西来测试它。
-
老兄-
750 * 94MB = 69 GB,不是6.9GB:D -
多久后达到20GB?
-
@MarcinMożejko 啊,你是对的,但我只是想保存前两到三批。而且它甚至没有通过第一批并积累了大约 20 个演出。奇怪的是,如果我省略
['train_bottle'] line and just run the['train_labels']` 行,它将通过前几批并按预期中断(也很快)。