I have a pretrained resnet152 model. It outputs 2048 dimensional feature vector. The code is given below.
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from torch.autograd import Variable
from PIL import Image
# Load the pretrained model
model = models.resnet152(pretrained=True)
# Use the model object to select the desired layer
layer = model._modules.get('avgpool')
# Set model to evaluation mode
model.eval()
# Image transforms
scaler = transforms.Scale((224, 224))
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
to_tensor = transforms.ToTensor()
def get_vector(image_name):
# 1. Load the image with Pillow library
img = Image.open(image_name)
# 2. Create a PyTorch Variable with the transformed image
t_img = Variable(normalize(to_tensor(scaler(img))).unsqueeze(0))
# 3. Create a vector of zeros that will hold our feature vector
# The 'avgpool' layer has an output size of 2048
my_embedding = torch.zeros(2048)
# 4. Define a function that will copy the output of a layer
def copy_data(m, i, o):
my_embedding.copy_(o.data.reshape(o.data.size(1)))
# 5. Attach that function to our selected layer
h = layer.register_forward_hook(copy_data)
# 6. Run the model on our transformed image
model(t_img)
print(model)
# 7. Detach our copy function from the layer
h.remove()
# 8. Return the feature vector
return my_embedding.numpy()
a=get_vector('/content/drive/MyDrive/images/COCO_val2014_000000000042.jpg')
print(a)
print(a.size)
I want 2048 dimensional feature vector that is returned by ResNet to be passed through a fully connected layer and reduce it to a 64 dimensional vector. How can I do that?