Pytorch: Building 3D Dense Network 遇到错误 Adaptive_avg_pool3d: output_size must be 3

Posted

技术标签:

【中文标题】Pytorch: Building 3D Dense Network 遇到错误 Adaptive_avg_pool3d: output_size must be 3【英文标题】:Pytorch: Building 3D Dense Network run into error adaptive_avg_pool3d: output_size must be 3 【发布时间】:2021-11-15 15:23:01 【问题描述】:

我在尝试训练我的 3D 密集网络时遇到了这样的错误。在卷积块的末尾有一个平均池化层。从下面的消息中可以看出,我的代码 out = F.adaptive_avg_pool3d(input=out, output_size=[1,1,1]) 没有给出正确大小的输出。

我尝试过使用output_size=1output_size=(1,1,1) 并尝试使用层F.avg_pool,但都遇到了这样的错误。这很奇怪,因为我的输出确实有正确的大小。

附:我已将torch.nn.functional 导入为F


---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

/tmp/ipykernel_37419/694291867.py in <module>
     11 trainer = Trainer(model, device, optimizer, loss_fn)
     12 
---> 13 trainer.fit(N_EPOCHS, train_dataloader, val_dataloader, "4C", N_EPOCHS / 3, )
     14 
     15 trainer.display_plots("4C")

/tmp/ipykernel_37419/579275755.py in fit(self, epochs, train_dataloader, valid_dataloader, mrimodule, patience)
     26             self.info_message("EPOCH: ", n_epoch)
     27 
---> 28             train_loss, train_auc, train_time = self.train_epoch(train_dataloader)
     29             valid_loss, valid_auc, valid_time = self.valid_epoch(valid_dataloader)
     30 

/tmp/ipykernel_37419/579275755.py in train_epoch(self, train_dataloader)
     71             Y = Y.to(self.device)
     72             self.optimizer.zero_grad()
---> 73             pred = self.model(X).squeeze(1)
     74             loss = self.loss_fn(pred, Y)
     75 

~/miniconda3/envs/MGMT_Classify/lib/python3.7/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

~/MGMT_Classify_Scripts/DenseNet3D.py in forward(self, x)
    216         features = self.features(x)
    217         out = F.relu(features, inplace=True)
--> 218         out = F.adaptive_avg_pool3d(input=out, output_size=[1,1,1])
    219         out = torch.flatten(out, 1)
    220         out = self.classifier(out)

~/miniconda3/envs/MGMT_Classify/lib/python3.7/site-packages/torch/nn/functional.py in adaptive_avg_pool3d(input, output_size)
    954                 adaptive_avg_pool3d, (input,), input, output_size)
    955     _output_size = _list_with_default(output_size, input.size())
--> 956     return torch._C._nn.adaptive_avg_pool3d(input, _output_size)
    957 
    958 

RuntimeError: adaptive_avg_pool3d: output_size must be 3

【问题讨论】:

你的输入形状是什么? @Ivan 你好,我的输入是32*2*8*8,也就是(通道,Z,X,Y)。我刚刚将torchvision.model.densenet 中的Densenet121 更改为3D。我已经通过使用这样的代码解决了这个错误:out = F.adaptive_avg_pool3d(input=out, output_size=(1, 1, 1)).view(features.size(0), -1) 代替第 218、219 行中的原始代码(可以在主帖的错误消息中看到。虽然现在已经解决了,但我很好奇是什么到底会导致这个错误以及为什么可以这样解决。 【参考方案1】:

通过将我的脚本与 GitHub 上的其他 3D 密集网络模型进行比较,我至少找到了一个临时解决方案。

我使用了代码:

out = F.adaptive_avg_pool3d(input=out, output_size=(1, 1, 1)).view(features.size(0), -1)

代替以下内容,来自原始脚本:

out = F.adaptive_avg_pool3d(input=out, output_size=[1,1,1])
out = torch.flatten(out, 1)

之后,它就可以工作了。我现在还没有在我的任务上尝试过它,但我已经确认它可以过拟合非常小的测试数据集。

我仍然很好奇到底是什么导致了错误以及为什么可以以这种方式修复它。如果您有见解,请在 cmets 中提供。否则,这为需要它的其他人提供了一种解决方法。

【讨论】:

以上是关于Pytorch: Building 3D Dense Network 遇到错误 Adaptive_avg_pool3d: output_size must be 3的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch实现DenseNet

pytorch和sklearn哪个运行快

Building Robust and Flexible Event System in Unity3D

PyTorch生成3D模型

安装pytorch3d最简单方法

PyTorch生成3D模型