#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-ю строки.
Спасибо!