Eche un vistazo a esto … Lo hará a través de los conceptos básicos, después de lo cual podrá aprenderlo con facilidad …
Conociendo TensorFlow
Antes de saltar a los algoritmos de aprendizaje automático, primero debe familiarizarse con el uso de las herramientas. Este artículo cubre algunas ventajas esenciales de TensorFlow, para convencerlo de que es la biblioteca de aprendizaje automático de su elección.
Como un experimento mental, imaginemos lo que sucede cuando escribimos el código de Python sin una biblioteca de computación útil. Será como usar un nuevo teléfono inteligente sin instalar aplicaciones adicionales. El teléfono aún funciona, pero sería más productivo si tuviera las aplicaciones correctas.
Considere lo siguiente … Usted es el propietario de un negocio que sigue el flujo de ventas. Quiere calcular sus ingresos por la venta de sus productos. Su inventario consta de 100 productos diferentes y usted representa cada precio en un vector llamado precios. Otro vector de cantidades llamadas de tamaño 100 representa el recuento de inventario de cada artículo. Puede escribir el siguiente fragmento de código de Python que se muestra en el listado 1 para calcular los ingresos de la venta de todos los productos. Tenga en cuenta que este código no importa ninguna biblioteca.
Listado 1. Cálculo del producto interno de dos vectores sin usar ninguna biblioteca
Eso es un montón de código solo para calcular el producto interno de dos vectores (también conocido como producto punto). Imagine cuánto código se requeriría para algo más complicado, como resolver ecuaciones lineales o calcular la distancia entre dos vectores.
Al instalar la biblioteca TensorFlow, también instala una biblioteca de Python conocida y robusta llamada NumPy, que facilita la manipulación matemática en Python. Usar Python sin sus bibliotecas (por ejemplo, NumPy y TensorFlow) es como usar una cámara sin enfoque automático: usted gana más flexibilidad, pero puede cometer fácilmente errores por descuido. Ya es bastante fácil cometer errores en el aprendizaje automático, así que mantengamos nuestra cámara en enfoque automático y utilicemos TensorFlow para ayudar a automatizar algunos desarrollos de software tediosos.
El Listado 2 muestra cómo escribir concisamente el mismo producto interno usando NumPy.
Listado 2. Cálculo del producto interno usando NumPy
Python es un lenguaje sucinto. Afortunadamente para ti, eso significa que no verás páginas y códigos de código críptico. Por otro lado, la brevedad del lenguaje Python implica que detrás de cada línea de código suceden muchas cosas, con las que debe familiarizarse cuidadosamente mientras trabaja.
Por cierto … La documentación detallada sobre varias funciones para las API de Python y C ++ para TensorFlow está disponible en https://www.tensorflow.org/api_docs/index.html .
Este artículo está orientado hacia el uso de TensorFlow para cálculos, porque el aprendizaje automático se basa en formulaciones matemáticas. Después de revisar los ejemplos y las listas de códigos, podrá usar TensorFlow para algunas tareas arbitrarias, como el cálculo de estadísticas en big data. El enfoque aquí será totalmente acerca de cómo usar TensorFlow, en lugar del aprendizaje automático en general.
Los algoritmos de aprendizaje automático requieren una gran cantidad de operaciones matemáticas. A menudo, un algoritmo se reduce a una composición de funciones simples iteradas hasta la convergencia. Claro, puede usar cualquier lenguaje de programación estándar para realizar estos cálculos, pero el secreto de un código manejable y de ejecución es el uso de una biblioteca bien escrita.
Eso suena como un comienzo suave, ¿verdad? Sin más preámbulos, ¡escribamos nuestro primer código TensorFlow!
Asegurando que TensorFlow funcione
F
En primer lugar, debemos asegurarnos de que todo funcione correctamente. Verifique el nivel de aceite en su automóvil, repare el fusible fundido en su sótano y asegúrese de que su saldo de crédito sea cero.
Solo bromeo, estoy hablando de TensorFlow.
Continúe y cree un nuevo archivo llamado http://test.py para nuestro primer código. Importe TensorFlow ejecutando el siguiente script:
importar tensorflow como tf
Esta importación única prepara TensorFlow para su oferta. Si el intérprete de Python no se queja, ¡entonces estamos listos para comenzar a usar TensorFlow!
¿Tiene dificultades técnicas? Una causa común de error en este paso es si instaló la versión de GPU y la biblioteca no puede buscar los controladores CUDA. Recuerde, si compiló la biblioteca con CUDA, necesita actualizar sus variables de entorno con la ruta a CUDA. Verifique las instrucciones de CUDA en TensorFlow. (Consulte https://www.tensorflow.org/versions/master/get_started/os_setup.html#optional-linux-enable-gpu-support para obtener más información).
Apegándose a las convenciones de TensorFlow
La biblioteca TensorFlow generalmente se importa con el nombre calificado tf. En general, calificar TensorFlow con tf es una buena idea para mantener la coherencia con otros desarrolladores y proyectos de código abierto TensorFlow. Puede elegir no calificarlo o cambiar el nombre de calificación, pero luego reutilizar con éxito los fragmentos de código de TensorFlow de otras personas en sus propios proyectos será un proceso involucrado.
Representando tensores
Ahora que sabemos cómo importar TensorFlow en un archivo fuente de Python, ¡comencemos a usarlo! Una forma conveniente de describir un objeto en el mundo real es enumerar sus propiedades o características. Por ejemplo, puede describir un automóvil por su color, modelo, tipo de motor y kilometraje. Una lista ordenada de algunas características se denomina vector de características, y eso es exactamente lo que representaremos en el código TensorFlow.
Los vectores de características son uno de los dispositivos más útiles en el aprendizaje automático debido a su simplicidad (son listas de números). Cada elemento de datos generalmente consta de un vector de características y un buen conjunto de datos tiene miles, si no miles, de estos vectores de características. Sin duda, a menudo tratará con más de un vector a la vez. Una matriz representa de manera concisa una lista de vectores, donde cada columna de una matriz es un vector de características.
La sintaxis para representar matrices en TensorFlow es un vector de vectores, cada uno de la misma longitud. La Figura 1 es un ejemplo de una matriz con dos filas y tres columnas, como [[1, 2, 3], [4, 5, 6]]. Note, este es un vector que contiene dos elementos, y cada elemento corresponde a una fila de la matriz.
Figura 1. La matriz en la mitad inferior del diagrama es una visualización de su notación de código compacto en la mitad superior del diagrama. Esta forma de notación es un paradigma común en la mayoría de las bibliotecas informáticas científicas.
Accedemos a un elemento en una matriz especificando sus índices de fila y columna. Por ejemplo, la primera fila y la primera columna indican el primer elemento superior izquierdo. A veces es conveniente usar más de dos índices, como cuando se hace referencia a un píxel en una imagen en color, no solo por su fila y columna, sino también por su canal rojo / verde / azul. Un tensor es una generalización de una matriz que especifica un elemento mediante un número arbitrario de índices.
Ejemplo de un tensor … Supongamos que una escuela primaria impone asientos asignados a sus estudiantes. Tú eres el director, y eres terrible con los nombres. Afortunadamente, cada aula tiene una cuadrícula de asientos, donde puede apodar fácilmente a un estudiante por su índice de filas y columnas.
Hay varias aulas, por lo que no puedes decir “¡Buenos días 4,10! Mantén el buen trabajo ”. También debe especificar el aula,“ Hola 4,10 del aula 2. ”A diferencia de una matriz, que necesita solo dos índices para especificar un elemento, los estudiantes de esta escuela necesitan tres números. ¡Todos son parte de un tensor de rango tres!
La sintaxis de los tensores es aún más vectores anidados. Por ejemplo, un tensor de 2 por 3 por 2 es [[[1,2], [3,4], [5,6]], [[7,8], [9,10], [ 11,12]]], que se puede considerar como dos matrices, cada una de tamaño 3 por 2. En consecuencia, decimos que este tensor tiene un rango de 3. En general, el rango de un tensor es el número de índices necesarios para especificar un elemento. Los algoritmos de aprendizaje automático en TensorFlow actúan sobre Tensors, y es importante entender cómo usarlos.
Figura 2. Este tensor se puede considerar como matrices múltiples apiladas una encima de la otra. Para especificar un elemento, debe indicar la fila y la columna, así como a qué matriz se está accediendo. Por lo tanto, el rango de este tensor es tres.
Es fácil perderse en las muchas formas de representar un tensor. Intuitivamente, cada una de las siguientes tres líneas de código en el Listado 3 está tratando de representar la misma matriz de 2 por 2. Esta matriz representa dos vectores de características de dos dimensiones cada uno. Podría, por ejemplo, representar las calificaciones de dos personas de dos películas. Cada persona, indexada por la fila de la matriz, asigna un número para describir su revisión de la película, indexada por la columna. Ejecute el código para ver cómo generar una matriz en TensorFlow.
Listado 3. Diferentes formas de representar los tensores.
La primera variable (m1) es una lista, la segunda variable (m2) es una ndarray de la biblioteca NumPy, y la última variable (m3) es el objeto TensorFlow’s Tensor. Todos los operadores en TensorFlow, como neg, están diseñados para operar en objetos tensoriales. Una función conveniente que podemos esparcir en cualquier lugar para asegurarnos de que estamos tratando con tensores, a diferencia de los otros tipos, es tf.convert_to_tensor (…). La mayoría de las funciones en la biblioteca TensorFlow ya realizan esta función (de manera redundante), incluso si se olvida de hacerlo. El uso de tf.convert_to_tensor (…) es opcional, pero lo muestro aquí porque ayuda a desmitificar el sistema de tipo implícito que se maneja en la biblioteca. El listado 3 mencionado anteriormente produce el siguiente resultado tres veces:
Echemos otro vistazo a la definición de tensores en el código. Después de importar la biblioteca TensorFlow, podemos usar el operador constante de la siguiente manera en el Listado 4.
Listado 4. Creando tensores
El listado de ejecución 4 produce el siguiente resultado:
Tensor (“Const: 0”,
forma = TensorShape ([Dimensión (1),
Dimensión (2)]),
dtype = float32)
Tensor (“Const_1: 0”,
forma = TensorShape ([Dimensión (2),
Dimensión (1)]),
dtype = int32)
Tensor (“Const_2: 0”,
forma = TensorShape ([Dimensión (2),
Dimensión (3),
Dimensión (2)]),
dtype = int32)
Como puede ver en la salida, cada tensor está representado por el objeto Tensor con un nombre adecuado. Cada objeto Tensor tiene una etiqueta única (nombre), una dimensión (forma) para definir su estructura y el tipo de datos (dtype) para especificar el tipo de valores que manipularemos. Debido a que no proporcionamos un nombre explícitamente, la biblioteca los generó automáticamente: “Const: 0”, “Const_1: 0” y “Const_2: 0”.
Tipos de tensor
Observe que cada uno de los elementos de matrix1 termina con un punto decimal. El punto decimal le dice a Python que el tipo de datos de los elementos no es un entero, sino un flotador. Podemos pasar valores de dtype explícitos. Al igual que las matrices NumPy, los tensores adoptan un tipo de datos que especifica el tipo de valores que manipularemos en ese tensor.
TensorFlow también viene con algunos constructores convenientes para algunos tensores simples. Por ejemplo, tf.zeros (forma) crea un tensor con todos los valores inicializados en cero de una forma específica. De manera similar, tf.ones (forma) crea un tensor de una forma específica con todos los valores inicializados en uno. El argumento de forma es un tensor unidimensional (1D) de tipo int32 (una lista de enteros) que describe las dimensiones del tensor.
Creación de operadores
norte
Como tenemos algunos tensores de arranque listos para usar, podemos aplicar operadores más interesantes, como la suma o la multiplicación. Considere cada fila de una matriz que representa la transacción de dinero a (valor positivo) y de (valor negativo) a otra persona. Negar la matriz es una forma de representar el historial de transacciones del flujo de dinero de la otra persona. Comencemos de manera simple y ejecutemos la operación de negación (abreviatura de operación) en nuestro tensor de matriz1 del listado 4. Negar una matriz convierte los números positivos en números negativos de la misma magnitud, y viceversa.
La negación es una de las operaciones más simples. Como se muestra en el listado 5, la negación toma solo un tensor como entrada y produce un tensor con cada elemento negado; ahora, intente ejecutar el código usted mismo. Si dominas cómo definir la negación, te proporcionará un escalón para generalizar esa habilidad a todas las demás operaciones de TensorFlow.
Aparte … Definir una operación, como la negación, es diferente de ejecutarla.
Listado 5 Usando el operador de negación
El Listado 5 genera el siguiente resultado:
Tensor (“Neg: 0”, forma = (1, 2), dtype = int32)
Operadores útiles de TensorFlow
La documentación oficial establece cuidadosamente todas las operaciones matemáticas disponibles: https://www.tensorflow.org/api_docs/Python/math_ops.html .
Algunos ejemplos específicos de operadores comúnmente usados incluyen:
tf.add (x, y)
Suma dos tensores del mismo tipo, x + y
tf.sub (x, y)
Resta tensores del mismo tipo, x – y
tf.mul (x, y)
Multiplica dos tensores de forma elemental.
tf.pow (x, y)
Toma el poder de los elementos de x a y
tf.exp (x)
Equivalente a pow (e, x), donde e es el número de Euler (2.718…)
tf.sqrt (x)
Equivalente a pow (x, 0.5)
tf.div (x, y)
Toma la división de x y y de elementos
tf.truediv (x, y)
Igual que tf.div, excepto que convierte los argumentos como un flotador
tf.floordiv (x, y)
Igual que truediv, excepto que redondea la respuesta final en un entero
tf.mod (x, y)
Toma el resto del elemento de la división
Ejercicio … Use los operadores TensorFlow que hemos aprendido para producir la Distribución Gaussiana (también conocida como Distribución Normal). Vea la Figura 3 para una pista. Para referencia, puede encontrar la densidad de probabilidad de la distribución normal en línea: https://en.wikipedia.org/wiki/Normal_distribution .
La mayoría de las expresiones matemáticas como “*”, “-“, “+”, etc. son accesos directos para su equivalente de TensorFlow, en aras de la brevedad. La función gaussiana incluye muchas operaciones, y es más limpio usar algunas anotaciones cortas como las siguientes:
desde matemáticas import pi
media = 1.0
sigma = 0.0
(tf.exp (tf.neg (tf.pow (x – media, 2.0) /
(2.0 * tf.pow (sigma, 2.0)))) *
(1.0 / (sigma * tf.sqrt (2.0 * pi))))
Figura 3. El gráfico representa las operaciones necesarias para producir una distribución gaussiana. Los enlaces entre los nodos representan cómo los datos fluyen de una operación a la siguiente. Las operaciones en sí mismas son simples, pero la complejidad surge de cómo se entrelazan.
Como puede ver, los algoritmos de TensorFlow son fáciles de visualizar. Pueden ser descritos por diagramas de flujo. El término técnico (y más correcto) para el diagrama de flujo es un gráfico. Cada flecha en un diagrama de flujo se llama el borde del gráfico. Además, cada estado del diagrama de flujo se denomina nodo.
Ejecutando operadores con sesiones.
UNA
sesión es un entorno de un sistema de software que describe cómo deben ejecutarse las líneas de código. En TensorFlow, una sesión configura cómo los dispositivos de hardware (como la CPU y la GPU) se comunican entre sí. De esa manera, puede diseñar su algoritmo de aprendizaje automático sin preocuparse por la microgestión del hardware en el que se ejecuta. Por supuesto, más tarde puede configurar la sesión para cambiar su comportamiento sin cambiar una línea del código de aprendizaje automático.
Para ejecutar una operación y recuperar su valor calculado, TensorFlow requiere una sesión. Solo una sesión registrada puede llenar los valores de un objeto Tensor. Para hacerlo, debe crear una clase de sesión utilizando tf.Session () y decirle que ejecute un operador (listado 6). El resultado será un valor que puede usar más adelante para otros cálculos.
Listado 6. Usando una sesión
¡Felicidades! Acaba de escribir su primer código completo de TensorFlow. Aunque todo lo que hace es negar una matriz para producir [[-1, -2]], la sobrecarga y el marco del núcleo son exactamente iguales a todo lo demás en TensorFlow.
Configuraciones de sesión
También puede pasar opciones a tf.Session. Por ejemplo, TensorFlow determina automáticamente la mejor manera de asignar una GPU o un dispositivo de CPU a una operación, dependiendo de lo que esté disponible. Podemos pasar una opción adicional, log_device_placements = True, al crear una sesión, como se muestra en el listado 7.
Listado 7. Registrando una sesión
Esto genera información sobre qué dispositivos de CPU / GPU se utilizan en la sesión para cada operación. Por ejemplo, la ejecución del listado 6 da como resultado rastros de resultados como los siguientes para mostrar qué dispositivo se usó para ejecutar la operación de negación:
Neg: / job: localhost / replica: 0 / task: 0 / cpu: 0
Las sesiones son esenciales en el código TensorFlow. Necesitas llamar a una sesión para realmente “ejecutar” las matemáticas. La Figura 4 muestra cómo los diferentes componentes de TensorFlow interactúan con la línea de aprendizaje automático. Una sesión no solo ejecuta una operación gráfica, sino que también puede tomar marcadores de posición, variables y constantes como entrada. Hemos usado constantes hasta ahora, pero en secciones posteriores comenzaremos a usar variables y marcadores de posición. Aquí hay una visión general rápida de estos tres tipos de valores.
•
Marcador de posición: un valor que no está asignado, pero que la sesión inicializará donde sea que se ejecute.
•
Variable: un valor que puede cambiar, como un parámetro de un modelo de aprendizaje automático.
•
Constante: un valor que no cambia, como los hiper-parámetros o la configuración.
Figura 4. La sesión determina cómo se utilizará el hardware para procesar de manera más eficiente el gráfico. Cuando se inicia la sesión, asigna los dispositivos de CPU y GPU a cada uno de los nodos. Después del procesamiento, la sesión genera datos en un formato utilizable, como una matriz NumPy. Opcionalmente, una sesión puede incluir marcadores de posición, variables y constantes.
¿Hambriento de más?
Eso es todo por ahora, espero que se haya familiarizado con éxito con algunos de los mecanismos básicos de TensorFlow.