pytorch - GPU 内存概念中的 PyTorch 数据加载器“数据加载”
问题描述
我正在使用 pytorch 数据加载器来加载我的 7.5 GB 数据集。我正在使用 100 的批量大小来加载数据。但是我不确定我是一次性加载整个数据集还是批量加载数据。即使批量大小低至 1,它也会给我CUDA 内存不足错误。我想知道默认(如pytorch文档中所示)dataloader是否使用批量加载或一次性转储所有数据?如果它尝试转储 7.5 GB 的数据,则此错误可能是由于数据集过大造成的。
作为参考,我附上了相同的代码-
class Image(Dataset):
def __init__(self, setname):
csv_path = osp.join(ROOT_PATH, setname + '.csv')
lines = [x.strip() for x in open(csv_path, 'r').readlines()][1:]
data = []
label = []
lb = -1
self.wnids = []
for l in lines:
name, wnid = l.split(',')
path = osp.join(ROOT_PATH, 'images', name)
if wnid not in self.wnids:
self.wnids.append(wnid)
lb += 1
data.append(path)
label.append(lb)
self.data = data
self.label = label
self.transform = transforms.Compose([
transforms.Resize(140),
transforms.CenterCrop(140),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
def __len__(self):
return len(self.data)
def __getitem__(self, i):
path, label = self.data[i], self.label[i]
image = self.transform(Image.open(path).convert('RGB'))
return image, label
以上是数据加载器部分。在主脚本中,它被称为如下 -
for epoch in range(1, args.max_epoch + 1):
lr_scheduler.step()
model.train()
for i, batch in enumerate(train_loader, 1):
data, _ = [_.cuda() for _ in batch]
p = args.shot * args.train_way
data_shot, data_query = data[:p], data[p:]
proto = model(data_shot)
label = torch.arange(args.train_way).repeat(args.query)
label = label.type(torch.cuda.LongTensor)
logits = euclidean_metric(model(data_query), proto)
loss = F.cross_entropy(logits, label)
tl.add(loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
解决方案
推荐阅读
- python - Pyqtgraph在图中颜色特定区域
- python - 创建一个 CSV 文件,其中包含两个在 python 中包含 UTF-8 的列表
- html - 尽管该笔记本已连接到互联网,但 HTML 代码出现错误
- kubernetes-helm - 是否可以在安装 helm 图表时根据 helm 客户端动态更新 Chart.yaml 中的 apiVersion?
- java - 在Java正则表达式中剪切多行文本的一部分
- arrays - 当命令失败时使脚本继续
- php - 如何在 Laravel 中使用 get route 插入数据发布
- java - Java 8 Compiler Plugin:如何在构造函数中添加 super() 调用?
- tinymce - 在 TinyMCE 中停止 html 格式化
- javascript - 将对象值组合到单个对象中