machine-learning - AttributeError : 'tuple' 没有属性 'to'
问题描述
我正在写这个图像分类器,我已经定义了加载器,但是遇到了这个错误,我对此一无所知。
我已经定义了火车装载机,为了更好地解释我尝试了这个
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, optimizer, n_epochs, 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'
如果你还想要什么,请告诉我!谢谢
编辑:标签看起来像这样。这是蜜蜂和黄蜂之间的图像分类。它还包含昆虫和非昆虫
('黄蜂','黄蜂','昆虫','昆虫','黄蜂','昆虫','昆虫','黄蜂','黄蜂','蜜蜂','昆虫','昆虫','其他','蜜蜂','其他','黄蜂','其他','黄蜂','蜜蜂','蜜蜂','黄蜂','黄蜂','黄蜂','黄蜂','蜜蜂' , '黄蜂', '黄蜂', '其他', '蜜蜂', '黄蜂', '蜜蜂', '蜜蜂') ('黄蜂', '黄蜂', '昆虫', '蜜蜂', '其他', '黄蜂','昆虫','黄蜂','昆虫','昆虫','昆虫','黄蜂','黄蜂','昆虫','黄蜂','黄蜂','黄蜂','蜜蜂','黄蜂','黄蜂','昆虫','昆虫','黄蜂','黄蜂','蜜蜂','黄蜂','昆虫','蜜蜂','蜜蜂','昆虫','昆虫','其他')
解决方案
它的字面意思是 Python 中的元组类没有一个名为to
. 由于您试图将标签放在设备上,因此只需执行labels = torch.tensor(labels).to(device)
.
如果您不想这样做,您可以更改 DataLoader 的工作方式,使其将您的标签作为 PyTorch 张量而不是元组返回。
编辑
由于标签似乎是字符串,我会先将它们转换为 one-hot 编码向量:
>>> 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)
我在这里有点黑暗,因为我不知道确切的细节,但是是的,字符串不适用于张量。
推荐阅读
- mysql - 向表中插入值时出错:日期值不正确
- java - 如何在不使用服务器设置的情况下使用 java 从 Outlook 邮件中下载附件?
- python-3.x - 在 heroku 上托管 django 应用程序时遇到的问题
- javascript - reactjs中的socket.io客户端xhr轮询错误
- algorithm - 3皇后问题有通用术语公式吗?
- java - Hibernate select with AND condition and all AND in OR
- java - 如何将不可见的布局设置为永久可见?
- vagrant - Zeek Vagrant 设置
- django - 在 is_valid 之后拒绝表单帖子
- javascript - 来自工厂的对象根据访问位置返回不同的属性值