Python 如何修复pytorch快速入门教程中的错误?

Python 如何修复pytorch快速入门教程中的错误?,python,python-3.x,pytorch,Python,Python 3.x,Pytorch,我正试图遵循pytorch的教程,但似乎有一个问题。我创建了一个名为training\u data的自定义数据加载器,它根据需要返回一个对象,即字典 {"image": image, "label": label} 其中,image是张量,label是字符串。然后,我按照教程创建一个DataLoader,如下所示: train_dataloader = DataLoader(training_data, batch_size=batch_size) 并

我正试图遵循pytorch的教程,但似乎有一个问题。我创建了一个名为
training\u data
的自定义数据加载器,它根据需要返回一个对象,即字典

{"image": image, "label": label}
其中,
image
是张量,
label
是字符串。然后,我按照教程创建一个
DataLoader
,如下所示:

train_dataloader = DataLoader(training_data, batch_size=batch_size)
并在方法
train
中使用该
DataLoader

def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader)
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # Compute prediction error
        pred = model(X)
        loss = loss_fn(pred, y)

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

        if batch % 100 == 0:
            loss, current = loss.item(), batch * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")
但是,当我调用批处理的训练方法时

train(train_dataloader, model, loss_fn, optimizer)
我犯了一个错误

Traceback (most recent call last):
  File "train_network.py", line 110, in <module>
    train(train_dataloader, model, loss_fn, optimizer)
  File "train_network.py", line 76, in train
    X, y = X.to(device), y.to(device)
AttributeError: 'str' object has no attribute 'to'
回溯(最近一次呼叫最后一次):
文件“train_network.py”,第110行,在
列车(列车数据加载器、模型、损耗、优化器)
列车中第76行的文件“train_network.py”
十、 y=X.to(设备),y.to(设备)
AttributeError:“str”对象没有“to”属性

as
y
是一个带有内容
标签的字符串。我做错了什么?

你的标签
y
需要是火炬张量。由于您当前有字符串,并且假设您在
n
类中进行分类,您可以使用列表简单地映射它们。例如,对于三个类,在
数据集
类的
初始化
中:

self.label_names = ["class1", "class2", "class3"]
然后,在
\uuu getitem\uuuu
中,您可以添加:

label = torch.tensor(label_names.index(label))

其中,
label
以前存储了一个字符串。

字典是数据集返回的有效类型(不过为了公平起见,更常见的做法是让数据集的
\uuu getitem\uuuuuu
方法返回
数据
label
作为两个独立的张量。)

在任何情况下,当dataset
\uuuu getitem\uuuu
方法返回dict类型的对象时,pytorch的方法也会返回一个dict,并使用相同的键。您的问题是您试图将键(字符串)而不是值(张量)移动到GPU

相反,你应该:

for batch, datum in enumerate(dataloader):
   X = datum["image"].to(device)
   y = datum["label"].to(device)
   ...
然而,正如@GoodDects所指出的,我很有信心您需要将字符串标签转换为整数类型标签进行分类(通过该答案中详述的一种热编码)


如果您根本不想编辑数据集,您可以为您的数据加载器定义一个自定义的
collate\fn
,用整数替换字符串类名,或者在加载数据批处理后执行此类型转换(不推荐)。

y
应该是torch张量。根据文档,它是一个标签。那么如何从标签字符串创建一个张量呢?使用类似于
torch.tensor([0]]]
torch.tensor([1])的东西
我拥有的两个标签的正确方法?取决于问题的数据和类型。例如,如果您试图从N个类中进行分类,典型的表示法是将每个标签分配到0到N-1之间的整数,并使用该整数来训练模型。另一种常见的方法是使用单热编码。是的,您可以这样做。否t不是work@Alex错误是什么?至少,它不应该是同一个问题。同一个问题。但是当我的数据集返回元组
spec[0],label
而不是
{“image”:spec[0],“label”:label}
(带有
label
一个整数),那么我就不会再收到错误了
# from GoodDeeds answer, I include to condense both relevant changes into one answer
self.label_names = ["class1", "class2", "class3"]
label = torch.tensor(label_names.index(label)) # in __getitem__ method