Pytorch изменить метку набора данных - PullRequest
0 голосов
/ 13 декабря 2018

Это фрагмент кода для загрузки изображений в виде набора данных из учебного пособия по передаче Pytorch :

data_transforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

data_dir = 'data'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
                                          data_transforms[x])
                  for x in ['train', 'val']}

dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
                                             shuffle=True, num_workers=4)
              for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}

И это один из примеров в наборе данных:

image_datasets['val'][0]:

(tensor([[[ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489],
          [ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489],
          [ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489],
          ...,
          [ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489],
          [ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489],
          [ 2.2489,  2.2489,  2.2489,  ...,  2.2489,  2.2489,  2.2489]],

         [[ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286],
          [ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286],
          [ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286],
          ...,
          [ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286],
          [ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286],
          [ 2.4286,  2.4286,  2.4286,  ...,  2.4286,  2.4286,  2.4286]],

         [[ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400],
          [ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400],
          [ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400],
          ...,
          [ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400],
          [ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400],
          [ 2.6400,  2.6400,  2.6400,  ...,  2.6400,  2.6400,  2.6400]]]), 0)

Существует ли какой-либо метод (лучшие практики) для изменения данных примера в наборе данных, например, изменить метку 0 на метку 1. Не работает следующее:

image_datasets['val'][0] = (image_datasets['val'][0][0], 1)

1 Ответ

0 голосов
/ 13 декабря 2018

Да, но не (легко) программно.Метки появляются из torchvision.datasets.ImageFolder и отражают структуру каталогов вашего набора данных (как видно на вашем жестком диске).Во-первых, я подозреваю, что вы можете узнать имя каталога в виде строки.Это плохо документировано, но у загрузчика данных есть атрибут classes, в котором они хранятся.Так что

img, lbl = image_datasets['val'][0]
directory_name = image_datasets['val'].classes[lbl]

Если вы хотите последовательно возвращать их вместо идентификаторов классов, вы можете использовать target_transform api следующим образом:

image_datasets['val'].target_transform = lambda id: image_datasets['val'].classes[id]

, что заставит загрузчик вернутьсястроки вместо идентификаторов отныне.Если вы ищете что-то более продвинутое, вы можете переопределить / наследовать от ImageFolder или DatasetFolder и реализовать свою собственную семантику.Единственные методы, которые вам нужно предоставить, это __len__ и __getitem__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...