AttributeError:“元组”没有属性“to”

问题描述 投票:0回答:2

我正在编写这个图像分类器,并且已经定义了加载器,但是遇到了这个错误,我对此一无所知。

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

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'

如果您还想要什么,请告诉我! 谢谢

编辑:标签看起来像这样。 这是蜜蜂和黄蜂之间的图像分类。它还包含昆虫和非昆虫

('黄蜂', '黄蜂', '昆虫', '昆虫', '黄蜂', '昆虫', '昆虫', '黄蜂', '黄蜂', '蜜蜂', '昆虫', '昆虫', “其他”、“蜜蜂”、“其他”、“黄蜂”、“其他”、“黄蜂”、“蜜蜂”、“蜜蜂”、“黄蜂”、“黄蜂”、“黄蜂”、“黄蜂”、“蜜蜂” ', '黄蜂', '黄蜂', '其他', '蜜蜂', '黄蜂', '蜜蜂', '蜜蜂') ('黄蜂', '黄蜂', '昆虫', '蜜蜂', '其他', '黄蜂', '昆虫', '黄蜂', '昆虫', '昆虫', '昆虫', '黄蜂', '黄蜂”、“昆虫”、“黄蜂”、“黄蜂”、“黄蜂”、“蜜蜂”、“黄蜂”、“黄蜂”、“昆虫”、“昆虫”、“黄蜂”、“黄蜂”、“蜜蜂” 、“黄蜂”、“昆虫”、“蜜蜂”、“蜜蜂”、“昆虫”、“昆虫”、“其他”)

machine-learning deep-learning pytorch kaggle
2个回答
4
投票

字面意思是Python中的tuple类没有一个名为

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)

我在这里有点盲目,因为我不知道确切的细节,但是字符串不能与张量一起使用。


0
投票

当我使用参考型图像数据集训练图像分类模型时,我也遇到了同样的错误。这里我通过扩展

from torch.utils.data import Dataset
类实现了自定义数据集类。和你一样,我没有对我的目标标签进行编码,它们只是类名(字符串)的元组。由于 PyTorch 张量不直接接受字符串数据,因此在模型训练中使用它们之前,我必须将这些标签转换为整数编码张量。

© www.soinside.com 2019 - 2024. All rights reserved.