Переопределить градиент tf.floor - PullRequest
1 голос
/ 09 января 2020

Я пытался использовать tf.floor в моем выходном слое, но продолжал получать ошибку «Нет градиента», даже если я пытался переопределить его с градиентом идентичности.

import tensorflow as tf
from tensorflow import keras

def transfer(x):
    with tf.compat.v1.get_default_graph() as g:
        with g.gradient_override_map({'Floor': 'Identity'})
            return tf.floor(x * 90) / 90

input = keras.layers.Input((10, ))
output = keras.layers.Lambda(transfer)(keras.layers.Dense(1, activation='sigmoid')(input))

Вот полное сообщение об ошибке:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/optimizer_v2/optimizer_v2.py in _filter_grads(grads_and_vars)
   1037   if not filtered:
   1038     raise ValueError("No gradients provided for any variable: %s." %
-> 1039                      ([v.name for _, v in grads_and_vars],))
   1040   if vars_with_empty_grads:
   1041     logging.warning(

ValueError: No gradients provided for any variable:

1 Ответ

0 голосов
/ 09 января 2020

Вы используете TF 2? Я очень сомневаюсь, что эти графические вещи сделают что-нибудь, потому что TF 2.0 больше не делает графы больше. Стандартный способ переопределения градиентов - через tf.custom_gradient. Вы бы использовали его так:

@tf.custom_gradient
def custom_floor(x):
    def grad_fn(dy):
        return dy

    return tf.floor(x), grad_fn

Затем используйте функцию custom_floor вместо tf.floor в вашей модели. Это вернет tf.floor (первый возвращаемый элемент) в прямом проходе, но используйте grad_fn (второй возвращаемый элемент) для вычисления градиента - в этом случае он просто пропустит его без изменений. Конечно, вы также можете применить @custom_gradient непосредственно к вашей функции transfer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...