2017-09-15 66 views
0

以下是我用於設計策略梯度算法的一部分代碼。在張量流中:tf.gradients返回所有的零

self.activation = tf.contrib.layers.fully_connected(inputs= state,num_outputs =\ 
num_actions,activation_fn=tf.nn.relu6,weights_initializer=tf.contrib.layers.xavier_initializer(),\ 
biases_initializer=tf.random_normal_initializer(mean=1.0,stddev=1.0),trainable=True) 

    action_prob = tf.nn.softmax(activation) 
    log_p = tf.log(tf.reduce_sum(tf.multiply(action_prob,action),axis=1)) 
    tvars = tf.trainable_variables() 
    policy_gradients = tf.gradients(ys= log_p,xs = tvars) 

張量log_p的計算結果是很好的。但是,policy_gradients都是零。我錯過了什麼嗎?

+0

什麼是tvars的價值觀?它評估到一些好事嗎? log_p有多少變量和哪些變量依賴於?我也注意到你在tf.nn.softmax中有self.activation和activation。激活應該是self.activation?激活在哪裏定義? –

回答

0

當log(x)= 0時,當x = 1或x = 0(不確定,但對於log(0)tensorflow產生nan和梯度爲0)時,會發生梯度。

你可以試着夾傳遞到對數值:

tf.log(tf.clip_to_value(x, 1e-15, 0.99)