如何使用 pytorch 的 resnet50 模型输出一个 2048 纬度的向量?

我让 chatGPT 为了生成了一段代码

图片.png

代码如下:

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image

# 加载 ResNet50 模型并设置为评估模式
resnet50 = models.resnet50(pretrained=True)
resnet50.eval()

# 定义图片预处理方法
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载图片并进行预处理
img = Image.open('/Users/ponponon/Desktop/code/me/image2vector/resources/images/wallhaven-l8896l.png')
img_tensor = transform(img).unsqueeze(0) # 增加一个 batch 维度

# 使用 ResNet50 模型进行特征提取
with torch.no_grad():
    features = resnet50(img_tensor)

# 打印特征向量的形状
print(features.shape) # 输出 (1, 2048)

但是我发现了一个问题,这个代码运行输出来的向量纬度是 1000,而不是 2048,我需要这么才能获取 2048 纬度的向量呢?

阅读 4.5k
1 个回答

问题已解决,pytorch 里面的 resnet50 默认输出纬度是 1000

因为最后的全连接层是这样定义的:Linear(in_features=2048, out_features=1000, bias=True)

PyTorch 的 ResNet50 模型的默认输出维度为 1000。这是因为预训练的 ResNet50 模型是在 ImageNet 数据集上训练的,ImageNet 数据集包含1000个类别,因此模型的最后一层是一个全连接层,输出维度为1000。如果需要获得不同的输出维度,可以将全连接层替换为一个新的全连接层,输出维度与需要的维度相匹配。

要修改成输出为 2048 的,需要自己加一行代码

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import torch.nn as nn

# 加载 ResNet50 模型并设置为评估模式
resnet50 = models.resnet50(pretrained=True)
resnet50.fc = nn.Linear(2048, 2048)
resnet50.eval()

# 定义图片预处理方法
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载图片并进行预处理
img = Image.open('/Users/ponponon/Desktop/code/me/image2vector/resources/images/wallhaven-l8896l.png')
img_tensor = transform(img).unsqueeze(0) # 增加一个 batch 维度

# 使用 ResNet50 模型进行特征提取
import time

started_at=time.time()

for i in range(1):
    with torch.no_grad():
        features = resnet50(img_tensor)
        
ended_at=time.time()

print(ended_at-started_at)

# 打印特征向量的形状
print(features.shape) # 输出 (1, 2048)


但是这样有一个坏处,会让结果变随机:https://github.com/pytorch/vision/issues/7937

因为 fc 层也是有权重参数的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏