Keras VGG 提取特征

Posted

技术标签:

【中文标题】Keras VGG 提取特征【英文标题】:Keras VGG extract features 【发布时间】:2016-12-05 01:52:52 【问题描述】:

我已经加载了一个预训练的 VGG 人脸 CNN 并成功运行它。我想从第 3 层和第 8 层中提取超列平均值。我正在关注关于从here 中提取超列的部分。但是,由于 get_output 函数不起作用,我不得不进行一些更改:

进口:

import matplotlib.pyplot as plt
import theano
from scipy import misc
import scipy as sp
from PIL import Image
import PIL.ImageOps
from keras.models import Sequential
from keras.layers.core import Flatten, Dense, Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD
import numpy as np
from keras import backend as K

主要功能:

#after necessary processing of input to get im
layers_extract = [3, 8]
hc = extract_hypercolumn(model, layers_extract, im)
ave = np.average(hc.transpose(1, 2, 0), axis=2)
print(ave.shape)
plt.imshow(ave)
plt.show()

获取特征函数:(我关注了this)

def get_features(model, layer, X_batch):
    get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layers[layer].output,])
    features = get_features([X_batch,0])
    return features

超列提取:

def extract_hypercolumn(model, layer_indexes, instance):
    layers = [K.function([model.layers[0].input],[model.layers[li].output])([instance])[0] for li in layer_indexes]
    feature_maps = get_features(model,layers,instance)
    hypercolumns = []
    for convmap in feature_maps:
        for fmap in convmap[0]:
            upscaled = sp.misc.imresize(fmap, size=(224, 224),mode="F", interp='bilinear')
            hypercolumns.append(upscaled)
    return np.asarray(hypercolumns)

但是,当我运行代码时,我收到以下错误:

get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layers[layer].output,])
TypeError: list indices must be integers, not list

我该如何解决这个问题?

注意:

在超列提取函数中,当我使用feature_maps = get_features(model,1,instance) 或任何整数代替1 时,它工作正常。但我想从第 3 层到第 8 层提取平均值。

【问题讨论】:

【参考方案1】:

这让我很困惑:

    layers = [K.function([model.layers[0].input],[model.layers[li].output])([instance])[0] for li in layer_indexes] 之后,layers 是提取特征的列表。 然后您将该列表发送至feature_maps = get_features(model,layers,instance)def get_features(model, layer, X_batch):中的第二个参数,即layer,用于索引model.layers[layer].output

你想要的是:

    feature_maps = get_features(model,layer_indexes,instance):传递层索引而不是提取的特征。 get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layers[l].output for l in layer]): 列表不能用于索引列表。

不过,你的特征抽象函数写得很糟糕。我建议你重写所有东西而不是混合代码。

【讨论】:

【参考方案2】:

我为单通道输入图像 (W x H x 1) 重写了您的函数。也许会有所帮助。

def extract_hypercolumn(model, layer_indexes, instance):
    test_image = instance
    outputs    = [layer.output for layer in model.layers]          # all layer outputs
    comp_graph = [K.function([model.input]+ [K.learning_phase()], [output]) for output in outputs]  # evaluation functions

    feature_maps = []
    for layerIdx in layer_indexes:
        feature_maps.append(layer_outputs_list[layerIdx][0][0])


    hypercolumns = []
    for idx, convmap in enumerate(feature_maps):
        #        vv = np.asarray(convmap)
        #        print(vv.shape)
        vv = np.asarray(convmap)
        print('shape of feature map at layer ', layer_indexes[idx], ' is: ', vv.shape)

        for i in range(vv.shape[-1]):
            fmap = vv[:,:,i]
            upscaled = sp.misc.imresize(fmap, size=(img_width, img_height),
                                    mode="F", interp='bilinear')
            hypercolumns.append(upscaled)  

    # hypc = np.asarray(hypercolumns)
    # print('shape of hypercolumns ', hypc.shape)

    return np.asarray(hypercolumns)

【讨论】:

以上是关于Keras VGG 提取特征的主要内容,如果未能解决你的问题,请参考以下文章

如何取出预训练的 keras 模型的中间层

VGG16 Keras微调:精度低

如何测量预训练模型(例如 vgg、resnet...)提取的图像特征之间的语义相似度?

使用 VGG 16 作为特征提取器的 U-net 类架构 - 连接层的问题

基于VGG19神经网络的提取特征 进行 可见光与红外光的 图像融合 基于pytorch 实现。。。

Keras 中的特征提取