gpt4 book ai didi

pytorch - PyTorch 数据集应该返回什么?

转载 作者:行者123 更新时间:2023-12-05 03:21:55 31 4
gpt4 key购买 nike

我正在尝试让 PyTorch 与 DataLoader 一起工作,据说这是处理小批量的最简单方法,在某些情况下这是获得最佳性能所必需的。

DataLoader 需要一个数据集作为输入。

大多数关于 Dataset 的文档都假定您正在使用现成的标准数据集,例如MNIST,或者至少是图像,并且可以将现有机器用作黑匣子。我正在处理自己生成的非图像数据。我目前最好的尝试是将有关如何执行此操作的文档提炼成最小的测试用例:

import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader


class Dataset1(Dataset):
def __init__(self):
pass

def __len__(self):
return 80

def __getitem__(self, i):
# actual data is blank, just to test the mechanics of Dataset
return [0.0, 0.0, 0.0], 1.0


train_dataloader = DataLoader(Dataset1(), batch_size=8)

for X, y in train_dataloader:
print(f"X: {X}")
print(f"y: {y.shape} {y.dtype} {y}")
break


class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layers = nn.Sequential(
nn.Linear(3, 10),
nn.ReLU(),
nn.Linear(10, 1),
nn.Sigmoid(),
)

def forward(self, x):
return self.layers(x)


device = torch.device("cpu")
model = Net().to(device)
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

for epoch in range(10):
for X, y in train_dataloader:
X, y = X.to(device), y.to(device)

pred = model(X)
loss = criterion(pred, y)

optimizer.zero_grad()
loss.backward()
optimizer.step()

上述程序的输出是:

X: [tensor([0., 0., 0., 0., 0., 0., 0., 0.], dtype=torch.float64), tensor([0., 0., 0., 0., 0., 0., 0., 0.], dtype=torch.float64), tensor([0., 0., 0., 0., 0., 0., 0., 0.], dtype=torch.float64)]
y: torch.Size([8]) torch.float64 tensor([1., 1., 1., 1., 1., 1., 1., 1.], dtype=torch.float64)
Traceback (most recent call last):
File "C:\ml\test_dataloader.py", line 47, in <module>
X, y = X.to(device), y.to(device)
AttributeError: 'list' object has no attribute 'to'

在我能找到的所有示例代码中,X, y = X.to(device), y.to(device) 成功了,因为X 确实是一个张量(而它不在我的版本中)。现在我试图找出究竟是什么将 X 转换为张量,因为示例代码例如https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html不这样做,或者我不明白它是如何以及在哪里做的。

Dataset 本身是否将事物转换为张量?答案似乎是“有点”。

它已将 y 转换为张量,即批处理中每个示例的 y 值的列。这么多,是有道理的,尽管它使用了 float64 类型,而在机器学习中,我们通常更喜欢 float32。我习惯于 Python 总是以 double 表示标量,因此从 double 到单精度的转换发生在形成张量时,并且可以通过指定 dtype 参数来确保这一点.但在这种情况下,Dataset 似乎已经隐含地形成了张量。有没有地方或方法可以指定 dtype 参数?

X 不是张量,而是张量列表。如果它是批处理中示例的列表,这将具有直观意义,但不是 8 个元素的列表,每个元素包含 3 个元素,而是相反。因此 Dataset 转置了输入数据,如果它正在形成一个张量以匹配 y 的形状,这将是有意义的,但它不是制作单个 2d 张量,而是制作一个 1d 张量列表。 (而且,还是 double 。)为什么?有没有办法改变这种行为?

到目前为止发布到 Does pytorch Dataset.__getitem__ have to return a dict? 的答案说 __getitem__ 可以返回任何东西。好的,但是如何将所有内容转换为训练过程所需的形式?

最佳答案

数据集实例仅负责返回数据集的单个元素,它可以采用多种形式:dictlistint float 、张量等...

但是您看到的行为实际上是由 PyTorch 数据加载器处理的,而不是由底层数据集处理的。这个机制称为 collat​​ing,其实现由 collat​​e_fn 完成。您实际上可以提供自己的参数作为 data.DataLoader 的参数. PyTorch 提供的默认整理功能为 default_collate并将处理绝大多数情况。请看its documentation ,因为它提供了有关它可以处理的可能用例的见解。

使用此默认整理,返回的批处理将采用与您在数据集中返回的项目相同的类型。因此,您应该返回张量而不是列表作为 @dx2-66解释。

关于pytorch - PyTorch 数据集应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72867109/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com