TensorFlow: el alcance de la ingeniería de software

Así que ha terminado de entrenar su modelo y es hora de obtener información sobre lo que ha aprendido. Usted decide qué tensor debería ser interesante y lo busca en su código para averiguar cuál es su nombre. Entonces te golpea: olvidaste darle un nombre. También olvidó envolver el bloque de código lógico con un alcance con nombre. Significa que tendrá dificultades para obtener una referencia al tensor. Se aplica tanto a los scripts de python como a TensorBoard:

TensorFlow el alcance de la ingenieria de software

¿Puedes ver ese pequeño círculo rojo perdido en el mar de tensores? Encontrarlo es difícil…

¡Eso es un fastidio! Habría sido mucho mejor si se pareciera más a esto:

1673133790 100 TensorFlow el alcance de la ingenieria de software

¡Así es más! Cada conjunto de tensores que forman una unidad lógica está envuelto dentro de un ámbito con nombre.

¿Por qué el gráfico no se puede construir automáticamente de una manera que se asemeje a su código? Quiero decir, lo más probable es que no hayas construido el modelo usando una sola función, ¿verdad? Su base de código contiene múltiples funciones: ¡cada una forma una unidad lógica que merece su propio alcance con nombre!

Digamos que tienes un tensor x que fue definida por la función fque a su vez fue llamado por g. Significa que mientras escribías el código, tenías esta estructura lógica en mente: g -> f -> x. ¿No sería fantástico que el modelo se construyera automáticamente de forma que el nombre del tensor fuera g/f/x?

Ahora que lo pienso, es bastante simple de hacer. Todo lo que tiene que hacer es revisar todas sus funciones y agregar una sola línea de código:

def f():
    with tensorflow.name_scope(‘f’):
        # define tensors

Entonces, ¿qué tiene de malo ese enfoque?

  1. El nombre de la función f aparece dos veces, tanto en la declaración de la función como un argumento para tensorflow.name_scope. Tal vez la próxima semana cambie el nombre de la función a algo más significativo, digamos foo. Desafortunadamente, es posible que olvide actualizar el nombre del alcance.
  2. Tienes que aplicar sangría a todo el cuerpo de f. Si bien no es tan malo, personalmente no me gusta tener altos niveles de sangría. Digamos f
    contiene un bucle for que contiene una declaración if, que contiene otro bucle for. Gracias por llamar a tensorflow.name_scope¡ya estamos en un nivel de sangría de 4!

Podemos eludir estas desventajas usando metaprogramación simple: ¡los decoradores de Python al rescate!

import re

def name_scope(f):
    def func(*args, **kwargs):
        name = f.__name__[re.search(r[^_], f.__name__).start():]
        with tensorflow.name_scope(name):
            return f(*args, **kwargs)
    return func

@name_scope
def foo():
    # define tensors

¿Como funciona? Él @ es un azúcar sintáctico. Es equivalente a lo siguiente:

def foo():
    # define tensors

foo = name_scope(foo)

name_scope obtiene una función como argumento (f) y devuelve una nueva función (func). func crea un alcance con nombre y luego llama f.

¿El resultado? Todos los tensores definidos por f se creará dentro de un ámbito con nombre. El nombre del alcance será el nombre de la función original («foo»), gracias a f.__name__.

Un pequeño problema es que, si bien los nombres de funciones pueden comenzar con «_», los nombres de alcance de tensorflow no pueden hacerlo. Por eso tenemos que usar re.


TensorFlow el alcance de la ingenieria de software

El desafío de escribir un código limpio de tensorflow es insignificante en comparación con el desafío de investigación de hacer que el modelo sea realmente bueno.

Por lo tanto, es fácil caer en la tentación de concentrarse únicamente en los aspectos de investigación de su trabajo. Sin embargo, a la larga, es importante no descuidar la capacidad de mantenimiento y la legibilidad de su código, incluidas las de su gráfico.

El enfoque del decorador hace que mi trabajo sea un poco más fácil y espero que usted también se beneficie de él. ¿Tienes otros consejos que te gustaría compartir? ¡Deja una línea en los comentarios!


Publicado originalmente por mí en
ingeniería.taboola.com.

Fuente del artículo

Deja un comentario