Вы были в шаге от того, что хотели.
Перво-наперво - вы всегда должны проверять исходный код модуля (который находится здесь для 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])