Функция Keras (K.function) не работает с RNN (код предоставлен) - PullRequest
0 голосов
/ 30 апреля 2019

Я пытался увидеть результаты каждого из слоев на Keras, но я не смог найти правильный код, поэтому я создал простой код, в котором я застрял.

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

Вы можете увидеть, как я пытался увидеть в следующем коде.

Вот тестовый код, который работает (1):

seq_length = 3
latent_dim = 2
inputs = Input(shape=(seq_length, latent_dim))
outputs = Dense(5)(inputs)
outputs = Flatten()(outputs)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop', loss='mse')
print(model.summary())

Чтобы увидеть выходные данные каждого слоя (2):

layer_outputs = list()
for idx, l in enumerate(model.layers):
    if idx == 0:
        continue
    layer_outputs.append(l.output)
get_3rd_layer_output = K.function([model.layers[0].input],
                                  layer_outputs)
layer_output = get_3rd_layer_output([enc_input])
print('')
for l_output in layer_output:
    print(l_output[0][0])
    print('')

тогда вывод будет что-то вроде

[4.172303 -2.248884 1.397713 3.2669916 2.5788064]

4,172303

Однако, если я попытаюсь проверить ту же логику, что и (2), с кодом ниже, который использует RNN:

seq_length = 3
latent_dim = 2
inputs = Input(shape=(seq_length, latent_dim))
outputs, last_output = GRU(latent_dim, return_state=True, return_sequences=True)(inputs)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop', loss='mse')
print(model.summary())

и проверить с помощью (2), он будет излучать следующим образом:

----------------------------------------------- ---------------------------- TypeError Traceback (самый последний вызов последний) в 5 layer_outputs.append (l.output) 6 get_3rd_layer_output = K.function ([model.layers [0] .input], ----> 7 layer_outputs) 8 layer_output = get_3rd_layer_output ([enc_input]) 9 отпечатков ('')

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ keras \ бэкенд \ tensorflow_backend.py в функции (входы, выходы, обновления, ** kwargs) 2742
msg = 'Неверный аргумент "% s" передан в K.function с TensorFlow backend 'ключ% 2743 поднять ValueError (msg) -> 2744 функция возврата (входы, выходы, обновления = обновления, ** kwargs) 2745 2746

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ keras \ бэкенд \ tensorflow_backend.py в init (self, входы, выходы, обновления, имя, ** session_kwargs)
2544 self.inputs = список (входы) 2545 self.outputs = лист (выходы) -> 2546 с tf.control_dependencies (self.outputs): 2547 updates_ops = [] 2548 для обновления в обновлениях:

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ tensorflow \ питон \ Framework \ ops.py в control_dependencies (control_inputs) 5002 возврат _NullContextmanager () 5003 еще: -> 5004 return get_default_graph (). Control_dependencies (control_inputs) 5005
5006

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ tensorflow \ питон \ Framework \ ops.py в control_dependencies (self, control_inputs) 4541, если isinstance (c, IndexedSlices): 4542 c = c.op -> 4543 c = self.as_graph_element (c) 4544, если isinstance (c, Тензор): 4545 c = c.op

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ tensorflow \ питон \ Framework \ ops.py в as_graph_element (self, obj, allow_tensor, allow_operation) 3488 3489 с self._lock: -> 3490 возвращает self._as_graph_element_locked (объект, allow_tensor, allow_operation) 3491 3492 def _as_graph_element_locked (self, obj, allow_tensor, allow_operation):

d: \ igs_projects \ nlp_nlu \ venv \ Lib \ сайт-пакеты \ tensorflow \ питон \ Framework \ ops.py в _as_graph_element_locked (self, obj, allow_tensor, allow_operation) 3577 # Мы сдаемся! 3578 поднять TypeError ("Не могу преобразовать% s в% s. "% (type (obj). name , -> 3579 types_str)) 3580 3581 def get_operations (self):

TypeError: Невозможно преобразовать список в Тензор или Операцию.

1 Ответ

0 голосов
/ 30 апреля 2019

Для уровня GRU layer.output сам по себе является списком.

>>> model.layers[1].output
[<tf.Tensor 'gru_1/transpose_1:0' shape=(?, ?, 2) dtype=float32>, <tf.Tensor 'gru_1/while/Exit_3:0' shape=(?, 2) dtype=float32>]

layer_outputs - это список, содержащий другой список, поэтому возникает ошибка "Невозможно преобразовать список в тензор или операцию" .

>>> layer_outputs
[[<tf.Tensor 'gru_1/transpose_1:0' shape=(?, ?, 2) dtype=float32>, <tf.Tensor 'gru_1/while/Exit_3:0' shape=(?, 2) dtype=float32>]]

Обновление кодавот так должно работать:

get_3rd_layer_output = K.function([model.layers[0].input],
                                  layer_outputs[0]) #Extract the element and feed it.
...