如何解决AttributeError:“元组”没有属性“至” 编辑
我正在编写此图像分类器,并且已定义了加载程序,但遇到此错误,对此一无所知。
我已经定义了火车装载机,为了更好的解释,我尝试了
for ina,lab in train_loader:
print(type(ina))
print(type(lab))
我知道了
<class 'torch.Tensor'>
<class 'tuple'>
现在,为了训练模型,我做了
def train_model(model,optimizer,n_epochs,criterion):
start_time = time.time()
for epoch in range(1,n_epochs-1):
epoch_time = time.time()
epoch_loss = 0
correct = 0
total = 0
print( "Epoch {}/{}".format(epoch,n_epochs))
model.train()
for inputs,labels in train_loader:
inputs = inputs.to(device)
labels = labels.to(device)
optimizer.zero_grad()
output = model(inputs)
loss = criterion(output,labels)
loss.backward()
optimizer.step()
epoch_loss +=loss.item()
_,pred =torch.max(output,1)
correct += (pred.cpu()==label.cpu()).sum().item()
total +=labels.shape[0]
acc = correct/total
我得到了错误:
Epoch 1/15
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-36-fea243b3636a> in <module>
----> 1 train_model(model=arch,optimizer=optim,n_epochs=15,criterion=criterion)
<ipython-input-34-b53149a4bac0> in train_model(model,criterion)
12 for inputs,labels in train_loader:
13 inputs = inputs.to(device)
---> 14 labels = labels.to(device)
15 optimizer.zero_grad()
16 output = model(inputs)
AttributeError: 'tuple' object has no attribute 'to'
如果您还想要更多,请告诉我! 谢谢
编辑:标签看起来像这样。 这是蜜蜂和黄蜂之间的图像分类。它还包含昆虫和非昆虫
('wasp','wasp','insect','insect','wasp','insect','insect','wasp','wasp','bee','insect','insect ','other','bee','other','wasp','other','wasp','bee','bee','wasp','wasp','wasp','wasp', 'bee','wasp','wasp','other','bee','wasp','bee','bee') (“黄蜂”,“黄蜂”,“昆虫”,“蜜蜂”,“其他”,“黄蜂”,“昆虫”,“黄蜂”,“昆虫”,“昆虫”,“昆虫”,“黄蜂”,“黄蜂”,“昆虫”,“黄蜂”,“黄蜂”,“黄蜂”,“蜜蜂”,“黄蜂”,“黄蜂”,“昆虫”,“昆虫”,“黄蜂”,“黄蜂”,“蜂” ,“黄蜂”,“昆虫”,“蜜蜂”,“蜜蜂”,“昆虫”,“昆虫”,“其他”)
解决方法
从字面上看,它意味着Python中的tuple类没有名为to
的方法。由于您尝试将标签贴到设备上,因此只需labels = torch.tensor(labels).to(device)
。
如果您不想这样做,可以通过使DataLoader以PyTorch张量而不是元组的形式返回标签来更改DataLoader的工作方式。
编辑
由于标签似乎是字符串,因此我首先将其转换为单编码的矢量:
>>> import torch
>>> labels_unique = set(labels)
>>> keys = {key: value for key,value in zip(labels_unique,range(len(labels_unique)))}
>>> labels_onehot = torch.zeros(size=(len(labels),len(keys)))
>>> for idx,label in enumerate(labels_onehot):
... labels_onehot[idx][keys[label]] = 1
...
>>> labels_onehot = labels.to(device)
我在黑暗中拍摄一点,因为我不知道确切的细节,但是是的,字符串对张量不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。