K.learning_phase()
получает значение, а не сам тензор. Мне нужен тензор фазы обучения для подачи в K.function
, чтобы получить градиенты слоя, выходные данные и т. Д. Работает нормально с import keras.backend as K
, но не работает для import tensorflow.keras.backend as K
. Соответствующий Git с частичным обходным путем
Как мне получить сам тензор?
Воспроизводимый пример:
import tensorflow.keras.backend as K
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import numpy as np
ipt = Input((16,))
out = Dense(16)(ipt)
model = Model(ipt, out)
model.compile('adam', 'mse')
x = np.random.randn(32, 16)
model.train_on_batch(x, x)
grads = model.optimizer.get_gradients(model.total_loss, model.layers[-1].output)
grads_fn = K.function(inputs=[model.inputs[0], model._feed_targets[0], K.learning_phase()],
outputs=grads)
Полная трассировка ошибок:
File "<ipython-input-2-7f74922d7492>", line 3, in <module>
outputs=grads)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3773, in function
return EagerExecutionFunction(inputs, outputs, updates=updates, name=name)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3670, in __init__
base_graph=source_graph)
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\eager\lift_to_graph.py", line 249, in lift_to_graph
visited_ops = set([x.op for x in sources])
File "D:\Anaconda\envs\tf2_env\lib\site-packages\tensorflow_core\python\eager\lift_to_graph.py", line 249, in <listcomp>
visited_ops = set([x.op for x in sources])
AttributeError: 'int' object has no attribute 'op'
backend.symbolic_learning_phase()
не удалось - теперь не получается. Я не знаю, в чем заключалась сделка, но, похоже, это сработало - я проведу несколько проверок, прежде чем принять ответ. А пока, может быть, вы могли бы пролить свет здесь? Я мог бы открыть ТАК Q&A, если это предпочтительнее 27.11.2019tensorflow.python.keras
. И, как я упоминал в конце своего ответа, вы не можете использоватьsymbolic_learning_phase()
-tensorflow.keras.backend
, потому что он не экспортируется в этот модуль (в отличие отlearning_phase()
,learning_phase_scope()
илиeager_learning_phase_scope()
, которые все экспортируются, но не применимы в этом сценарии). Я не уверен, намеренно это или нет. 27.11.2019tf.python.keras
, это немного больше, чем «неприятно», поэтому я оставлю вопрос открытым; честная находка, я поделюсь в ветке Git 27.11.2019K.learning_phase()
по-прежнему оценивается какint
в Eager; какой-нибудь «приятный» обходной путь, о котором вы знаете для TF2.2? 19.05.2020K.function
был таким же гибким, как раньше. Я отмечу, что это решено, если через какое-то время не встретится вариант использования, требующийlearning_phase
. 22.05.2020K.function
в собственном режиме графа Keras / TF). А также то, что я намеревался добавить в свой предыдущий комментарий и, возможно, в свой ответ (чего я не сделал!), - это использование аргументаtraining
для моделей / слоев (например, см. этот ответ и связанные с ним ответы). Не стесняйтесь размещать ответ и принимать его. 22.05.2020layer.output
градиентов основан на этом ответе, заключаяwatch_layer
вtry-finally
, чтобы очиститьlayer.result
и вернутьlayer.call
к оригинал; Меня беспокоит использование памяти этим методом для кэширования.result
в больших моделях. Если у вас есть лучший подход, я могу открыть для него вопросы и ответы. - Кстати, поддерживать API в актуальном состоянии с помощью мультибэкэнд-фреймворка (Eager, Graph, TF 2 & 1,keras
,tf.keras
) довольно неприятно. 22.05.2020symbolic_learning_phase()
в неприглядности;tf.keras
код широко использует его, и у меня все нормально работает для получения выходных данных слоя черезK.function
. Однако стоит отметить, что бэкенды не смешиваются;from keras
,from tensorflow.keras
иfrom tensorflow.python.keras
бэкэнды следует использовать только сами с собой. Я использую импорт последних какKpy
, аtf.keras.backend
какK
- итак:Kpy.function(..., Kpy.symbolic_learning_phase())
, затем, например,K.eval()
. Если вы включите эту информацию в свой ответ, я приму ее. 23.05.2020tf.keras.backend
иtf.python.keras.backend
: я могу ошибаться, но первое - это всего лишь подмножество экспортируемых функций из второго; так что смешивание их кажется мне нормальным, если используемые функции стабильны (особенно вtf.python.keras
). Однако ни в коем случае нельзя смешиватьkeras
иtf.keras
. 23.05.2020