Tensorflow集线器:从Resnet50的最顶层卷积层提取特征

时间:2019-06-23 11:46:27

标签: python tensorflow deep-learning resnet tensorflow-hub

我正在使用Tensorflow Hub从图像中提取特征。即,我正在使用模块hub.Module("https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3")

因为我想从最后一个卷积层中提取特征,所以我有点困惑,应该从Resnet50中使用哪个字典输出。例如:

image = ...
embedding_module = hub.Module("https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3")
output = embedding_module(image, signature="image_feature_vector",
                          as_dict=True)

现在,如果我们从该词典中打印出键,则有3种不同的键,我不知道它们之间的区别。

  • resnet_v2_50/block4/unit_3/bottleneck_v2
  • resnet_v2_50/block4/unit_3/bottleneck_v2/conv3
  • resnet_v2_50/block4

我感到困惑的是,它们所有的输出都具有相同的形状(7, 7, 2048),但是resnet_v2_50/block4/unit_3/bottleneck_v2resnet_v2_50/block4的值不同于resnet_v2_50/block4/unit_3/bottleneck_v2/conv3。有人可以指出我应该从Resnet50的最后一个卷积层中使用哪个键进行特征提取,以及我列出的每个键之间的区别是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

在 Tensorflow2 中,我们可以这样做。 如需更多文档:link

from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocessing.image import load_img

# as per updated docs
model = hub.KerasLayer("https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/5")

imagePath = "......."
image = load_img(imagePath, target_size=(224, 224))
image = img_to_array(image)
image = np.expand_dims(image, axis=0)

embeddings = model(image)

答案 1 :(得分:0)

根据the official manual,我们可以直接使用module(xxx)获得结果。

对我来说很好

module = hub.Module("https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3")
features = module(images) 

实际上,我也在尝试找出如何通过name来获得正确的最后一层,而不是一些缺乏灵活性的预先提供的API。