Я действительно новичок в 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])
.
Пожалуйста, кто-нибудь может мне помочь с этим, я боролся в течение многих дней.