Изменить форму массива / предварительную обработку pytorch / python - PullRequest
0 голосов
/ 02 декабря 2018

Я экспериментирую с pytorch и пытаюсь запустить его на графическом процессоре, и у меня появляется такая ошибка

ValueError: Target size (torch.Size([4, 256, 1, 320])) must be the same as input size (torch.Size([4, 1, 256, 320]))

Вот как я изменяю массив.

def __getitem__(self, idx):
    img_filename = os.path.join(
        self.images_dir, self.images_name[idx] + '.jpg')
    img = np.array(Image.open(img_filename))
    img = cv2.resize(img, (320, 256))

    if self.target_dir:
        mask_filename = os.path.join(
            self.target_dir, self.images_name[idx] + '.png')
        mask = np.array(Image.open(mask_filename))
        mask = np.resize(mask, (320, 256))
        mask = np.reshape(mask, (1,) + mask.shape)
    else:
        mask = []

    if self.transforms:
        img = self.transforms(img)
        if mask != []:
            mask = transforms.ToTensor()(mask)

    return {'img': img, 'mask': mask}

и этополный журнал ошибок. Любое предложение?

------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-d3dc126e6038> in <module>()
      6         optimizer.zero_grad()
      7         output = unet(batch['img'].cuda())
----> 8         loss = criterion(output, batch['mask'])
      9         loss.backward()
     10         optimizer.step()

~\Anaconda3\lib\site-packages\torch\nn\modules\module.py in __call__(self, 
*input, **kwargs)
    475             result = self._slow_forward(*input, **kwargs)
    476         else:
--> 477             result = self.forward(*input, **kwargs)
    478         for hook in self._forward_hooks.values():
    479             hook_result = hook(self, input, result)

~\Anaconda3\lib\site-packages\torch\nn\modules\loss.py in forward(self, 
input, target)
    571                                                   self.weight,
    572                                                   
pos_weight=self.pos_weight,
--> 573                                                   
reduction=self.reduction)
    574 
    575 

~\Anaconda3\lib\site-packages\torch\nn\functional.py in 
binary_cross_entropy_with_logits(input, target, weight, size_average, 
reduce, reduction, pos_weight)
   1644         reduction = _Reduction.legacy_get_string(size_average, reduce)
   1645     if not (target.size() == input.size()):
-> 1646         raise ValueError("Target size ({}) must be the same as input 
size ({})".format(target.size(), input.size()))
   1647 
   1648     max_val = (-input).clamp(min=0)

ValueError: Target size (torch.Size([4, 256, 1, 320])) must be the same as 
input size (torch.Size([4, 1, 256, 320]))

update: вот как работает изменение формы, и все выглядит хорошо.Просто не понимаю, почему я получил такую ​​ошибку.

mask = np.array(Image.open('data/train_mask/1.png'))
mask = np.resize(mask, (320, 240))
mask = np.reshape(mask, mask.shape + (1,))
img = np.array(Image.open('data/train/1.jpg'))
print(np.shape(mask), np.shape(img))

(320, 240, 1) (320, 240, 3)

1 Ответ

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

Проблема здесь заключается в несоответствии между тензорными измерениями цели и ввода.Pytorch ожидает, что размеры будут в виде

NCHW

N - Размер партии

C - Количество каналов

H -- Высота тензора / матрицы

W - Ширина тензора / матрицы

Для устранения этой проблемы

Заменить

loss = criterion(output, batch['mask'])

С этим

targets = torch.reshape(batch['mask'], (4, 1, 256, 320))
loss = criterion(output, targets)
...