PyTorch RuntimeError: размер тензора a (416) должен соответствовать размеру тензора b (208) при не синглтонном измерении 3 - PullRequest
0 голосов
/ 06 апреля 2020

Я действительно новичок в Pytorch. Я разработал учебный пакет для оценки плотности. Я создал базовый класс с именем «Model», наследующий от nn.Module, и для каждой модели CNN, которую я хочу реализовать, я расширяю базовый класс и просто переопределяю метод net buid (создайте архитектуру CNN). Я уже управлял поездом с моделью MCNN, теперь я использую модель CSR. Когда дело доходит до подсчета потерь loss=train_params.criterion(est_dmap,gt_dmap), возникает ошибка ниже:

          File "ML_package/process/main.py", line 213, in <module>
            epochs_list,train_loss_list,test_error_list,min_epoch,min_MAE,train_time=model.train_model(merged_train_dataset,merged_test_dataset,train_params,resume=True)
          File "/content/drive/My Drive/pfe-documentations/ML_package/models/model.py", line 90, in train_model
            loss=train_params.criterion(est_dmap,gt_dmap)
          File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/module.py", line 532, in __call__
            result = self.forward(*input, **kwargs)
          File "/usr/local/lib/python3.6/dist-packages/torch/nn/modules/loss.py", line 431, in forward
            return F.mse_loss(input, target, reduction=self.reduction)
          File "/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py", line 2215, in mse_loss
            expanded_input, expanded_target = torch.broadcast_tensors(input, target)
          File "/usr/local/lib/python3.6/dist-packages/torch/functional.py", line 52, in broadcast_tensors
            return torch._C._VariableFunctions.broadcast_tensors(tensors)
        RuntimeError: The size of tensor a (512) must match the size of tensor b (256) at non-singleton dimension 3 

Я уже видел несколько тем об этой ошибке, но ни одна из них не работала для меня. Код модели класса base следующий:

class Model(nn.Module):
   def train_model(self,train_dataloader,test_dataloader,train_params:TrainParams,resume=False):

        self.params=train_params
        /* Initialize variables and parameters*/   

        start=time.time()        

            # Start Train
        for epoch in range(start_epoch,train_params.maxEpochs):
                # Set the Model on training mode
            self.train()
            epoch_loss=0

            for i,(img,gt_dmap) in enumerate(train_dataloader):
                img=img.to(device)
                gt_dmap=gt_dmap.to(device)
                    # forward propagation
                est_dmap=self(img)

                    # calculate loss
                loss=train_params.criterion(est_dmap,gt_dmap)
                epoch_loss+=loss.item()

                self.optimizer.zero_grad()
                    # Backpropagation
                loss.backward()
                self.optimizer.step()
                del img,gt_dmap,est_dmap
            print("\t epoch:"+str(epoch)+"\n","\t loss:",epoch_loss/len(train_dataloader))




                # Set the Model on validation mode
            self.eval()
            MAE=0
            MSE=0
            for i,(img,gt_dmap) in enumerate(test_dataloader):
                img=img.to(device)
                gt_dmap=gt_dmap.to(device)
                    # forward propagation
                est_dmap=self(img)
                MAE+=abs(est_dmap.data.sum()-gt_dmap.data.sum()).item()
                MSE+=np.math.pow(est_dmap.data.sum()-gt_dmap.data.sum(),2)
                del img,gt_dmap,est_dmap
            MAE=MAE/len(test_dataloader)  
            MSE=np.math.sqrt(MSE/len(test_dataloader))

            if MAE<self.min_MAE:
                self.min_MAE=MAE
                self.min_epoch=epoch
            test_error_list.append(MAE)


модель, которую я реализую, имеет фронтенд, beckend и выходные слои. Метод forward () передает изображение на эти 3 соответственно. Архитектура: Внешний интерфейс: модуль VGG16. Бэкэнд: [512, 512, 512,256,128,64] (где числа относятся к out_channels, in_channel = 512 для каждого и дилатация = 2) Output_layer = Conv2d (64, 1, kernel_size = 1).

Критерий MSELoss функция.

ОБНОВЛЕНИЕ : соответствующие размеры для gt_dmap и est_dmap: gt torch.Size([1, 1, 158, 247]) est torch.Size([1, 1, 316, 494]).

Пожалуйста, кто-нибудь может мне помочь с этим, я боролся в течение многих дней.

...