【问题标题】:how to extract feature from convolution layers in siamese network?如何从连体网络的卷积层中提取特征?
【发布时间】:2020-03-02 15:29:28
【问题描述】:

我正在尝试从经过训练的连体网络中提取特征,但我遇到了一个问题,因为它需要两个输入图像并且输出是一个距离向量。

from Keras import backend as K

outputs = [layer.get_output_at(-1) for layer in model.layers]          # all layer outputs
functor = K.function([img_a, img_b]+ [K.learning_phase()], [feat_vecs_a, feat_vecs_b])
# Testing
test = np.random.random(input_dim)[np.newaxis,...]
layer_outs = functor([im1, im2])
layer_outs

我只得到距离值,无法弄清楚如何从最终卷积层中提取特征。

【问题讨论】:

    标签: keras conv-neural-network tensor siamese-network


    【解决方案1】:

    获取序列模型并从中进行预测。

    output_features = original_sequential_model.predict(input_images_as_numpy)
    

    如果你想要“每个”层的输出,那么就做你正在做的事情,但是使用顺序模型:

    outputs = [layer.output for layer in original_sequential_model.layers]
    extractor = Model(original_sequential_model.input, outputs)
    
    output_features = extractor.predict(input_images_as_numpy)
    

    如果没有原序列模型,在连体网:

    original_sequential_model = model.get_layer("sequential_1") 
        #or the name that appears in the summary.    
    

    【讨论】:

    • 你建议的 3 个解决方案对我没有帮助,我面临这个问题,第一个当我执行 model.predict 时,我得到唯一的一个值,即两个图像之间的欧几里得距离,我需要想要使用训练好的模型提取特征。当我编写 layer.output 时,我面临以下错误。 | AttributeError: Layersequential_1 有多个入站节点,因此“层输出”的概念定义不明确。请改用get_output_at(node_index)。我的模型接受两个输入图像,所以我无法设置 layer_name。
    • 我能够修复它,请检查! base_model = model.get_layer('input_2') input = Input(shape=input_dim) x = base_model(input) model_custom = Model(input, x) im2 = np.expand_dims(x_test[0, 1], axis=0) pred1 = model_custom.predict(im2) 但是我还有一个问题,如何在注册样本图像集的同时将特征保存在 128d 中?
    最近更新 更多