Tensorflow: ¿Cómo implementar el máximo acumulativo?

Estoy tratando de implementar la reducción máxima para mi función de pérdida utilizando un código con el formato de:

x = cumulative product of returns tensor z = cumulative max of x g = minimum of z / x 

Pero estoy atascado en cómo calcular el máximo acumulado de x en Tensorflow. Por ejemplo: dada una matriz [0,2,5,3,8,1,7] , el máximo acumulado de esa matriz sería [0,2,5,5,8,8,8] . Crea una matriz con el valor máximo hasta ahora.

Algún consejo sería de gran aprecio.

Aquí hay una implementación de cumulative_max usando un tensorflow while loop que toma n=len(x) iteraciones. El código se puede copiar y pegar ejecutable como ejemplo.

 import tensorflow as tf def tf_while_condition(x, loop_counter): return tf.not_equal(loop_counter, 0) def tf_while_body(x, loop_counter): loop_counter -= 1 y = tf.concat(([x[0]], x[:-1]), axis=0) z = tf.maximum(x, y) return z, loop_counter x = tf.constant([0,2,5,3,8,1,7]) cumulative_max, _ = tf.while_loop(cond=tf_while_condition, body=tf_while_body, loop_vars=(x, x.shape[0])) with tf.Session() as sess: print(sess.run(cumulative_max)) 

Resultado:

 [0 2 5 5 8 8 8] 

Nota: si tiene un vector grande para calcular y no necesita backprop, probablemente valga la pena incluir back_prop=False en tf.while_loop .

Una clave para comprender TF mientras que los bucles es entender que sus funciones basadas en python, tf_while_condition y tf_while_body , solo se llaman una vez para producir las operaciones de flujo de tensión relevantes. Esas dos funciones NO se llaman en un bucle. Las operaciones que devuelven se ejecutarán en un bucle dentro del gráfico de sess.run durante los cálculos de sess.run .