как извлечь функцию из слоев свертки в сиамской сети?

введите описание изображения здесьЯ пытаюсь извлечь функции из обученной сиамской сети, но столкнулся с проблемой, так как она ожидает два входных изображения, а выход представляет собой вектор расстояния.

from Keras import backend as K

outputs = [layer.get_output_at(-1) for layer in model.layers]          # all layer outputs
functor = K.function([img_a, img_b]+ [K.learning_phase()], [feat_vecs_a, feat_vecs_b])
# Testing
test = np.random.random(input_dim)[np.newaxis,...]
layer_outs = functor([im1, im2])
layer_outs

Я получаю только значение расстояния и не могу понять, как извлечь функции из окончательного слоя свертки.


person Balaji    schedule 02.03.2020    source источник


Ответы (1)


Получите последовательную модель и предскажите на ее основе.

output_features = original_sequential_model.predict(input_images_as_numpy)

Если вам нужны выходные данные «каждого» слоя, делайте то, что делаете, но с последовательной моделью:

outputs = [layer.output for layer in original_sequential_model.layers]
extractor = Model(original_sequential_model.input, outputs)

output_features = extractor.predict(input_images_as_numpy)

Если у вас нет оригинальной последовательной модели, она есть в сиамской сети:

original_sequential_model = model.get_layer("sequential_1") 
    #or the name that appears in the summary.    
person Daniel Möller    schedule 02.03.2020
comment
3 решения, которые вы предложили, не помогают мне, я сталкиваюсь с проблемой: первое, когда я выполняю model.predict, я получаю единственное значение, которое является евклидовым расстоянием между двумя изображениями. Мне нужно извлечь функции, используя обученный модель. Когда я пишу layer.output, я сталкиваюсь с ошибкой ниже. | AttributeError: Уровень sequence_1 имеет несколько входящих узлов, поэтому понятие вывода уровня не определено. Вместо этого используйте get_output_at(node_index). И моя модель принимает два входных изображения, поэтому я не могу установить имя_слоя. - person Balaji; 03.03.2020
comment
Я смог это исправить, пожалуйста, проверьте! base_model = model.get_layer('input_2') input = Input(shape=input_dim) x = base_model(input) model_custom = Model(input, x) im2 = np.expand_dims(x_test[0, 1], axis=0) pred1 = model_custom.predict(im2) Но у меня есть еще один вопрос, как сохранить функции в 128d при регистрации набора образцов изображений? - person Balaji; 03.03.2020