Keras VGG提取特征

7
我已加载了一个预训练的VGG面部CNN并成功运行。我想从第3层和第8层提取超级列平均值。我正在遵循关于从这里提取超级列的部分。但是,由于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()

获取特征函数:(我遵循这个链接

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层提取平均值。

2个回答

1

这让我很困惑:

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

你想要的是:

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

尽管如此,您的特征提取函数编写得非常糟糕。建议您重新编写代码,而不是混合使用代码。


1

我重写了你的函数,适用于单通道输入图像(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接