2016-07-30 12 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 

私はこの問題を解決するにはどうすればよいですか?

注:ハイパー列抽出機能で

、私は1の代わりにfeature_maps = get_features(model,1,instance)または任意の整数を使用する場合、それが正常に動作します。しかし、私はそれは私に多くのことを混同8

答えて

1

に層3からの平均値を抽出したい:

  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という2番目のパラメータが、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]。レイヤー内lの出力]):リストをインデックスリストに使用することはできません。

まだ、あなたの機能抽象化機能はひどく書かれています。私はコードを混ぜるのではなく、すべてを書き直すことをお勧めします。

0

私はあなたの関数を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) 
関連する問題