2017-06-08 2 views
0

Ich arbeite an einer DDPG-Implementierung, die die Berechnung von einem Netzwerk (unten:.) Gradienten in Bezug auf ein anderes Netzwerk (unten: actor) Ausgabe erfordert. Mein Code macht bereits die Verwendung von Warteschlangen statt Feed dicts zum größten Teil, aber ich konnte nicht so für diesen spezifischen Teil tut noch:Tensorflow: tf.gradienten zwischen verschiedenen Pfaden des Diagramms

import tensorflow as tf 
tf.reset_default_graph() 

states = tf.placeholder(tf.float32, (None,)) 
actions = tf.placeholder(tf.float32, (None,)) 

actor = states * 1 
critic = states * 1 + actions 

grads_indirect = tf.gradients(critic, actions) 
grads_direct = tf.gradients(critic, actor) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    act = sess.run(actor, {states: [1.]}) 
    print(act) # -> [1.] 
    cri = sess.run(critic, {states: [1.], actions: [2.]}) 
    print(cri) # -> [3.] 
    grad1 = sess.run(grads_indirect, {states: [1.], actions: act}) 
    print(grad1) # -> [[1.]] 
    grad2 = sess.run(grads_direct, {states: [1.], actions: [2.]}) 
    print(grad2) # -> TypeError: Fetch argument has invalid type 'NoneType' 

grad1 hier berechnet die Steigungen w.r.t. zu den Einspeiseaktionen, die zuvor von der actor berechnet wurden. grad2 sollte das gleiche tun, aber direkt innerhalb des Graphen ohne die Notwendigkeit, die Aktionen zurück in aber actor direkt eingeben. Das Problem ist, dass grads_direct ist None:

print(grads_direct) # [None] 

Wie kann ich das erreichen? Gibt es eine dedizierte "evaluiere diesen Tensor" -Operation, die ich nutzen könnte? Vielen Dank!

Antwort

1

In Ihrem Beispiel verwenden Sie nicht actor, um zu berechnen, so dass der Gradient None ist.

sollten Sie tun:

actor = states * 1 
critic = actor + actions # change here 

grads_indirect = tf.gradients(critic, actions) 
grads_direct = tf.gradients(critic, actor) 
Verwandte Themen