Nos familiarizamos bastante con el siguiente gráfico en la última sección:
Código:
Vamos a dividir este código línea por línea. Primero, notarás esta declaración de importación:
import tensorflow as tf:
Esto, como era de esperar, importa la biblioteca TensorFlow y le da un alias de tf. Esto es por convención, ya que es mucho más fácil escribir "tf", en lugar de "tensorflow" una y otra vez, ya que utilizamos sus diversas funciones.
A continuación, concentrémonos en nuestras primeras dos asignaciones de variables:
Aquí, estamos definiendo nuestros nodos de "entrada", a y b. Estas líneas utilizan nuestra primera operación TensorFlow: tf.constant(). En TensorFlow, cualquier nodo de cómputo en el grafo se llama Operation u Op para abreviar. Ops toma en cero o más cero o más objetos Tensor. Para crear una Operación, usted llama a su constructor Python asociado, en este caso, tf.constant()
crea una "constante" op.
Toma un solo valor de tensor y envía ese mismo valor a los nodos que están directamente conectados a él. Para mayor comodidad, la función convierte automáticamente los números escalares 5 y 3 en objetos Tensor para nosotros. También pasamos un parámetro de nombre de cadena opcional, que podemos usar para dar un identificador a los nodos que creamos.
No se preocupe si no entiende completamente qué es un objeto de Operación o Tensor en este momento, ya que veremos más detalles más adelante en este capítulo.
Aquí, estamos definiendo los siguientes dos nodos en nuestro gráfico, y ambos usan los nodos que definimos anteriormente. El nodo c usa el tf.mul. Op, que toma en dos entradas y produce el resultado de multiplicarlas juntas. Del mismo modo, el nodo d utiliza tf.add, una operación que genera el resultado de sumar dos entradas juntas. De nuevo, pasamos un nombre a estas dos operaciones (es algo que verás mucho). Tenga en cuenta que no tenemos que definir los bordes del gráfico por separado del nodo; cuando crea un nodo en TensorFlow, incluye todas las entradas que la Operación necesita calcular y el software dibuja las conexiones por usted.
Aquí, estamos definiendo los siguientes dos nodos en nuestro gráfico, y ambos usan los nodos que definimos anteriormente. El nodo c usa el tf.mul.
Op, que toma en dos entradas y produce el resultado de multiplicarlas juntas. Del mismo modo, el nodo d utiliza tf.add, una operación que genera el resultado de sumar dos entradas juntas. De nuevo, pasamos un nombre a estas dos operaciones (es algo que verás mucho). Tenga en cuenta que no tenemos que definir los bordes del gráfico por separado del nodo: cuando crea un nodo en TensorFlow, incluye todas las entradas que la Operación necesita calcular y el software dibuja las conexiones por usted.
Esta última línea define el nodo final en nuestro gráfico. e utiliza tf.add de manera similar al nodo d. Sin embargo, esta vez toma los nodos c y d como entrada, exactamente como se describe en el gráfico anterior.
Con eso, nuestra primera, aunque pequeña, gráfica ha sido completamente definida! Si tuviera que ejecutar lo anterior en un script o shell de Python, se ejecutaría, pero en realidad no haría nada. Recuerda, esto es solo la parte de la definición del proceso. Para obtener una breve idea de cómo se ve un gráfico, podríamos agregar las siguientes dos líneas al final para obtener nuestro gráfico para generar el nodo final:
Si ejecutara esto en un entorno interactivo, como el shell de Python o el cuaderno de Jupyter / iPython, vería la salida correcta:
Es suficiente hablar por ahora: ¡de hecho, hagamos que esto funcione con código en vivo!
Podría escribir esto como un archivo de Python y ejecutarlo de forma no interactiva, pero la salida de la ejecución de un gráfico no se muestra de forma predeterminada al hacerlo. Por el bien de ver el resultado de su gráfico, obtener retroalimentación inmediata sobre su sintaxis y (en el caso del Cuaderno de Jupyter) Para corregir errores y cambiar el código sobre la marcha, recomendamos encarecidamente realizar estos ejemplos en un entorno interactivo. Además, el TensorFlow interactivo es divertido!
Primero, necesitamos cargar la biblioteca TensorFlow. Escriba su declaración de importación de la siguiente manera:
Puede pensar por unos segundos, pero luego terminará de importar y estará listo para la siguiente línea de código. Si instaló TensorFlow con soporte de GPU, puede ver algunos resultados que le notifican que se importaron las bibliotecas CUDA. Si obtienes un error como este:
ImportError: cannot import name pywrap_tensorflow
Asegúrese de no haber iniciado su entorno interactivo desde la carpeta de origen de TensorFlow. Si obtienes un error que se ve así:
ImportError: No module named tensorflow
Verifique que TensorFlow esté instalado correctamente. Si está utilizando Virtualenv o Conda, asegúrese de que su entorno TensorFlow esté activo cuando inicie su software interactivo de Python. Tenga en cuenta que si tiene varios terminales en ejecución, un terminal puede tener un entorno
activo mientras que el otro no lo hace. Asumiendo que la importación funcionó sin problemas, podemos pasar a la siguiente parte del código:
Este es el mismo código que vimos anteriormente: siéntase libre de cambiar los valores o parámetros de nombre de estas constantes. En este libro, nos ceñiremos a los mismos valores que teníamos por coherencia.
A continuación, tenemos las primeras operaciones en nuestro código que realizan una función matemática. Si estas cansado de tf.mul y tf.add, siéntase libre de intercambiar en tf.sub, tf.div o tf.mod, que realizan operaciones de resta, división o módulo, respectivamente.
tf.div realiza una división de enteros o una división de punto flotante según el tipo de entrada provista. Si quieres asegurar la división de punto flotante, prueba tf.truediv!
Luego podemos agregar en nuestro nodo final:
Probablemente haya notado que no se ha producido ningún resultado al llamar a estas operaciones. Esto se debe a que simplemente han estado agregando Ops a un gráfico detrás de la escena, pero en realidad no se realiza ningún cálculo. Para ejecutar el gráfico, vamos a necesitar una sesión de TensorFlow:
Los objetos de sesión se encargan de supervisar los gráficos a medida que se ejecutan, y son la interfaz principal para ejecutar gráficos. Vamos a discutir en profundidad los objetos de la sesión después de este ejercicio, pero por ahora, simplemente sepa que en TensorFlow necesita una sesión si desea ejecutar su código. Asignamos nuestra sesión a la variable sess para que podamos acceder a ella más tarde.
En InteractiveSession: Hay una ligera variación en tf.Session se llama tf.InteractiveSession. En realidad, está diseñado para su uso en el software Python interactivo, como los que puede estar usando, y hace que algunas formas alternativas de ejecutar el código sean un poco más simples. Las desventajas son que es menos útil para escribir TensorFlow en un archivo de Python, y que extrae la información que debe aprender como nuevo usuario de TensorFlow. Además, al final no guarda tantas pulsaciones de teclas. En este libro, nos atendremos a la sesión estándar:
¡Aquí es donde finalmente podemos ver el resultado! Después de ejecutar este código, debería ver la salida de su gráfico. En nuestro gráfico de ejemplo, la salida fue 23, pero será diferente dependiendo de las funciones y entradas exactas que usó. Eso no es todo lo que podemos hacer sin embargo. Intentemos enchufar uno de los otros nodos en nuestro gráfico para sess.run():
Debería ver el valor intermedio de c como el resultado de esta llamada (15, en el código de ejemplo). TensorFlow no hace ninguna suposición sobre los gráficos que creas, y para todos los programas, el nodo c podría ser la salida que deseas. De hecho, puede usar el run () en cualquier Operación en su gráfica. Cuando pasas un Op en sess.run (), lo que esencialmente le estás diciendo a TensorFlow es: “Aquí hay un nodo que me gustaría mostrar. Por favor, ejecute todas las operaciones necesarias para calcular ese nodo ". ¡Juega y trata de generar algunos de los otros nodos en tu gráfica! También puede guardar la salida de la ejecución del gráfico, guardar la salida del nodo e en una variable de Python llamada salida:
¡Genial! Ahora que tenemos una sesión activa y nuestro gráfico definido, visualicemos para confirmar que está estructurado de la misma manera que lo dibujamos. Para hacer eso, vamos a utilizar TensorBoard, que vino instalado con TensorFlow. Para aprovechar TensorBoard, solo vamos a
Agregue una línea a nuestro código:
Vamos a desglosar lo que hace este código. Estamos creando un objeto TensorFlow SummaryWriter, y lo asignamos al escritor de variables. En este ejercicio, no realizaremos acciones adicionales con el SummaryWriter, pero en el futuro las utilizaremos para guardar datos y estadísticas de resumen.
a partir de nuestros gráficos, así que lo asignamos a una variable para acostumbrarnos. Pasamos en dos parámetros para inicializar SummaryWriter. El primero es un directorio de salida de cadena, que es donde la descripción del gráfico se almacenará en el disco. En este caso, los archivos creados se colocarán en un directorio llamado my_graph y se ubicarán dentro del directorio que están ejecutando nuestro código Python. La segunda entrada que pasamos a SummaryWriter es el atributo gráfico de nuestra sesión. Los objetos de sesión, como gestores de gráficos definidos en TensorFlow, tienen un atributo de gráfico que es una referencia al gráfico del que están realizando un seguimiento. Al pasar esto a SummaryWriter, el escritor emitirá una descripción del gráfico dentro del directorio "my_graph". Los objetos SummaryWriter escriben estos datos inmediatamente después de la inicialización,
Así que una vez que haya ejecutado esta línea de código, podemos iniciar TensorBoard. Vaya a su terminal y escriba el siguiente comando, asegurándose de que su directorio de trabajo actual sea el mismo que donde ejecutó su código Python (debería ver el directorio "my_graph" listado):
Debería ver alguna información de registro impresa en la consola y luego el mensaje "Iniciando TensorBoard en el puerto 6006". Lo que has hecho es iniciar un servidor TensorBoard que utiliza datos del directorio "my_graph". De forma predeterminada, el servidor se inició en el puerto 6006 para acceder a TensorBoard, abrir
un navegador y escriba http://localhost:6006 Te saludará con una pantalla temática naranja y blanca:
No se alarme por el mensaje de advertencia "No se encontraron datos escalares". Eso solo significa que no guardamos ninguna estadística de resumen para que TensorBoard se muestre; normalmente, esta pantalla nos muestra la información que le pedimos a TensorFlow que guarde usando nuestro SummaryWriter. Desde que nosotros no escribió ninguna estadística adicional, no hay nada que mostrar. Sin embargo, está bien, ya que estamos aquí para admirar nuestro hermoso gráfico. Haga clic en el enlace "Gráficos" en la parte superior de la página, y debería ver una pantalla similar a esta:
Eso es lo que más me gusta! Si su gráfico es demasiado pequeño, puede ampliar TensorBoard desplazando la rueda hacia arriba. Puede ver cómo cada uno de los nodos está etiquetado según el parámetro de nombre que pasamos a cada Operación. Si hace clic en los nodos, puede obtener información sobre ellos, como a qué otros nodos están conectados. Notarás que las "entradas", a y b parecen estar duplicadas, pero si pasas el mouse o haces clic en cualquiera de los nodos etiquetados como "input_a", deberías ver que ambas se resaltan juntas. Este gráfico no se ve exactamente como el gráfico que dibujamos arriba, pero es el mismo gráfico ya que los nodos de "entrada" simplemente se muestran dos veces. ¡Bastante impresionante!
¡Y eso es! Has escrito oficialmente y ejecutado tu primera vez un Gráfico de TensorFlow, ¡y lo has comprobado en TensorBoard! ¡No está mal para unas pocas líneas de código! Para más práctica, intente agregar algunos nodos más, experimente con algunas de las diferentes operaciones matemáticas que se mencionan y agregue algunos nodos más constantes. Ejecute los diferentes nodos que ha agregado y asegúrese de entender exactamente cómo se mueven los datos a través del gráfico.
Una vez que haya terminado de construir su gráfica, seamos ordenados y cerremos el
Sesión y SummaryWriter:
Comentarios
Publicar un comentario