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=1
、output_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的主要内容,如果未能解决你的问题,请参考以下文章