首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >元组:‘AttributeError’没有'to‘属性

元组:‘AttributeError’没有'to‘属性
EN

Stack Overflow用户
提问于 2020-09-10 16:34:33
回答 1查看 1.8K关注 0票数 1

我正在编写这个图像分类器,我已经定义了加载器,但我得到了这个错误,我没有关于它的线索。

我已经定义了火车装载器,为了更好地解释,我尝试了这个

代码语言:javascript
复制
for ina,lab in train_loader:
    print(type(ina))
    print(type(lab)) 

我得到了

代码语言:javascript
复制
<class 'torch.Tensor'>
<class 'tuple'>

现在,为了训练模型,我做了

代码语言:javascript
复制
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

我得到了错误:

代码语言:javascript
复制
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'

如果你还需要什么,请告诉我!谢谢

编辑:标签如下所示。这是蜜蜂和黄蜂之间的图像分类。它还包含昆虫和非昆虫。

(‘黄蜂’,‘黄蜂’,‘昆虫’,‘昆虫’,‘黄蜂’,‘昆虫’,‘黄蜂’,‘蜜蜂’,‘昆虫’,‘蜜蜂’,‘昆虫’,‘其他’,‘蜜蜂’,‘其他’,‘其他’,‘黄蜂’,‘蜜蜂’,‘黄蜂’,‘蜜蜂’,‘黄蜂’,‘黄蜂’,‘其他’,‘蜜蜂’,‘其他’,‘黄蜂’,‘昆虫’,‘黄蜂’,‘昆虫’,‘黄蜂’,‘黄蜂’,‘昆虫’,‘黄蜂’,‘蜜蜂’,‘黄蜂’,‘黄蜂’,‘昆虫’,‘昆虫’,‘黄蜂’,‘黄蜂’,‘蜜蜂’,‘黄蜂’,‘昆虫’,‘蜜蜂’,‘蜜蜂’,‘昆虫’,‘其他’)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-10 16:41:39

从字面上看,这意味着Python中的元组类没有名为to的方法。既然你想把你的标签贴到你的设备上,那就做labels = torch.tensor(labels).to(device)吧。

如果您不想这样做,您可以更改DataLoader的工作方式,让它以PyTorch张量而不是元组的形式返回您的标签。

编辑

由于标签看起来像是字符串,我将首先将它们转换为one-hot编码向量:

代码语言:javascript
复制
>>> 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)

我在这里有点冒险,因为我不知道确切的细节,但是字符串不能和张量一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63825841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档