现在,我想提取图像的特征来计算它们的相似性。我们可以使用TensorFlow中的预训练VGG19模型轻松获取特征。但是,VGG19模型有很多层,我不知道应该使用哪一层来获取特征。哪一层的输出适合这个问题呢?
# 我认为这是提取特征的正确方法
model = tf.keras.application.VGG19(include_top=True, weight='imagenet')
input = model.input
output = model.layers[-2].output
extract_model = tf.keras.Model(input, output)
我的推测是,越接近最后的输出,模型输出的特征就越强大。但有些教程说“使用include_top=False
来提取特征”(例如TensorFlow的图像标注与注意力)
所以,我不知道应该使用哪一层。请在这个线程中帮助我。
回答:
使用include_top=False
可能是由于最后三层(对于该特定模型)是全连接层,这些层通常不是很好的特征向量。如果模型直接输出特征向量,那么你就不需要这些层。
大多数人使用最后一层进行迁移学习,但这可能取决于你的应用。例如,Gatys等人表明,VGG的前几层对图像的风格敏感,而后面的层对内容敏感。
我可能会在超参数搜索中尝试所有这些层,看看哪个表现最佳。如果你说的图像相似性是指图像中包含的对象的相似性,我可能会从最后一层开始尝试。