Frage

Ich berechnet und Optimierung einiger Variablen, die für einen externen Prozess verwendet werden, aber ich erhalte den Fehler "No Gradient".

Eine stark vereinfachte (nicht getestete) Version des Codes, aber Sie können die Idee bekommen:

def external_process (myvar):
    subprocess.call("process.sh", myvar)
    with open('result.json', 'r') as f:
        result = json.load(data, f)
    return np.array(result["result"])

myvar = tf.Variable(1.0, dtype = 'float32', trainable = True)

loss = tf.reduce_sum( tf.py_func(external_process, [myvar], [tf.float32])[0] )

optimizer = tf.train.AdamOptimizer(0.05)
train_step = optimizer.minimize(loss)
sess.run(train_step)

Ich habe diese Diskussion gesehen, aber ich verstehe sie nicht vollständig: https://github.com/tensorflow/tensorflow/issues/1095

Vielen Dank!

War es hilfreich?

Lösung 2

Die richtige Antwort lautet: "Ein externer Prozess ist nicht differenzierbar (es sei denn, Sie kennen jedes Detail, was in diesem Fall unmöglich ist), daher sollte dieses Problem als Problem mit Verstärkung konfrontiert werden."

Andere Tipps

Hier https://www.tensorflow.org/version/r0.9/api_docs/python/framework.html (Suche gradient_override_map) ist ein Beispiel auf gradient_override_map:

@tf.RegisterGradient("CustomSquare")
def _custom_square_grad(op, grad):
  # ...

with tf.Graph().as_default() as g:
  c = tf.constant(5.0)
  s_1 = tf.square(c)  # Uses the default gradient for tf.square.
  with g.gradient_override_map({"Square": "CustomSquare"}):
    s_2 = tf.square(s_2)  # Uses _custom_square_grad to compute the
                          # gradient of s_2.

Eine mögliche Lösung könnte also sein:

@tf.RegisterGradient("ExternalGradient")
def _custom_external_grad(unused_op, grad):
    # I don't know yet how to compute a gradient
    # From Tensorflow documentation:
    return grad, tf.neg(grad)

def external_process (myvar):
    subprocess.call("process.sh", myvar)
    with open('result.json', 'r') as f:
        result = json.load(data, f)
    return np.array(result["result"])

myvar = tf.Variable(1.0, dtype = 'float32', trainable = True)

g = tf.get_default_graph()
with g.gradient_override_map({"PyFunc": "ExternalGradient"}):
    external_data =  tf.py_func(external_process, [myvar], [tf.float32])[0]

loss =  tf.reduce_sum(external_data)

optimizer = tf.train.AdamOptimizer(0.05)
train_step = optimizer.minimize(loss)
sess.run(train_step)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top