AttributeError: объект 'tuple' не имеет атрибута 'data_dir' [closed]

Я разрабатываю эту программу на python и все время получаю эту ошибку.

AttributeError                            Traceback (most recent call last)
<ipython-input-17-334b6c50bab3> in <module>()
     30 
     31 args = parser.parse_known_args()
---> 32 root = args.data_dir
     33 save = args.save_dir
     34 learningrate = args.learning_rate

AttributeError: 'tuple' object has no attribute 'data_dir'

Я пытался придумать, как это исправить, и хотел бы знать, может ли кто-нибудь помочь?

Спасибо!

import matplotlib.pyplot as plt
import numpy as np
import torch
from torch import nn
from torch import tensor
from torch import optim
import torch.nn.functional as F
from torch.autograd import Variable
from torchvision import datasets, transforms
import torchvision.models as models
from collections import OrderedDict
import json
import PIL
from PIL import Image
import argparse
import Utilities3

parser = argparse.ArgumentParser(description='train3.py')

parser.add_argument('data_dir', type=str, \
    help='Path of the Image Dataset (with train, valid and test folders)')
parser.add_argument('--save_dir', type=str, \
    help='Directory to save checkpoints')
parser.add_argument('--arch', type=str, \
    help='Models architeture. Default is densenet121. Choose one at https://pytorch.org/docs/master/torchvision/models.html')
parser.add_argument('--learning_rate', type=float, \
    help='Learning rate. Default is 0.01')
parser.add_argument('--hidden_units', type=int, \
    help='Hidden units. Default is 200')
parser.add_argument('--epochs', type=int, \
    help='Number of epochs. Default is 3')
parser.add_argument('--gpu', action='store_true', \
    help='Use GPU for inference if available')
parser.add_argument('--save_every', type=int, \
    help='Number of steps to save the checkpoint. Default is 50')


args = parser.parse_known_args()
root = args.data_dir
save = args.save_dir
learningrate = args.learning_rate
structure = args.arch
dropout = args.dropout
hidden_layer = args.hidden_units
device = args.gpu
epochs = args.epochs

def main():

    training_loader, validation_loader, testing_loader = Utilities3.load_data(root)
    model, optimizer, criterion = Utilities3.network_construct(structure, dropout, hidden_layer, learningrate, device)
    Utilities3.do_deep_learning(model, optimizer, criterion, epochs, 40, training_loader, device)
    Utilities3.save_checkpoint(model, path, structure, hidden_layer, dropout, learningrate)
    print("Training is finish")


if __name__== "__main__":
    main()
-2
задан 20 January 2020 в 21:56

1 ответ

Вы уверены, что необходимо использовать parse_known_args?

Если так, необходимо изменить присвоение root и другие переменные как это:

root = args[0].data_dir

Если Вы выбрали parse_known_args по ошибке просто используйте parse_args и Вашей проблемы не стало.

Вы могли или прочитать документацию для argparse (https://docs.python.org/3/library/argparse.html#argparse. ArgumentParser.parse_known_args), где это говорит:

Вместо этого это возвращает два кортежа объекта, содержащие заполненное пространство имен и список остающихся строк аргумента.

Таким образом необходимо получить доступ к первому объекту в кортеже, который является [0] поскольку Python основан на нуле.

Или Вы могли установить точку останова путем вставки breakpoint() или import pdb;pdb.set_trace() (в зависимости от Вашей версии Python), и осматривают значение args.

Если Вы нуждаетесь в дальнейшем совете, просто говорите мне, и я обновлю ответ.

0
ответ дан 30 January 2020 в 23:33

Другие вопросы по тегам:

Похожие вопросы: