我正在运行下面的数据加载器,它在训练之前对显微镜图像应用了一个过滤器。为了计算红色和绿色的数量。这段代码过滤了红血球。由于我已经将此应用于代码,因此我不断得到上面的错误消息。我尝试将内存分配增加到可能的最大限度,但没有帮助。有没有办法我可以修改过滤器,使它不会导致这个问题,谢谢?非常感谢你提前
import os
import numpy as np
import torch
from PIL import Image
from torch.utils.data import Dataset
from torchvision import transforms, utils
#from torchvision.transforms import Grayscalei
import pandas as pd
import pdb
import cv2
class CellsDataset(Dataset):
# a very simple dataset
def __init__(self, root_dir, transform=None, return_filenames=False):
self.root = root_dir
self.transform = transform
self.return_filenames = return_filenames
self.files = [os.path.join(self.root,filename) for filename in os.listdir(self.root)]
self.files = [path for path in self.files
if os.path.isfile(path) and os.path.splitext(path)[1]=='.png']
def __len__(self):
return len(self.files)
def __getitem__(self, idx):
path = self.files[idx]
image = cv2.imread(path)
sample = image.copy()
# set blue and green channels to 0
sample[:, :, 0] = 0
sample[:, :, 1] = 0
channel.
if self.transform:
sample = self.transform(sample)
if self.return_filenames:
return sample, path
else:
return sample发布于 2021-07-22 23:13:48
我以前遇到过类似的问题。
一种可能的解决方案是通过以下方式禁用cv2多处理
def __getitem__(self, idx):
import cv2
cv2.setNumThreads(0)
# ...在你的数据加载器里。这可能是因为cv2多进程和torch的DataLoader在多进程上有冲突。虽然它不适合我,因为我的不涉及OpenCV。但是你可以先试试这个。
在我的例子中,值得一提的是,支持CUDA访问的torch的multiprocessing必须使用spawn或forkserver而不是fork来生成新进程。要做到这一点,您应该
if __name__ == '__main__':
import multiprocessing
multiprocessing.set_start_method('spawn')
# ... **The all rest code**请注意,您应该将所有剩余的代码放在if __name__ == '__main__'块中,包括导入,因为可能是其他导入(如cv2)将其设置为fork,而您的加载器无法工作。
发布于 2020-11-07 16:04:47
我想,过了这么多天,你一定找到了解决方案。我也有同样的问题。在我的例子中,内存不足杀手杀死了这个进程。我不知道我的解决方案是否有效,或者我不确定它是否相关,但我希望它能为那些刚接触这个问题的人提供一些方向。
这个问题可以用几种方法来解决。增加系统中的RAM容量将消除此问题。或者可以通过增加系统的交换存储器来消除它。
这是如何在Linux中设置交换内存。
linux@linux:~# fallocate -l 32G /tmp/swap
linux@linux:~# chmod 600 /tmp/swap
linux@linux:~# mkswap /tmp/swap
linux@linux:~# swapon /tmp/swap我从中发现了增加交换空间的想法。
或者最简单的方法是减少训练的批量大小。批处理大小越小,占用的内存就越少。尝试一下,将批处理大小设置为现有大小的一半。
另一种选择是减少数据加载器的num_workers。这也减少了RAM的使用。
发布于 2021-04-27 09:05:43
在我的例子中,我使用了L fixed Database (LMDB)并修复了它。
https://stackoverflow.com/questions/63221468
复制相似问题