Как получить выходные данные всех слоев модели Keras? - PullRequest
1 голос
/ 03 октября 2019

У меня есть функциональная модель Keras, определенная как:

    # Construct DNN
    spec_input = keras.layers.Input(shape=(1, ctx, fft), name='spec')
    x = keras.layers.Flatten(data_format)(spec_input)

    for layer in range(len(args.dnn_struct)):
        x = Dense(args.dnn_struct[layer])(x)
        x = BatchNormalization()(x)
        x = keras.layers.ReLU()(x)

    out = Dense(fft, activation="sigmoid", name=f'spp')(x)
    model = Model(inputs=spec_input, outputs=out)

Я хотел бы получить выходные данные каждого слоя в модели для заданного ввода и ответы, приведенные в Keras, Какполучить выходные данные каждого слоя? не работают для функциональной модели. В настоящее время я использую Tensorflow 1.14

Когда я пытаюсь использовать

from keras import backend as K

inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 1.])
print(layer_outs)

, я получаю ошибку

Traceback (most recent call last):
  File "/home/xyz/anaconda3/envs/tf/lib/python3.7/site-packages/tensorflow/python/client/session.py", line 1446, in __init__
    session._session, options_ptr)
tensorflow.python.framework.errors_impl.InvalidArgumentError: spec:0 is both fed and fetched.

1 Ответ

1 голос
/ 04 октября 2019

ОБНОВЛЕНИЕ : Вы не можете получить выходные данные всех слоев, потому что "все слои" включают в себя Input - и сообщение об ошибке говорит само за себя. Используйте:

outputs = get_all_outputs(model, input_data, 1)


Ниже должно работать для любой модели, Model или Sequential:
def get_all_outputs(model, input_data, learning_phase=1):
    outputs = [layer.output for layer in model.layers[1:]] # exclude Input
    layers_fn = K.function([model.input, K.learning_phase()], outputs)
    return layers_fn([input_data, learning_phase])

Уровневые решения:

def get_layer_outputs(model, layer_name, input_data, learning_phase=1):
    outputs   = [layer.output for layer in model.layers if layer_name in layer.name]
    layers_fn = K.function([model.input, K.learning_phase()], outputs)
    return layers_fn([input_data, learning_phase])

# or, for passing in a layer directly
def get_layer_outputs(model, layer, input_data, learning_phase=1):
    layer_fn = K.function([model.input, K.learning_phase()], layer.output)
    return layer_fn([input_data, learning_phase])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...