Ошибка значения(«Переменная {} не имеет значения» Нет » для градиента. «) для тензора

#python #numpy #tensorflow #keras #tensor

Вопрос:

У меня возникает следующая проблема при попытке запустить приложение с использованием Tensorflow и Keras. Я бегу с,

 from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()
 

установлено, так как исходная проблема возникла с тем, что тензор не принимает тензоры в методе get_update() AdamOptimmizer, в котором показана ошибка, не конвертируемая в массив numpy.

Фрагмент кода выглядит следующим образом:

 from keras import backend as K

def optimizer(self):
    action = K.placeholder(dtype=float, shape=(None, 5))
    discounted_rewards = K.placeholder(shape=(None,))

    action_prob = K.sum(action * self.model.output, axis=1) 
    cross_entropy = K.log(action_prob) * discounted_rewards
    loss = -K.sum(cross_entropy)

    optimizer = Adam(lr=self.learning_rate)
    updates = optimizer.get_updates(self.model.trainable_weights, loss)
    train = K.function([self.model.input, action, discounted_rewards], [], updates=updates)

    return train
 

Как указано выше, теперь я столкнулся с проблемой ниже (см. Трассировку стека).

 Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 24)                384       
_________________________________________________________________
dense_1 (Dense)              (None, 24)                600       
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 125       
=================================================================
Total params: 1,109
Trainable params: 1,109
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):
  File "reinforce_agent.py", line 95, in <module>
    agent = ReinforceAgent()
  File "reinforce_agent.py", line 28, in __init__
    self.optimizer = self.optimizer()
  File "reinforce_agent.py", line 55, in optimizer
    updates = optimizer.get_updates(self.model.trainable_weights, loss)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py", line 727, in get_updates
    grads = self.get_gradients(loss, params)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py", line 719, in get_gradients
    raise ValueError("Variable {} has `None` for gradient. "
ValueError: Variable Tensor("Neg:0", shape=(), dtype=float32) has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
 

Я пробовал различные решения, в том числе K.eval(loss) и раньше, но это вызывает некоторые другие проблемы. Моя версия Tensorflow-2.4.1, версия Keras 2.4.3 и версия Numpy 1.19.5.

Есть какое-нибудь решение этой проблемы?

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

1. Можете ли вы поделиться фрагментом того, как вы объявляете сеть?

Ответ №1:

Это было решено следующим образом путем внесения следующих простых изменений в код для методов оптимизатора, упомянутых в вопросе:

 def optimizer(self):
    action = K.placeholder(dtype=float, shape=(None, 5))
    discounted_rewards = K.placeholder(shape=(None,))

    # Calculate cross entropy error function
    action_prob = K.sum(action * self.model.output, axis=1) 
    cross_entropy = K.log(action_prob) * discounted_rewards
    loss = -K.sum(cross_entropy)

    # create training function
    optimizer = Adam(lr=self.learning_rate)
    updates = optimizer.get_updates(params=self.model.trainable_weights, loss=loss)
    train = K.function(inputs=[self.model.input, action, discounted_rewards], outputs=self.model.output, updates=updates)

    return train
 

См. 12-ю и 13-ю строки.

Спасибо!