Re sNet -101 FeatureMap shape - PullRequest
       80

Re sNet -101 FeatureMap shape

0 голосов
/ 20 апреля 2020

Я действительно новичок в CNN и у меня много проблем с его изучением.

Я пытаюсь извлечь карту возможностей CNN, используя Re sNet -101, и я хочу получить форму 2048, 14 * 14. Чтобы получить карту объектов, я удалил последний слой модели Re sNet -101 и настроил Adaptive Average Pool. Итак, я получил torch.Size([1, 2048, 1, 1]) форму вывода.

Но я хочу получить torch.Size([1, 2048, 14, 14]), а не torch.Size([1, 2048, 1, 1]).

Кто-нибудь может помочь мне получить результат? Thx.

#load resnet101 model and remove the last layer
model = torch.hub.load('pytorch/vision:v0.5.0', 'resnet101', pretrained=True)
model = torch.nn.Sequential(*(list(model.children())[:-1]))


#extract feature map from an image and print the size of the feature map
from PIL import Image
import matplotlib.pylab as plt
from torchvision import transforms

filename = 'KM_0000000009.jpg'
input_image = Image.open(filename)

preprocess = transforms.Compose([
    transforms.Resize((244,244)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

input_tensor = preprocess(input_image)

input_tensor = input_tensor.unsqueeze(0) # create a mini-batch as expected by the model

with torch.no_grad():
    output = model(input_tensor)

print(output.size()) #torch.Size([1, 2048, 1, 1])

1 Ответ

1 голос
/ 20 апреля 2020

Вы были в шаге от того, что хотели.

Перво-наперво - вы всегда должны проверять исходный код модуля (который находится здесь для Re sNet). Он может иметь некоторые функциональные операции (например, из модуля torch.nn.functional), поэтому он не может быть перенесен непосредственно в torch.nn.Seqential, к счастью, это происходит в случае ResNet101.

Во-вторых, карты функций зависят от размера ввода для стандартного размера изображения, подобного Imag eNet ([3, 224, 224], обратите внимание, что размер вашего изображения отличается) нет слоя с формой [2048, 14, 14], но [2048, 7, 7] или [1024, 14, 14]).

В-третьих нет необходимости использовать torch.hub для ResNet101 , так как он все равно использует torchvision моделей под капотом.

С учетом всего этого:

import torch
import torchvision

# load resnet101 model and remove the last layer
model = torchvision.models.resnet101()
model = torch.nn.Sequential(*(list(model.children())[:-3]))

# image-like
image = torch.randn(1, 3, 224, 224)

with torch.no_grad():
    output = model(image)

print(output.size())  # torch.Size([1, 1024, 14, 14])

Если вы хотите [2048, 7, 7], используйте [:-2] вместо [:-3]. Кроме того, ниже вы можете заметить, как размер карты объектов изменяется в зависимости от формы изображения:

model = torch.nn.Sequential(*(list(model.children())[:-2]))  
# Image twice as big -> twice as big height and width of features!
image = torch.randn(1, 3, 448, 448)

with torch.no_grad():
    output = model(image)

print(output.size())  # torch.Size([1, 2048, 14, 14])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...