Nano Hash - криптовалюты, майнинг, программирование

Как получить Learning_phase в TensorFlow 2 Eager?

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'

Ответы:


1

В качестве (не очень приятного) обходного пути вы можете использовать symbolic_learning_phase() из tensorflow.python.keras.backend:

from tensorflow.python.keras import backend

# ...
grads_fn = K.function(inputs=[model.inputs[0],
                              model._feed_targets[0],
                              backend.symbolic_learning_phase()], 
                      outputs=grads)

g_learning = grads_fn([x, x, True])
g_not_learning = grads_fn([x, x, False])

Я не уверен, почему эта функция, в отличие от learning_phase(), не была экспортирована в tensorflow.keras.backend. Может быть, есть веская причина этого не делать.

Кроме того, обратите внимание, что использование фазы обучения здесь имеет смысл только тогда, когда ваша модель содержит несколько слоев / операций, которые ведут себя по-разному в режимах обучения и вывода (например, выпадение). В противном случае результат функции был бы таким же.


Обновление: backend.symbolic_learning_phase() используется в tensorflow.keras коде (example), что не предполагает ничего против его публичного использования. Он служит заменой для K.learning_phase() в исполнении Eager, который будет использоваться в K.function().

26.11.2019
  • Эээ ... Это именно то, что я пробовал перед публикацией, и backend.symbolic_learning_phase() не удалось - теперь не получается. Я не знаю, в чем заключалась сделка, но, похоже, это сработало - я проведу несколько проверок, прежде чем принять ответ. А пока, может быть, вы могли бы пролить свет здесь? Я мог бы открыть ТАК Q&A, если это предпочтительнее 27.11.2019
  • Ах, вы использовали бэкэнд tenorflow python keras - хотя на самом деле вам не следует копай здесь; не уверен, насколько надежен этот подход 27.11.2019
  • @OverLordGoldDragon Вот почему я упомянул в самом начале, что это не хороший обходной путь: он использует tensorflow.python.keras. И, как я упоминал в конце своего ответа, вы не можете использовать symbolic_learning_phase() - tensorflow.keras.backend, потому что он не экспортируется в этот модуль (в отличие от learning_phase(), learning_phase_scope() или eager_learning_phase_scope(), которые все экспортируются, но не применимы в этом сценарии). Я не уверен, намеренно это или нет. 27.11.2019
  • В самом деле, ему не хватает экспорта - и, будучи tf.python.keras, это немного больше, чем «неприятно», поэтому я оставлю вопрос открытым; честная находка, я поделюсь в ветке Git 27.11.2019
  • K.learning_phase() по-прежнему оценивается как int в Eager; какой-нибудь «приятный» обходной путь, о котором вы знаете для TF2.2? 19.05.2020
  • @OverLordGoldDragon Нет, к сожалению, на данный момент я не знаю лучшего обходного пути. Кстати, есть ли в вашей модели слой / операция (например, выпадение), который по-разному ведет себя на этапах обучения и вывода (так что вы должны установить этап обучения)? 19.05.2020
  • Да, но я не думаю, что мы можем устанавливать флаги на уровне слоя без дальнейшего взлома 20.05.2020
  • Полагаю, это не требуется больше, хотя было бы лучше, если бы K.function был таким же гибким, как раньше. Я отмечу, что это решено, если через какое-то время не встретится вариант использования, требующий learning_phase. 22.05.2020
  • @OverLordGoldDragon Ладно, мне это звучит более или менее хорошо. Однако, в принципе, должен быть способ получения градиента тензора (будь то вывод или вес слоя) по отношению к любому другому тензору в режиме ожидания (это было возможно с K.function в собственном режиме графа Keras / TF). А также то, что я намеревался добавить в свой предыдущий комментарий и, возможно, в свой ответ (чего я не сделал!), - это использование аргумента training для моделей / слоев (например, см. этот ответ и связанные с ним ответы). Не стесняйтесь размещать ответ и принимать его. 22.05.2020
  • Мой запланированный подход к получению layer.output градиентов основан на этом ответе, заключая watch_layer в try-finally, чтобы очистить layer.result и вернуть layer.call к оригинал; Меня беспокоит использование памяти этим методом для кэширования .result в больших моделях. Если у вас есть лучший подход, я могу открыть для него вопросы и ответы. - Кстати, поддерживать API в актуальном состоянии с помощью мультибэкэнд-фреймворка (Eager, Graph, TF 2 & 1, keras, tf.keras) довольно неприятно. 22.05.2020
  • Похоже, мы оба ошибочно подозревали symbolic_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.2020
  • @OverLordGoldDragon Хорошо, спасибо за информацию. Пожалуйста, не стесняйтесь редактировать мой ответ, чтобы улучшить его, или, в качестве альтернативы, напишите новый ответ и примите его; любой из них мне подходит. Хотя я не уверен в том, что вы упомянули относительно tf.keras.backend и tf.python.keras.backend: я могу ошибаться, но первое - это всего лишь подмножество экспортируемых функций из второго; так что смешивание их кажется мне нормальным, если используемые функции стабильны (особенно в tf.python.keras). Однако ни в коем случае нельзя смешивать keras и tf.keras. 23.05.2020
  • Я предполагал, что здесь есть кое-что еще, но вы правы; первый является подмножеством последнего. 23.05.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..