首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras VGG提取特征

Keras VGG提取特征
EN

Stack Overflow用户
提问于 2016-07-30 20:54:12
回答 2查看 2.6K关注 0票数 7

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

导入:

代码语言:javascript
复制
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

主要功能:

代码语言:javascript
复制
#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)

代码语言:javascript
复制
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

超列提取:

代码语言:javascript
复制
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)

然而,当我运行代码时,我得到了以下错误:

代码语言:javascript
复制
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层的平均值。

EN

回答 2

Stack Overflow用户

发布于 2016-08-04 14:54:36

这让我很困惑:

  1. 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).

  1. In def get_features(model, layer, X_batch):,它们的第二个参数,即layer,用于在layers中建立索引

你想要的是:

传递图层索引而不是为layer]):list中的l提取features.

  • get_features = K.function([model.layers[0].input, K.learning_phase()], [model.layersl.output的列表不能用于索引列表。

尽管如此,你的特征抽象函数还是写得很糟糕。我建议你重写所有代码,而不是混合代码。

票数 1
EN

Stack Overflow用户

发布于 2017-07-27 06:47:08

我为单通道输入图像(宽x高x 1)重写了你的函数。也许这会对你有所帮助。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38674189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档