Ошибка Tensorflow: пользовательский градиент в слое Keras: фигуры должны быть одинакового ранга, но имеют 1 и 2 - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть рабочая пользовательская функция активации для моего пользовательского слоя keras, и я пытаюсь кодировать собственный градиент для него. Причиной создания этого пользовательского градиента является то, что цифра c дифференциация нестабильна и приводит к NAN после нескольких эпох обучения. Моя функция активации принимает тензорный вход x и тензорную переменную k. x - это форма (32,128), а k - это форма (1,128) в этом случае. Каждая переменная в k уникальна, поэтому я не могу использовать одну переменную k. dy is shape (32,128).

Программа перебирает функцию градиента для каждого слоя, и затем я получаю эту ошибку

Exception has occurred: ValueError
Shapes must be equal rank, but are 1 and 2 for 'Adam/Adam/update_2/ResourceApplyAdam' (op: 'ResourceApplyAdam') with input shapes: [], [], [], [], [], [], [], [], [], [32,128].

Вот мой код для функции активации:

@tf.custom_gradient
def tf_ReMahon_calc(x, k):
  def grad(dy):
    #dk=-(((e**(x*k))*x*(1+x))/((1+e**(x*k))**2))
    #dx=(1+e**(k*x)-k*e**(k*x)*(1+x))/((1+e**(x*k))**2)

    #return dy*dx,dy*dk
    return dy, dy

  return  tf.math.divide_no_nan(tf.math.add(1.0,x),tf.math.add(1.0,tf.math.exp(tf.math.multiply_no_nan(k,x)))), grad

dx - производная функции по x, а dk - для k. Я закомментировал эти области, хотя любая реализация приводит к одной и той же ошибке. Замена целевой функции моего прямого прохода также приводит к той же ошибке. Как я могу исправить эту ошибку? Кроме того, есть ли другой способ получить доступ к градиенту и изменить его, чтобы мне не пришлось создавать собственную функцию градиента?

Попытки, которые не решают проблему: замена | return dy, dy | с | return dy | или | return (dy, dy) |. Также я не смог найти способ получить доступ или изменить исходный градиент, который был достигнут с помощью регулярного автоматического дифференцирования tenorflow. Если бы это можно было сделать, это также могло бы помочь моей проблеме, повернув все градиенты NAN к нулю. Любая помощь очень ценится!

...