Я хочу получить вектор признаков из изображения, передавая изображение через предварительно обученный VGG-16. Я использовал предварительно обученный Resnet50, чтобы получить вектор признаков, и это сработало отлично. Но когда я использую тот же метод для получения вектора характеристик из сети VGG-16, я не получаю вектор 4096-й, который, как я предполагаю, должен получить. Я получил код из различных источников, и он выглядит следующим образом:
vgg16_model=models.vgg16(pretrained=True)
modules=list(vgg16_model.children())[:-1]
vgg16_model=nn.Sequential(*modules)
data=moveaxis(data,2,0)
img_var=Variable(torch.from_numpy(data).unsqueeze(0)).float()
features_var=vgg16_model(img_var)
features=features_var.data
features=features.data.numpy()
print(features.shape)
Переменная “data”
представляет собой изображение numpy массив измерений (300, 400, 3)
Поэтому я использую ось перемещения, чтобы перемешать ось, чтобы у меня было 3 канала, а не 300. Вывод (features.shape
), который я получаю: (1, 512, 7, 7)
Я хочу вектор 4096-й, который VGG-16 дает перед слоем softmax. Я даже попробовал подход list(vgg16_model.classifier.children())[:-1]
, но это тоже не слишком хорошо. Есть много дискуссий по этому поводу, но ни один из них не работал для меня. Дайте мне знать, где я могу пойти не так. Спасибо!