如何在 pytorch 中获取预训练 VGG16 的特定层输出

How to get a particular layer output of a pretrained VGG16 in pytorch

我是 pytorch 的新手,我正在尝试获取 1*4096 格式的预训练模型 VGG16 特征向量的输出,该格式由最后一层之前的层返回。我发现 keras 中有类似的功能。 pytorch 中是否有相同的直接命令?

我使用的代码:

import torch
from torch import nn
from torch import optim
import torch.nn.functional as F
from torchvision import models
from torch.autograd import Variable
from PIL import Image

image1 = Image.open(r"C:\Users\user\Pictures\user.png")

model = models.vgg16(pretrained=True)

scaler = transforms.Resize((224, 224))
to_tensor = transforms.ToTensor()

img = to_tensor(scaler(image1)).unsqueeze(0)

model(img).shape
model(img)

负责创建 features 的部分网络被命名为... features(不仅在 VGG 中,torchvision 中的大多数预训练网络也是如此)。

只需使用此字段并像这样传递您的图像:

import torch

import torchvision

image = Image.open(r"C:\Users\user\Pictures\user.png")

# Get features part of the network
model = models.vgg16(pretrained=True).features
tensor = transforms.ToTensor()(transforms.Resize((224, 224))(image)).unsqueeze(dim=0)

model(tensor)

编辑:

要查看任何 torchvision 模型内部发生的情况,您可以查看其源代码。对于 VGG(任何),在 this file.

的顶部有一个基础 class

要获得 4096 扁平化特征,您可以进行类似于 forward:

中定义的操作
# Tensor from previous code snippet for brevity

x = model.avgpool(tensor)
x = torch.flatten(x, 1)
final_x = model.classifier[0](x) # only first classifier layer

您还可以遍历 moduleschildren 直到您想要的任何位置并输出结果(或结果或任何您想要的)