Python 如何修复pytorch快速入门教程中的错误?
我正试图遵循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) 并
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