Использование операций без тензорного потока в пользовательском регуляризаторе Keras

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

Я пытаюсь реализовать пользовательский регуляризатор активности Keras с набором довольно специфических операций, включая, но не ограничиваясь, PCA на выходных данных. Код регуляризации работает отдельно и написан на Numpy и sklearn. Пытаясь реализовать тот же код, что и пользовательский регуляризатор Keras, я столкнулся с многочисленными проблемами, связанными с тем, что тензоры не вычисляются; из другой информации, которую мне удалось собрать, у меня сложилось впечатление, что функция регуляризации компилируется во время определения модели.

  • Означает ли это, что я не могу приводить тензоры к массивам Numpy, а затем использовать операции Numpy в регуляризаторе?
  • Правильно ли, что все значения, представленные в моем регуляризаторе, должны быть либо предварительно вычисленными, либо тензорами?
  • Что именно я могу использовать в регуляризаторе? Могу ли я, например, использовать переменную index, вычисляемую на основе полученных данных, как предлагается здесь (сокращение реализации)?

Комментарии:

1. Tensorflow необходимо построить дифференцируемый граф тензорных операций, поскольку они используют автоматическое дифференцирование. Поскольку регуляризация обычно добавляется в качестве дополнительного штрафа к функции потерь, ваша функция регуляризации также должна быть функцией дифференцируемых тензорных операций.

2. Означает ли это, что я просто не могу этого сделать? Поскольку даже не все функции тензорного потока ( tf.size например) дифференцируемы, я не вижу, как мне подобрать дифференцируемые операции исключительно для создания нужного мне регуляризатора. Есть ли другой фреймворк, который позволил бы мне это сделать?

3. Я не знаю, какие операции вы явно используете. Вы могли бы попытаться аппроксимировать свои недифференцируемые функции дифференцируемыми. Есть несколько библиотек autodiff, но я не уверен, сможете ли вы объединить их с фреймворками DL. В любом случае я не думаю, что они будут делать то, что вы от них ожидаете. Вы могли бы использовать численную аппроксимацию градиента через (f(x e)-f(x e))/(2e) , но я не могу сказать, сработает это или нет, потому что это может привести к плохому поведению из-за плохих приближений.