如何应用自定义渐变:类型转换错误
Posted
技术标签:
【中文标题】如何应用自定义渐变:类型转换错误【英文标题】:How to apply custom gradient: error with type conversion 【发布时间】:2019-11-18 18:50:02 【问题描述】:我正在实施 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】:正如错误提示,apply_gradients
期望 float32_ref
而不是 float32
用于毕业生。
可能有多种方法可以通过显式转换来解决此问题,但将grads
或grad_op
分配给tf.Variable 可能会解决此问题。
这样做应该会进行转换,但您可以在分配tf.Variable
时指定dtype=float32_ref
以确保。
Here 是一篇关于两者区别的帖子。
【讨论】:
你能给出具体的代码片段如何做到这一点吗?我对 tf 很陌生。以上是关于如何应用自定义渐变:类型转换错误的主要内容,如果未能解决你的问题,请参考以下文章