Tutorial TensorFlow para principiantes 2020

TensorFlow es el segundo marco de aprendizaje automático que Google creó y usó para diseñar, construir y entrenar modelos de aprendizaje profundo. Puede usar la biblioteca TensorFlow para realizar cálculos numéricos, lo que en sí mismo no parece demasiado especial, pero estos cálculos se realizan con gráficos de flujo de datos. En estos gráficos, los nodos representan operaciones matemáticas, mientras que los bordes representan los datos, que generalmente son conjuntos de datos multidimensionales o tensores, que se comunican entre estos bordes.

¿Lo ves? ¡El nombre “TensorFlow” se deriva de las operaciones que realizan las redes neuronales en conjuntos de datos multidimensionales o tensores! Es literalmente un flujo de tensores. Por ahora, esto es todo lo que necesita saber sobre los tensores, ¡pero profundizará en esto en las siguientes secciones!
El tutorial de hoy de TensorFlow para principiantes le presentará cómo realizar un aprendizaje profundo de una manera interactiva:
  • Primero aprenderá más sobre los tensores ;
  • Luego, el tutorial explicará brevemente algunas de las formas en que puede instalar TensorFlow en su sistema para que pueda comenzar y cargar datos en su espacio de trabajo;
  • Después de esto, repasará algunos de los conceptos básicos de TensorFlow : verá cómo puede comenzar fácilmente con cálculos simples.
  • Después de esto, comenzará el trabajo real: cargará datos en las señales de tráfico belgas y lo explorará con estadísticas y trazados simples.
  • En su exploración, verá que es necesario manipular sus datos de tal manera que pueda alimentarlos a su modelo. Es por eso que se tomará el tiempo para cambiar el tamaño de sus imágenes y convertirlas a escala de grises.
  • ¡Luego, finalmente puede comenzar con su modelo de red neuronal ! Construirá su modelo de capa por capa;
  • Una vez que la arquitectura está configurada, puede usarla para entrenar su modelo de forma interactiva y, finalmente, también evaluarlo al proporcionarle algunos datos de prueba.
  • Por último, obtendrá algunos consejos para mejoras adicionales que puede hacer al modelo que acaba de construir y cómo puede continuar su aprendizaje con TensorFlow.

Descargue el cuaderno de este tutorial aquí .
También, usted podría estar interesado en un curso de aprendizaje profundo en Python , de DataCamp tutorial Keras o los Keras con R tutorial .


Introduciendo tensores

Para comprender bien los tensores, es bueno tener algunos conocimientos prácticos de álgebra lineal y cálculo vectorial. Ya leyó en la introducción que los tensores se implementan en TensorFlow como matrices de datos multidimensionales, pero tal vez sea necesaria una introducción más para comprender completamente los tensores y su uso en el aprendizaje automático.
Antes de entrar en vectores planos, es una buena idea revisar brevemente el concepto de “vectores”; Los vectores son tipos especiales de matrices, que son matrices rectangulares de números. Debido a que los vectores son colecciones ordenadas de números, a menudo se ven como matrices de columnas: tienen solo una columna y un cierto número de filas. En otros términos, también podría considerar los vectores como magnitudes escalares a las que se les ha dado una dirección.
Recuerde : un ejemplo de un escalar es “5 metros” o “60 m / seg”, mientras que un vector es, por ejemplo, “5 metros al norte” o “60 m / seg Este”. La diferencia entre estos dos es obviamente que el vector tiene una dirección. Sin embargo, estos ejemplos que ha visto hasta ahora pueden parecer muy alejados de los vectores que puede encontrar cuando trabaja con problemas de aprendizaje automático. Esto es normal; La longitud de un vector matemático es un número puro: es absoluto. La dirección, por otro lado, es relativa: se mide en relación con alguna dirección de referencia y tiene unidades de radianes o grados. Por lo general, asume que la dirección es positiva y en rotación en sentido antihorario desde la dirección de referencia.

Visualmente, por supuesto, representas vectores como flechas, como puedes ver en la imagen de arriba. Esto significa que puede considerar los vectores también como flechas que tienen dirección y longitud. La dirección se indica con la punta de la flecha, mientras que la longitud se indica con la longitud de la flecha.
Entonces, ¿qué pasa con los vectores planos entonces?
Los vectores planos son la configuración más simple de tensores. Son muy parecidos a los vectores regulares como has visto anteriormente, con la única diferencia de que se encuentran en un espacio vectorial. Para entender esto mejor, comencemos con un ejemplo: tienes un vector que es 2 X 1 . Esto significa que el vector pertenece al conjunto de números reales que vienen emparejados de dos en dos. O, dicho de otra manera, son parte de dos espacios. En tales casos, puede representar vectores en el plano de coordenadas (x, y) con flechas o rayos.


Al trabajar desde este plano de coordenadas en una posición estándar donde los vectores tienen su punto final en el origen (0,0) , puede derivar la coordenada x mirando la primera fila del vector, mientras que encontrará la coordenada y en la segunda fila. Por supuesto, esta posición estándar no siempre necesita ser mantenida: los vectores pueden moverse paralelos a sí mismos en el plano sin experimentar cambios.
Tenga en cuenta que, de manera similar, para los vectores que son de tamaño 3 X 1 , se habla del espacio triple. Puede representar el vector como una figura tridimensional con flechas que apuntan a posiciones en el ritmo del vector: se dibujan en los ejes estándar x , y y z .
Es bueno tener estos vectores y representarlos en el plano de coordenadas, pero en esencia, tienes estos vectores para que puedas realizar operaciones en ellos y una cosa que puede ayudarte a hacerlo es expresar tus vectores como bases o unidades vectores
Los vectores unitarios son vectores con una magnitud de uno. A menudo reconocerá el vector unitario por una letra minúscula con un circunflejo o “sombrero”. Los vectores unitarios serán convenientes si desea expresar un vector 2-D o 3-D como una suma de dos o tres componentes ortogonales, como los ejes xy y, o el eje z.
Y cuando habla de expresar un vector, por ejemplo, como sumas de componentes, verá que está hablando de vectores componentes, que 

son dos o más vectores cuya suma es ese vector dado.


Consejo : ¡mire este video , que explica qué son los tensores con la ayuda de simples objetos domésticos!
Además de los vectores planos, también los patrones y operadores lineales son otros dos casos en los que los tres tienen una cosa en común: son casos específicos de tensores. Aún recuerdas cómo se caracterizó un vector en la sección anterior como magnitudes escalares a las que se les ha dado una dirección. Un tensor, entonces, es la representación matemática de una entidad física que puede caracterizarse por magnitud y múltiples direcciones.
Y, al igual que representa un escalar con un solo número y un vector con una secuencia de tres números en un espacio tridimensional, por ejemplo, un tensor puede representarse mediante una matriz de números 3R en un espacio tridimensional.
La “R” en esta notación representa el rango del tensor: esto significa que en un espacio tridimensional, un tensor de segundo rango puede ser representado por 3 a la potencia de 2 o 9 números. En un espacio N-dimensional, los escalares requerirán solo un número, mientras que los vectores requerirán N números, y los tensores requerirán números N ^ R. Esto explica por qué a menudo escuchas que los escalares son tensores de rango 0: dado que no tienen dirección, puedes representarlos con un número.
Con esto en mente, es bastante fácil reconocer escalares, vectores y tensores y diferenciarlos: los escalares se pueden representar con un solo número, los vectores con un conjunto ordenado de números y los tensores con una matriz de números.
Lo que hace que los tensores sean tan especiales es la combinación de componentes y vectores básicos: los vectores básicos se transforman de una manera entre los marcos de referencia y los componentes se transforman de tal manera que la combinación entre componentes y vectores básicos sea la misma.

Instalar TensorFlow

Ahora que sabe más sobre TensorFlow, es hora de comenzar e instalar la biblioteca. Aquí, es bueno saber que TensorFlow proporciona API para Python, C ++, Haskell, Java, Go, Rust, y también hay un paquete de terceros para R llamado tensorflow.
Sugerencia : si desea obtener más información sobre los paquetes de aprendizaje profundo en R, considere consultar el tutorial de Keras : aprendizaje profundo en R de DataCamp .
En este tutorial, descargará una versión de TensorFlow que le permitirá escribir el código para su proyecto de aprendizaje profundo en Python. En la página web de instalación TensorFlow , verá algunas de las formas más comunes y noticias de instrucciones para instalar TensorFlow usando virtualenvpip, estibador y, por último, también hay algunas de las otras formas de instalación TensorFlow en su ordenador personal.
Nota También puede instalar TensorFlow con Conda si está trabajando en Windows. Sin embargo, dado que la instalación de TensorFlow es compatible con la comunidad, es mejor consultar las instrucciones de instalación oficiales .
Ahora que ha pasado por el proceso de instalación, es hora de verificar que haya instalado TensorFlow correctamente importándolo en su espacio de trabajo con el alias tf:
importar tensorflow como tf
Tenga en cuenta que el alias que utilizó en la línea de código anterior es una especie de convención: se utiliza para garantizar que sea coherente con otros desarrolladores que utilizan TensorFlow en proyectos de ciencia de datos, por un lado, y con proyectos TensorFlow de código abierto. por otra parte.

Comenzando con TensorFlow: Conceptos básicos

En general, escribirá programas TensorFlow, que ejecuta como un fragmento; Esto es a primera vista algo contradictorio cuando trabajas con Python. Sin embargo, si lo desea, también puede usar la sesión interactiva de TensorFlow, que puede usar para trabajar de manera más interactiva con la biblioteca. Esto es especialmente útil cuando estás acostumbrado a trabajar con IPython.
Para este tutorial, se centrará en la segunda opción: esto lo ayudará a comenzar con el aprendizaje profundo en TensorFlow. Pero antes de continuar con esto, primero intentemos algunas cosas menores antes de comenzar con el trabajo pesado.
Primero, importe la tensorflowbiblioteca bajo el alias tf, como ha visto en la sección anterior. Luego, inicialice dos variables que en realidad son constantes. Pase una matriz de cuatro números a la constant()función.
Tenga en cuenta que también podría pasar un número entero, pero que la mayoría de las veces, se encontrará trabajando con matrices. Como viste en la introducción, ¡los tensores tienen que ver con matrices! Así que asegúrese de pasar una matriz 🙂 A continuación, puede usar multiply()para multiplicar sus dos variables. Almacene el resultado en la resultvariable. Por último, imprima resultcon la ayuda de la print()función. Encuentra el ejercicio aquí .
Tenga en cuenta que ha definido constantes en el fragmento de código de DataCamp Light anterior. Sin embargo, hay otros dos tipos de valores que puede utilizar, a saber, marcadores de posición , que son valores que no están asignados y que la sesión inicializará cuando lo ejecute. Como el nombre ya fue revelado, es solo un marcador de posición para un tensor que siempre se alimentará cuando se ejecute la sesión; También hay variables , que son valores que pueden cambiar. Las constantes, como ya habrá reunido, son valores que no cambian.


El resultado de las líneas de código es un tensor abstracto en el gráfico de cálculo. Sin embargo, al contrario de lo que cabría esperar, en resultrealidad no se calcula; Simplemente definió el modelo pero no se ejecutó ningún proceso para calcular el resultado. Puede ver esto en la copia impresa: realmente no hay un resultado que desee ver (es decir, 30). ¡Esto significa que TensorFlow tiene una evaluación perezosa!
Sin embargo, si desea ver el resultado, debe ejecutar este código en una sesión interactiva. Puede hacerlo de varias maneras, como se demuestra en los fragmentos de código de DataCamp Light a continuación .
Tenga en cuenta que también puede usar las siguientes líneas de código para iniciar una sesión interactiva, ejecutar resulty cerrar la sesión automáticamente nuevamente después de imprimir eloutput.
En los fragmentos de código anteriores , acaba de definir una sesión predeterminada, pero también es bueno saber que también puede pasar opciones. Puede, por ejemplo, especificar el configargumento y luego usar el ConfigProtobúfer de protocolo para agregar opciones de configuración para su sesión.
Por ejemplo, si agrega config=tf.ConfigProto(log_device_placement=True)a su sesión, asegúrese de registrar el dispositivo GPU o CPU asignado a una operación. Luego obtendrá información sobre qué dispositivos se utilizan en la sesión para cada operación. Se podría utilizar la siguiente sesión de configuración también, por ejemplo, cuando se utiliza restricciones blandas para la colocación del dispositivo: config=tf.ConfigProto(allow_soft_placement=True).
Ahora que tiene TensorFlow instalado e importado a su espacio de trabajo y ha seguido los conceptos básicos para trabajar con este paquete, es hora de dejar esto de lado por un momento y centrar su atención en sus datos. Como siempre, primero se tomará su tiempo para explorar y comprender mejor sus datos antes de comenzar a modelar su red neuronal.

Señales de tráfico belgas: antecedentes

Si bien el tráfico es un tema que generalmente se conoce entre todos, no está de más revisar brevemente las observaciones que se incluyen en este conjunto de datos para ver si comprende todo antes de comenzar. En esencia, en esta sección, se pondrá al día con el conocimiento del dominio que necesita para avanzar con este tutorial.
Por supuesto, como soy belga, me aseguraré de que también recibas algunas anécdotas 🙂
  • Las señales de tráfico belgas suelen estar en holandés y francés. Es bueno saberlo, pero para el conjunto de datos con el que trabajará, ¡no es demasiado importante!
  • Hay seis categorías de señales de tráfico en Bélgica: señales de advertencia, señales de prioridad, señales prohibitivas, señales obligatorias, señales relacionadas con el estacionamiento y la parada en la carretera y, por último, señales de designación.
  • El 1 de enero de 2017, se eliminaron más de 30,000 señales de tránsito de las carreteras belgas, todas señales prohibitivas relacionadas con la velocidad.
  • Hablando de eliminación, la abrumadora presencia de señales de tráfico ha sido una discusión en curso en Bélgica (y, por extensión, en toda la Unión Europea).

Cargando y explorando los datos

Ahora que ha reunido más información de fondo, es hora de descargar el conjunto de datos aquí . Debería obtener los dos archivos zip enumerados junto a “BelgiumTS for Classification (imágenes recortadas), que se denominan” BelgiumTSC_Training “y” BelgiumTSC_Testing “.
Consejo : si ha descargado los archivos o lo hará después de completar este tutorial, eche un vistazo a la estructura de carpetas de los datos que ha descargado. Verá que las pruebas, así como las carpetas de datos de capacitación, contienen 61 subcarpetas, que son los 62 tipos de señales de tráfico que utilizará para la clasificación en este tutorial. Además, encontrará que los archivos tienen la extensión de archivo .ppmo el formato Portable Pixmap. ¡Has descargado imágenes de las señales de tráfico!
Comencemos con la importación de datos en su espacio de trabajo. Comencemos con las líneas de código que aparecen debajo de la función definida por el usuario (UDF) load_data():
  • Primero, configura tu ROOT_PATHEsta ruta es aquella en la que ha realizado el directorio con sus datos de entrenamiento y prueba.
  • A continuación, puede agregar las rutas específicas a su ROOT_PATHcon la ayuda de la join()función. Almacena estas dos rutas específicas en train_data_directorytest_data_directory.
  • Después de eso, puede llamar a la load_data()función y pasarla train_data_directory.
  • Ahora, la load_data()función en sí misma comienza reuniendo todos los subdirectorios que están presentes en train_data_directoryLo hace con la ayuda de la comprensión de la lista, que es una forma bastante natural de construir listas, básicamente dice que, si encuentra algo en el train_data_directory, verificará si este es un directorio, y si es uno, usted Lo agregaré a tu lista. Recuerde que cada subdirectorio representa una etiqueta.
  • A continuación, debe recorrer los subdirectorios. Primero inicializa dos listas, labelsimagesA continuación, reúne las rutas de los subdirectorios y los nombres de archivo de las imágenes que se almacenan en estos subdirectorios. Después, puede recopilar los datos en las dos listas con la ayuda de la append()función.
Tenga en cuenta que en el fragmento de código anterior , los datos de entrenamiento y prueba se encuentran en carpetas denominadas “Entrenamiento” y “Pruebas”, que son subdirectorios de otro directorio “TrafficSigns”. En una máquina local, esto podría ser algo así como “/ Users / yourName / Downloads / TrafficSigns”, con dos subcarpetas llamadas “Training” y “Testing”.
Con sus datos cargados, ¡es hora de un poco de inspección de datos! Puede comenzar con un análisis bastante simple con la ayuda de los atributos ndimsizede la imagesmatriz:
Tenga en cuenta que las variables imageslabelsson listas, por lo que es posible que deba usarlas np.array()para convertir las variables en una matriz en su propio espacio de trabajo. ¡Esto se ha hecho por ti aquí !
¡Tenga en cuenta que lo images[0]que imprimió es, de hecho, una sola imagen representada por matrices en matrices! Al principio, esto puede parecer contradictorio, pero es algo a lo que se acostumbrará a medida que avance en el trabajo con imágenes en aplicaciones de aprendizaje automático o aprendizaje automático.
A continuación, también puede echar un pequeño vistazo al labels, pero no debería ver demasiadas sorpresas en este momento .
Estos números ya le brindan información sobre el éxito de su importación y el tamaño exacto de sus datos. A primera vista, todo se ha ejecutado de la manera que esperaba y ve que el tamaño de la matriz es considerable si tiene en cuenta que se trata de matrices dentro de matrices.
Tip intento de añadir los siguientes atributos a sus matrices para obtener mor información sobre el diseño de memoria, la longitud de un elemento de la matriz de bytes y el consumo total de bytes por parte de elementos de la matriz con el flagsitemsizenbytesatributos. ¡Puede probar esto en la consola de IPython en el fragmento DataCamp Light de arriba!
A continuación, también puede echar un vistazo a la distribución de las señales de tráfico.
¡Trabajo asombroso! ¡Ahora echemos un vistazo más de cerca al histograma que hizo!

Usted ve claramente que no todos los tipos de señales de tráfico están igualmente representados en el conjunto de datos. Esto es algo con lo que tratará más adelante cuando esté manipulando los datos antes de comenzar a modelar su red neuronal.
A primera vista, verá que hay etiquetas que están más presentes en el conjunto de datos que otras: las etiquetas 22, 32, 38 y 61 definitivamente saltan. En este punto, es bueno tener esto en mente, ¡pero definitivamente irás más allá en la siguiente sección!
Los pequeños análisis o comprobaciones anteriores ya le han dado una idea de los datos con los que está trabajando, pero cuando sus datos consisten principalmente en imágenes, el paso que debe seguir para explorar sus datos es visualizarlos.
Veamos algunas señales de tráfico aleatorias:
  • Primero, asegúrese de importar el pyplotmódulo del matplotlibpaquete bajo el alias común plt.
  • Luego, harás una lista con 4 números aleatorios. Estos se usarán para seleccionar señales de tráfico de la imagesmatriz que acaba de inspeccionar en la sección anterior. En este caso, le vayan a hacer 300225036504000.
  • A continuación, dirá que para cada elemento en la longitud de esa lista, de 0 a 4, creará subtramas sin ejes (para que no funcionen con toda la atención y su enfoque es únicamente en las imágenes!). En estas subtramas, va a mostrar una imagen específica de la imagesmatriz que está de acuerdo con el número en el índice iEn el primer ciclo, pasarás 300images[], en la segunda ronda 2250, y así sucesivamente. Por último, ajustará las subtramas para que haya suficiente ancho entre ellas.
  • ¡Lo último que queda es mostrar su trama con la ayuda de la show()función!
Como adivinó por las 62 etiquetas que se incluyen en este conjunto de datos, los signos son diferentes entre sí.
¿Pero qué más notas? Eche otro vistazo a las imágenes a continuación:

¡Estas cuatro imágenes no son del mismo tamaño!
Obviamente, puede jugar con los números que figuran en la traffic_signslista y hacer un seguimiento más exhaustivo de esta observación, pero sea como sea, esta es una observación importante que deberá tener en cuenta cuando comience a trabajar más para manipular su datos para que pueda alimentarlos a la red neuronal.
Confirmemos la hipótesis de los diferentes tamaños imprimiendo la forma, los valores mínimo y máximo de las imágenes específicas que ha incluido en las subtramas.
El siguiente código se parece mucho al que utilizó para crear el diagrama anterior, pero difiere en el hecho de que aquí alternará tamaños e imágenes en lugar de trazar solo las imágenes una al lado de la otra.
Nota cómo se utiliza el format()método de la cuerda "shape: {0}, min: {1}, max: {2}"para llenar los argumentos {0}{1}{2}que ha definido.

Ahora que ha visto imágenes sueltas, es posible que también desee volver a visitar el histograma que imprimió en los primeros pasos de su exploración de datos; Puede hacerlo fácilmente trazando una descripción general de todas las 62 clases y una imagen que pertenece a cada clase.
Tenga en cuenta que aunque defina 64 subtramas, no todas mostrarán imágenes (¡ya que solo hay 62 etiquetas!). Tenga en cuenta también que, una vez más, no incluye ningún eje para asegurarse de que la atención de los lectores no se aleje mucho del tema principal: ¡las señales de tráfico!

Como supuso en su mayoría en el histograma anterior, hay considerablemente más señales de tráfico con las etiquetas 22, 32, 38 y 61. Esta hipótesis ahora se confirma en esta gráfica: puede ver que hay 375 instancias con la etiqueta 22, 316 instancias con la etiqueta 32, 285 instancias con etiqueta 38 y, por último, 282 instancias con etiqueta 61.
Una de las preguntas más interesantes que podría hacerse ahora es si existe una conexión entre todos estos casos, ¿tal vez todos ellos son signos de designación?
Echemos un vistazo más de cerca: ve que las etiquetas 22 y 32 son signos prohibitivos, pero que las etiquetas 38 y 61 son signos designativos y prioritarios, respectivamente. Esto significa que no hay una conexión inmediata entre estos cuatro, excepto por el hecho de que la mitad de los signos que tienen una fuerte presencia en el conjunto de datos es del tipo prohibitivo.

Extracción de características

Ahora que ha explorado a fondo sus datos, ¡es hora de ensuciarse las manos! Recapitulemos brevemente lo que descubrió para asegurarnos de no olvidar ningún paso en la manipulación:
  • El tamaño de las imágenes era desigual;
  • Hay 62 etiquetas o valores objetivo (ya que sus etiquetas comienzan en 0 y terminan en 61);
  • La distribución de los valores de las señales de tráfico es bastante desigual; Realmente no había ninguna conexión entre los signos que estaban muy presentes en el conjunto de datos.
Ahora que tiene una idea clara de lo que necesita mejorar, puede comenzar a manipular sus datos de tal manera que estén listos para ser alimentados a la red neuronal o al modelo al que desee alimentarlo. Comencemos primero con la extracción de algunas características: redimensionará las imágenes y convertirá las imágenes que se encuentran en la imagesmatriz a escala de grises. Hará esta conversión de color principalmente porque el color importa menos en preguntas de clasificación como la que está tratando de responder ahora. Sin embargo, para la detección, ¡el color juega un papel importante! Entonces, en esos casos, ¡no es necesario hacer esa conversión!
Para abordar los diferentes tamaños de imagen, va a cambiar el tamaño de las imágenes; Puede hacerlo fácilmente con la ayuda de la skimagebiblioteca Scikit-Image, que es una colección de algoritmos para el procesamiento de imágenes.
En este caso, el transformmódulo será útil, ya que le ofrece una resize()función; Verá que utiliza la comprensión de la lista (¡de nuevo!) Para cambiar el tamaño de cada imagen a 28 por 28 píxeles. Una vez más, verá que de la forma en que realmente forma la lista: por cada imagen que encuentre en la imagesmatriz, realizará la operación de transformación que toma prestada de la skimagebiblioteca. Finalmente, almacena el resultado en la images28variable:
# Importar el módulo `transform` desde` skimage` 
desde skimage import transform
# Cambia el tamaño de las imágenes en el conjunto de imágenes `images`28
= [transform.resize (image, (28, 28)) para imagen en imágenes]
Esto fue bastante fácil, ¿no?
Tenga en cuenta que las imágenes ahora son de cuatro dimensiones: si convierte images28a una matriz y le concatena el atributo shape, verá que la impresión le dice que images28las dimensiones son (4575, 28, 28, 3)Las imágenes son de 784 dimensiones (porque sus imágenes son de 28 por 28 píxeles).
Puede verificar el resultado de la operación de reescalado reutilizando el código que utilizó anteriormente para trazar las 4 imágenes aleatorias con la ayuda de la traffic_signsvariable; Simplemente no olvides cambiar todas las referencias imagesimages28.
Mira el resultado aquí:

Tenga en cuenta que debido a la reescalada, sus valores minmaxtambién han cambiado; Parecen estar todos en el mismo rango ahora, lo cual es realmente genial porque ¡entonces no necesariamente necesita normalizar sus datos!
Como se dijo en la introducción a esta sección del tutorial, el color en las imágenes es menos importante cuando intentas responder una pregunta de clasificación. Es por eso que también pasarás por la molestia de convertir las imágenes a escala de grises.
Nota , sin embargo, que también se puede probar por su cuenta lo que sucedería con los resultados finales de su modelo si usted no sigue adelante con este paso específico.
Al igual que con el cambio de escala, puede volver a contar con la biblioteca Scikit-Image para ayudarlo; En este caso, es el colormódulo con su rgb2gray()función lo que necesita usar para llegar a donde necesita estar.
¡Eso va a ser agradable y fácil!
Sin embargo, no olvide images28volver a convertir la variable en una matriz, ya que la rgb2gray()función espera una matriz como argumento.
# Importar `rgb2gray` desde` skimage.color` 
desde skimage.color importar rgb2gray
# Convertir `images28` en una matriz
images28 = np.array (images28)
# Convertir `images28` en imágenes en escala de
grises28 = rgb2gray (images28)
Verifique el resultado de su conversión en escala de grises trazando algunas de las imágenes; Aquí , puede volver a usar y adaptar ligeramente parte del código para mostrar las imágenes ajustadas.
Tenga en cuenta que debe especificar el mapa de color o cmapconfigurarlo "gray"para trazar las imágenes en escala de grises. Esto se debe a que, imshow()de manera predeterminada, utiliza, de manera predeterminada, un mapa de color similar al mapa de calor. Lee más aquí .

Consejo : dado que ha estado reutilizando esta función bastante en este tutorial, puede investigar cómo puede convertirla en una función 🙂
Estos dos pasos son muy básicos; Otras operaciones que podría haber probado con sus datos incluyen el aumento de datos (rotación, desenfoque, desplazamiento, cambio de brillo, …). Si lo desea, también puede configurar una tubería completa de operaciones de manipulación de datos a través de la cual envía sus imágenes.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Más info

aceptar