当我们需要计算双梯度或Hessian时,在tensorflow中,我们可以使用tf.hessians(F(x),x)
,或使用tf.gradient(tf.gradients(F(x),x)[0], x)[0]
。但是,如果x
不是排名第一,我在使用tf.hessians()
时会被告知以下错误。
ValueError:无法计算Hessian,因为xs的元素0没有 排名第一。张量model_inputs / action:0必须排名1。 收到等级2,形状(?,1)
在以下代码中:
with tf.name_scope("1st scope"):
self.states = tf.placeholder(tf.float32, (None, self.state_dim), name="states")
self.action = tf.placeholder(tf.float32, (None, self.action_dim), name="action")
with tf.name_scope("2nd scope"):
with tf.variable_scope("3rd scope"):
self.policy_outputs = self.policy_network(self.states)
# use tf.gradients twice
self.actor_action_gradients = tf.gradients(self.policy_outputs, self.action)[0]
self.actor_action_hessian = tf.gradients(self.actor_action_gradients, self.action)[0]
# or use tf.hessians
self.actor_action_hessian = tf.hessian(self.policy_outputs, self.action)
使用tf.gradients()
时,也会导致错误:
in create_variables self.actor_action_hessian = tf.gradients(self.actor_action_gradients,self.action)[0]
AttributeError:'NoneType'对象没有属性'dtype'
如何解决这个问题,在这种情况下,tf.gradients()
和tf.hessians()
是否都可以使用?
答案 0 :(得分:1)
第二种方法很好,错误在其他地方,即你的图表没有连接。
self.actor_action_gradients = tf.gradients(self.policy_outputs, self.action)[0]
self.actor_action_hessian = tf.gradients(self.actor_action_gradients, self.action)[0]
错误在第二行引发,因为self.actor_action_gradients为None,因此您无法计算其渐变。您的代码中没有任何内容表明self.policy_outputs依赖于self.action(并且它不应该,因为它的操作取决于策略,而不是策略操作)。
一旦你解决了这个问题,你会注意到," hessian"不是真正的粗麻布,而是一个矢量,形成一个适当的粗糙的f wrt。 x你必须迭代tf.gradients返回的所有值,并独立计算每个值的tf.gradients。这是TF的一个已知限制,目前还没有更简单的方法。