Как получить выходы всех промежуточных слоев глубокого РНН в Керасе - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь получить выходные данные каждого слоя пользовательской модели RNN в Керасе. Код для модели приведен ниже.

from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.layers import RNN, Dense, Activation
from tensorflow.python.keras.models import Model
import numpy as np


class MinimalRNNCell(keras.layers.Layer):

    def __init__(self, units, **kwargs):
        self.units = units
        self.state_size = units
        super(MinimalRNNCell, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=(input_shape[-1], self.units),
                                      initializer='uniform',
                                      name='kernel')
        self.recurrent_kernel = self.add_weight(
            shape=(self.units, self.units),
            initializer='uniform',
            name='recurrent_kernel')
        self.built = True

    def call(self, inputs, states):
        prev_output = states[0]
        h = K.dot(inputs, self.kernel)
        output = h + K.dot(prev_output, self.recurrent_kernel)
        return output, [output]


cells = [MinimalRNNCell(32), MinimalRNNCell(64)]
x = keras.Input((None, 257))
y = RNN(cells)(x)
out = Dense(257, name='fin_dense')(y)
out = Activation('sigmoid', name='out_layer')(out)

model = Model(inputs=x, outputs=out)

Я могу получить прогнозы, используя,

in_test = np.random.randn(1, 3, 257)
mod_out = model.predict(in_test)

Но я хотел бы получить результаты каждого слоя, и когда я пытаюсь использовать *Функция 1007 *, которая работает для всех других моделей Keras

def getLayerOutputs(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])

layer_outs = getLayerOutputs(model, in_test)

Я получаю выходные данные всего слоя RNN, а не каждой ячейки внутри него, как я могу получить выходные данные каждой ячейки с RNN?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

При изменении флага return_state на True примерно так

y = RNN(cells, return_state=True)(x)

Мы получаем выходные состояния каждой ячейки RNN в виде списка

0 голосов
/ 23 октября 2019

Это должно быть сделано в tenorflow 1.x (тестовая версия 1.12.0):

sess = K.get_session()

outs = dict() 
for i in range(1, len(model.layers)): 
    outs[model.layers[i].name] = sess.run([model.layers[i].output], feed_dict={model.input:in_test})  

(ауты имеют промежуточные результаты для каждого слоя)

Если вы используете TensorFlow2 (тестовая версия 2.0.0-rc1):

outs = dict() 
for i in range(1, len(model.layers)): 
    outs[model.layers[i].name] = Model(x, model.layers[i].output).predict(in_test)
...