2016-07-30 78 views
7

我已經加載了一個預先訓練好的VGG臉CNN,並已成功運行它。我想從第3層和第8層提取超列平均值。我正在關注從here提取超列的部分。然而,由於get_output功能不工作,我不得不做出一些改變:Keras VGG提取功能

進口:

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 

我該如何解決這個問題?

注:

在Hyper-柱提取功能,當我代替1使用feature_maps = get_features(model,1,instance)或任意整數,它工作正常。但是我想從3層的平均提取到8

回答

1

它混淆了我很多:

  1. layers = [K.function([model.layers[0].input],[model.layers[li].output])([instance])[0] for li in layer_indexes]後,層是提取的特徵的列表。
  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]):列表不能用於索引列表。

儘管如此,您的功能抽象功能是可怕的寫入。我建議你改寫一切,而不是混合代碼。

0

我重寫了單通道輸入圖像(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)