Особенности экстракта Keras VGG

Я загрузил предварительно обученное лицо 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. После 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 для l в слое]): list нельзя использовать для индексации списка.

Тем не менее, ваша функция абстрагирования от функции написана ужасно. Я предлагаю вам переписать все, а не смешивать коды.

Я переписал вашу функцию для одноканального входного изображения (Ш х В х 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)
Другие вопросы по тегам