Tiempo de ejecución de tensorflow

Tengo una función dentro de un script de Python al que estoy llamando varias veces ( https://github.com/sankhaMukherjee/NNoptExpt/blob/dev/src/lib/NNlib/NNmodel.py ): he simplificado la función significativamente para esto ejemplo.

def errorValW(self, X, y, weights): errVal = None with tf.Session() as sess: sess.run(tf.global_variables_initializer()) nW = len(self.allW) W = weights[:nW] B = weights[nW:] for i in range(len(W)): sess.run(tf.assign( self.allW[i], W[i] )) for i in range(len(B)): sess.run(tf.assign( self.allB[i], B[i] )) errVal = sess.run(self.err, feed_dict = {self.Inp: X, self.Op: y}) return errVal 

Estoy llamando a esta función muchas veces desde otra función. Cuando veo el registro del progtwig, parece que esta función sigue tardando más y más. Se muestra un registro parcial:

 21:37:12,634 - ... .errorValW ... - Finished the function [errorValW] in 1.477610e+00 seconds 21:37:14,116 - ... .errorValW ... - Finished the function [errorValW] in 1.481470e+00 seconds 21:37:15,608 - ... .errorValW ... - Finished the function [errorValW] in 1.490914e+00 seconds 21:37:17,113 - ... .errorValW ... - Finished the function [errorValW] in 1.504651e+00 seconds 21:37:18,557 - ... .errorValW ... - Finished the function [errorValW] in 1.443876e+00 seconds 21:37:20,183 - ... .errorValW ... - Finished the function [errorValW] in 1.625608e+00 seconds 21:37:21,719 - ... .errorValW ... - Finished the function [errorValW] in 1.534915e+00 seconds ... many lines later 22:59:26,524 - ... .errorValW ... - Finished the function [errorValW] in 9.576592e+00 seconds 22:59:35,991 - ... .errorValW ... - Finished the function [errorValW] in 9.466405e+00 seconds 22:59:45,708 - ... .errorValW ... - Finished the function [errorValW] in 9.716456e+00 seconds 22:59:54,991 - ... .errorValW ... - Finished the function [errorValW] in 9.282923e+00 seconds 23:00:04,407 - ... .errorValW ... - Finished the function [errorValW] in 9.415035e+00 seconds 

¿¿Alguien más ha experimentado algo como esto?? Esto es totalmente desconcertante para mí …

Edición : esto es para referencia …

Para referencia, el inicializador para la clase se muestra a continuación. Sospecho que la gráfica para la variable de result está aumentando progresivamente de tamaño. He visto este problema cuando bash guardar modelos con tf.train.Saver(tf.trainable_variables()) y el tamaño de este archivo sigue aumentando. No estoy seguro de si estoy cometiendo un error al definir el modelo de alguna manera …

 def __init__(self, inpSize, opSize, layers, activations): self.inpSize = inpSize self.Inp = tf.placeholder(dtype=tf.float32, shape=inpSize, name='Inp') self.Op = tf.placeholder(dtype=tf.float32, shape=opSize, name='Op') self.allW = [] self.allB = [] self.result = None prevSize = inpSize[0] for i, l in enumerate(layers): tempW = tf.Variable( 0.1*(np.random.rand(l, prevSize) - 0.5), dtype=tf.float32, name='W_{}'.format(i) ) tempB = tf.Variable( 0, dtype=tf.float32, name='B_{}'.format(i) ) self.allW.append( tempW ) self.allB.append( tempB ) if i == 0: self.result = tf.matmul( tempW, self.Inp ) + tempB else: self.result = tf.matmul( tempW, self.result ) + tempB prevSize = l if activations[i] is not None: self.result = activations[i]( self.result ) self.err = tf.sqrt(tf.reduce_mean((self.Op - self.result)**2)) return 

Estás llamando a tf.assign en el contexto de la sesión. Esto continuará agregando operaciones a su gráfico cada vez que ejecute la función errorValW , ralentizando la ejecución a medida que su gráfico crece. Como regla general, debe evitar llamar a las operaciones de Tensorflow al ejecutar modelos en datos (ya que esto generalmente estará dentro de un bucle, lo que dará como resultado un crecimiento constante del gráfico). Desde mi experiencia personal, incluso si solo está agregando “unas pocas” operaciones durante el tiempo de ejecución, esto puede resultar en una desaceleración extrema.

Tenga en cuenta que tf.assign es una tf.assign como cualquier otra. Debe definirlo una vez antes (al crear el modelo / construir el gráfico) y luego ejecutar la misma operación varias veces después de iniciar la sesión.

No sé qué es exactamente lo que estás tratando de lograr en tu fragmento de código, pero considera lo siguiente:

 ... with tf.Session() as sess: sess.run(tf.assign(some_var, a_value)) 

podría ser reemplazado por

 a_placeholder = tf.placeholder(type_for_a_value, shape_for_a_value) assign_op = tf.assign(some_var, a_placeholder) ... with tf.Session() as sess: sess.run(assign_op, feed_dict={a_placeholder: a_value}) 

donde a_placeholder debe tener el mismo dtype / shape que some_var . Debo admitir que no he probado este fragmento de código, así que avíseme si hay problemas, pero esto debería ser correcto.