Я реализую DDPG. Мне нужно рассчитать собственный градиент (градиент весов актера, который максимизирует выход критика), а затем применить его с помощью оптимизатора. Однако по какой-то причине я получаю загадочную ошибку типа при попытке ее запустить.
Я пытался просмотреть другие учебники и искать переполнение стека, но не могу найти способ исправить ошибку.
Это пример кода, который получает ошибку (фактическое вычисление является более сложным, но получает ответ той же формы):
actor = Sequential()
actor.add(Dense(2, input_shape=(6,)))
# actor_inputs is randomly sampled
sess = K.get_session()
grad_op = K.gradients(actor.output, actor.trainable_weights)
grads = sess.run(grad_op, feed_dict={actor.input: actor_inputs})
opt = tf.keras.optimizers.Adam(lr=1e-4)
opt.apply_gradients(zip(grads, actor.trainable_weights))
Градиент, который это вычисляет, кажется правильным. Я ожидал, что оптимизатор применяет его к сети, но я получаю следующую ошибку в вызове apply_gradients
:
Tensor conversion requested dtype float32_ref for Tensor with dtype float32: 'Tensor("Adam_24/dense_95/kernel/m/Initializer/zeros:0", shape=(6, 2), dtype=float32)'
Вот результат некоторых тестовых распечаток соответствующих данных:
print(actor_inputs)
:
[[-0.43979521 0. -1.28554755 0. 0.94703663 -0.32112555]]
print(grad_op)
[<tf.Tensor 'gradients_2/dense_95/MatMul_grad/MatMul_1:0' shape=(6, 2) dtype=float32>, <tf.Tensor 'gradients_2/dense_95/BiasAdd_grad/BiasAddGrad:0' shape=(2,) dtype=float32>]
print(grads)
:
[array([[ 3.003665 , 3.003665 ],
[ 0. , 0. ],
[-2.2157073 , -2.2157073 ],
[ 0. , 0. ],
[-0.8517535 , -0.8517535 ],
[ 0.52394277, 0.52394277]], dtype=float32), array([1., 1.], dtype=float32)]
print(actor.trainable_weights)
[<tf.Variable 'dense_95/kernel:0' shape=(6, 2) dtype=float32_ref>, <tf.Variable 'dense_95/bias:0' shape=(2,) dtype=float32_ref>]