使用 Pytorch 的 *list、.children() 和 nn.sequential 创建的模型会产生不同的输出张量
Model Created With Pytorch's *list, .children(), and nn.sequential Produces Different Output Tensors
我目前正在尝试在我的模型中使用预训练的 DenseNet。我正在学习本教程:https://pytorch.org/hub/pytorch_vision_densenet/,它运行良好,输入 [1,3,244,244],它 returns 一个 [1,1000] 张量,完全符合预期。
然而,目前我正在使用这段代码将预训练的 Densenet 加载到我的模型中,并将其用作“特征提取”模型。这是初始化函数中的代码
base_model = torch.hub.load('pytorch/vision:v0.10.0', 'densenet121', pretrained=True)
self.base_model = nn.Sequential(*list(base_model.children())[:-1])
并且正向函数中是这样使用的
x = self.base_model(x)
然而,这采用相同的输入,returns 大小为:([1, 1024, 7, 7]) 的张量。我无法弄清楚什么不起作用,我认为这是由于 DenseNet 将所有层连接在一起,但我不知道如何让它以相同的方法工作。有关如何在我自己的模型中使用预训练 DenseNet 的任何提示?
通常 nn.Modules
在 forward
定义中包含逻辑,这意味着仅将模型转换为顺序块将无法访问它。最值得注意的是,您通常会发现在 CNN 和网络的分类器层之间发生了下采样 and/or 扁平化。这是 DenseNet 的。
如果您查看 Torchvision 的 DenseNet 前向实现 here,您将看到:
def forward(self, x: Tensor) -> Tensor:
features = self.features(x)
out = F.relu(features, inplace=True)
out = F.adaptive_avg_pool2d(out, (1, 1))
out = torch.flatten(out, 1)
out = self.classifier(out)
return out
您可以看到 CNN self.features
输出的张量(形状 (*, 1024, 7, 7)
)如何通过 ReLU、自适应平均池处理,并在馈送到分类器(最后一层)之前展平).
我目前正在尝试在我的模型中使用预训练的 DenseNet。我正在学习本教程:https://pytorch.org/hub/pytorch_vision_densenet/,它运行良好,输入 [1,3,244,244],它 returns 一个 [1,1000] 张量,完全符合预期。 然而,目前我正在使用这段代码将预训练的 Densenet 加载到我的模型中,并将其用作“特征提取”模型。这是初始化函数中的代码
base_model = torch.hub.load('pytorch/vision:v0.10.0', 'densenet121', pretrained=True)
self.base_model = nn.Sequential(*list(base_model.children())[:-1])
并且正向函数中是这样使用的
x = self.base_model(x)
然而,这采用相同的输入,returns 大小为:([1, 1024, 7, 7]) 的张量。我无法弄清楚什么不起作用,我认为这是由于 DenseNet 将所有层连接在一起,但我不知道如何让它以相同的方法工作。有关如何在我自己的模型中使用预训练 DenseNet 的任何提示?
通常 nn.Modules
在 forward
定义中包含逻辑,这意味着仅将模型转换为顺序块将无法访问它。最值得注意的是,您通常会发现在 CNN 和网络的分类器层之间发生了下采样 and/or 扁平化。这是 DenseNet 的。
如果您查看 Torchvision 的 DenseNet 前向实现 here,您将看到:
def forward(self, x: Tensor) -> Tensor:
features = self.features(x)
out = F.relu(features, inplace=True)
out = F.adaptive_avg_pool2d(out, (1, 1))
out = torch.flatten(out, 1)
out = self.classifier(out)
return out
您可以看到 CNN self.features
输出的张量(形状 (*, 1024, 7, 7)
)如何通过 ReLU、自适应平均池处理,并在馈送到分类器(最后一层)之前展平).