Как применить пользовательский градиент: ошибка с преобразованием типов - PullRequest
1 голос
/ 09 июля 2019

Я реализую 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>]

1 Ответ

0 голосов
/ 09 июля 2019

Как показывает ошибка, apply_gradients ожидает float32_ref, а не float32 для градов.

Вероятно, существует несколько способов обойти это с явными преобразованиями, но назначение grads или grad_op для tf.Variable может решить проблему.

Это должно сделать преобразование, но вы можете указать dtype=float32_ref при назначении tf.Variable, чтобы быть уверенным.

Здесь - сообщение о разнице между ними.

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