如何应用自定义渐变:类型转换错误

时间:2019-07-09 08:51:16

标签: python numpy tensorflow keras

我正在实施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 :(得分:0)

由于错误提示apply_gradients期望毕业生获得float32_ref而不是float32

通过显式转换可能有多种解决方法,但是将gradsgrad_op分配给tf.Variable可能会解决此问题。

这样做应该可以进行转换,但是可以确定分配dtype=float32_ref时指定tf.Variable

Here是有关两者差异的文章。