我试图将BoundingLayer
函数从this file移植到DDPG.py代理在keras-rl中,但我在实现时遇到一些问题。在
我在中修改了get_gradients(loss, params)
方法DDPG.py要添加此项:
action_bounds = [-30, 50]
inverted_grads = []
for g,p in zip(modified_grads, params):
is_above_upper_bound = K.greater(p, K.constant(action_bounds[1], dtype='float32'))
is_under_lower_bound = K.less(p, K.constant(action_bounds[0], dtype='float32'))
is_gradient_positive = K.greater(g, K.constant(0, dtype='float32'))
is_gradient_negative = K.less(g, K.constant(0, dtype='float32'))
invert_gradient = tf.logical_or(
tf.logical_and(is_above_upper_bound, is_gradient_negative),
tf.logical_and(is_under_lower_bound, is_gradient_positive)
)
inverted_grads.extend(K.switch(invert_gradient, -g, g))
modified_grads = inverted_grads[:]
但我得到一个关于形状的错误:
^{pr2}$
keras rl“get_gradients”函数使用结合演员-批评家模型计算的渐变,但您需要critic输出与动作输入的梯度来应用反转渐变特性。在
我最近用kerasrl在一个RDPG原型上实现了它。仍然在测试,代码可以被优化,当然不是没有bug,但是我已经通过修改kerasrl代码行来实现反转梯度。为了修改action输入的critic输出的梯度,我遵循原始公式来计算actor梯度,这篇文章来自Patrick Emami:http://pemami4911.github.io/blog/2016/08/21/ddpg-rl.html。在
我把整个“compile”函数放在这里,在继承“DDPAgent”的类中重新定义,在这个类中实现了反转梯度特性。在
训练参与者时,现在应该传递3个输入而不是2个:观察输入+动作输入(使用actor网络的预测),因此还必须修改“backward”函数。就我而言:
^{pr2}$之后,您可以让您的actor在输出中具有线性激活。在
相关问题 更多 >
编程相关推荐