Проблема

В PyTorch я пытаюсь написать класс, который мог бы возвращать целые data и label по отдельности, используя синтаксис вроде dataset.data и dataset.label. Каркас кода выглядит так:

class MyDataset(object):
  data = _get_data()
  label = _get_label()
  def __init__(self, dir, transforms):
    self.img_list = ... # all image paths loaded from dir
    # do something 

  def __getitem__(self):
    # do something
    return data, label

  def __len__(self):
    return len(self.img_list)

  def _get_data():
    # do something

  def _get_label():
    # do something

Однако, когда я использую dataset.data и dataset.label для доступа к соответствующим переменным, ничего не возвращается.

Мне интересно, почему это так и как я могу это исправить.

Редактировать

Спасибо за внимание.

Я сам решил эту проблему. Решение довольно простое, оно просто использует свойство переменных класса .

class FaceDataset(object):
    # class variable
    data = None
    label = None

    def __init__(self, root, transforms=None):
        # read img_list from root
        img_list = ...
        self.transforms = ...
        FaceDataset.data = FaceDataset._get_data(self.img_list, self.transforms)
        FaceDataset.label = FaceDataset._get_label(self.img_list)

    @classmethod
    def _get_data(cls, img_list, transforms):
        data_list = []
        for img_path in img_list:
            data_list.append(transforms(Image.open(img_path)).unsqueeze(0))
        return torch.stack(data_list, dim=0)

    @classmethod
    def _get_label(cls, img_list):
        label = torch.zeros(len(img_list))
        for i, img_path in enumerate(img_list):
            label[i] = ...
        return label

    def __getitem__(self, index):
        img_path = self.img_list[index]
        label = ...

        # read image from file
        data = Image.open(img_path)
        # apply transform defined in __init__
        data = self.transforms(data)

        return data, label

    def __len__(self):
        return len(self.img_list)
-2
Mr.Robot 22 Окт 2019 в 06:00
Я не знаю, почему люди голосуют против моего вопроса.
 – 
Mr.Robot
22 Окт 2019 в 07:15
Хорошо, начнем с того, что вы уже сделали!
 – 
Hossein
22 Окт 2019 в 15:24
На это невозможно ответить, поскольку мы не можем просто угадать, что находится в _get_data() и _get_label(). Более того, в PyTorch вы всегда должны создавать подклассы Dataset класс для ваших пользовательских наборов данных.
 – 
Mat
24 Окт 2019 в 19:25
Они возвращают значения пикселей изображения и соответствующую метку для изображения (в моем случае, есть ли на изображении человеческое лицо). Я не знал, что могу напрямую создать подкласс torch.utils.data.Dataset, current. Я просто создал итерацию (скажем, mydataset), а затем создал набор данных, используя синтаксис типа dataloader = torch.utils.data.DataLoader(mydataset). Спасибо, что указали на это.
 – 
Mr.Robot
24 Окт 2019 в 20:56
1
Вот несколько вещей: во-первых, если вы найдете ответ на свой вопрос, вам следует опубликовать этот ответ, а не редактировать его в вопросе. Во-вторых, я проголосовал за то, чтобы закрыть это как неясное; это не то, как следует определять пользовательский Dataset, и поэтому угадывать поведение невозможно.
 – 
Mat
24 Окт 2019 в 21:00

1 ответ

На «нормальный» способ создания пользовательских наборов данных в Python уже был дан ответ здесь на SO. Для этого есть официальный учебник по PyTorch.

В качестве простого примера вы можете прочитать код набора данных PyTorch MNIST здесь (этот набор данных используется в примере кода PyTorch для дальнейшей иллюстрации). Наконец, вы можете найти другие реализации наборов данных в списке этого набора данных torchvision (нажмите на имя набора данных, затем нажмите кнопку «источник» в документации по набору данных, чтобы получить доступ к реализации PyTorch набора данных).

1
Blupon 26 Окт 2019 в 20:37
Спасибо за указатели. Я сделал это «ненормальным» способом из-за того, что прочитал книгу о pytorch, опубликованную 2 года назад, которая явно устарела.
 – 
Mr.Robot
26 Окт 2019 в 03:05
1
Если говорить о библиотеках машинного обучения, то это уже 2 года! Чтобы не тратить силы на хорошо документированное использование PyTorch, я советую вам взглянуть на страницу с руководствами по PyTorch. Каждое руководство связано с использованием его заголовка в левой части страницы, второй учебник в этом списке - это то, которое вас интересует, например, по этому вопросу. Наслаждаться !
 – 
Blupon
26 Окт 2019 в 20:48