Deep learning con Tensorflow y Keras
Deep learning según Google
No podemos descuidar a un actor principal como Google. Esta podría ser una buena razón para considerar usar TensorFlow en sus proyectos, pero no es la única.
Según el sitio de GitHub, TensorFlow y Keras dominan la cantidad de GitHub stars by AI library en 2020: 153 000 estrellas para TensorFlow, 51 000 para Keras, 46 000 para PyTorch, 45 000 para Scikit-learn, 31 000 para Caffe y 19 000 para MXNet.
Se puede acceder fácilmente a estos frameworks en R:
-
TensorFlow y Keras, como veremos más adelante,
-
PyTorch, con el paquete rTorch,
-
Scikit-learn, que funciona muy bien en R cuando se importa con reticulate,
-
MXNet (pero preste atención, no a través del CRAN), cuya instalación no es sencilla, pero la implementación es potente.
TensorFlow es una librería de software open source dedicada a los cálculos numéricos. Se usa muy a menudo en el contexto del Deep learning, pero no exclusivamente.
Esta librería implementa gráficos de flujo de datos en segundo plano a los que puede acceder, pero que solo los especialistas analizan. Los nodos representan operaciones matemáticas, mientras que las aristas del gráfico representan tensores (gráficos dirigidos). El interés de esta arquitectura gráfica es múltiple, pero cabe recordar que, entre otras cosas, permite una mejor gestión...
Instalar e inicializar su contexto técnico
No dude en hacer balance de su contexto antes de comenzar su trabajo, verificando su configuración de Python y su correcto funcionamiento.
getwd() # ¿dónde estoy?
library(reticulate) # carga de reticulate
os <- reticulate::import("os") # una pequeña prueba de funcionamiento
os$listdir(".") # si todo va bien: dir local
Puede instalar de manera muy sencilla paquetes de Python en el entorno que utiliza en R/RStudio de la siguiente manera:
# instalación de paquetes Python (solo se hace una vez)
# esto es útil cuando estos paquetes no están, evita
# equivocarse de entono de instalación
py_install('matplotlib')
py_install('pandas')
py_install('graphviz')
py_install('pydot')
py_install('pydotplus')
Con R se simplifica la instalación de TensorFlow (versiones 2.x.x). Ahora, la opción predeterminada, si la configuración de su hardware lo admite, es ejecutar bajo CUDA y, por lo tanto, con una unidad de procesamiento de gráficos...
Tensores TensorFlow/Keras
1. Forma de los tensores
Como ejemplo, vamos a tomar un tensor que tiene los parámetros de forma siguiente:
-
tres columnas,
-
cinco filas,
-
dos niveles de profundidad.
ceros <- tf$Variable(tf$ceros(shape(2L,5L,3L)))
print(ceros)
##> <tf.Variable 'Variable:0' shape=(2, 5, 3) dtype=float32, numpy=
##> array([[[0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.]],
##>
##> [[0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.]]], dtype=float32)>
Probablemente sea más interesante crear este mismo tensor utilizando la API de Keras, que nos permite escribir código que funcionaría con un backend diferente a TensorFlow:
ceros <- k_ceros(shape = c(2, 5, 3))
print(ceros)
##> <tf.Variable 'Variable:0' shape=(2, 5, 3) dtype=float32, numpy=
##> array([[[0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.]],
##>
##> [[0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.],
##> [0., 0., 0.]]], dtype=float32)>
Observe el orden de los parámetros de TensorFlow/Keras, que están en «estilo C».
Compárelos con los parámetros de los arrays de R, que están en «estilo Fortran»:
array(0.0 , c(5,3,2))
##> , , 1
##>
##> [,1] [,2] [,3]
##> [1,] 0 0 0
##> [2,] 0 0 0
##> [3,] 0 0 ...
Puesta a punto de un modelo de referencia usando caret
Primero, crearemos un modelo con nuestras técnicas habituales usando el paquete caret, que encapsula muchas técnicas y modelos. A continuación, veremos en qué se diferenciará del trabajo con keras para realizar un modelo similar.
Vamos a utilizar datos iris, sin duda el dataset más conocido que existe; nuestro objetivo es crear un modelo que deduzca el tipo de iris en función de algunas características de sus flores.
library(caret) # gestión de muchos tipos de modelos
library(lessR) # siempre menos código R ...
library(DataExplorer) # para algunas funcionalidades
Este dataset se incluye en su implementación de R, por lo que siempre está disponible para sus experimentos. Veamos brevemente su estructura.
summary(iris)
##> Sepal.Length Sepal.Width Petal.Length Petal.Width
##> Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
##> 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
##> Median :5.800 Median :3.000 Median :4.350 Median :1.300
##> Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
##> 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
##> Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
##> Species
##> setosa :50
##> versicolor:50
##> virginica :50
##>
##>
##>
introduce(iris)
##> rows columns discrete_columns continuous_columns all_missing_columns
##> 1 150 5 1 4 ...
Crear un modelo con TensorFlow 2 y Keras
Tendremos más líneas para escribir por varias razones:
-
Los modelos en el paquete caret ya están parametrizados y se pueden usar sin modificar, mientras que la interfaz de Keras que hemos utilizado para acceder a la potencia del framework TensorFlow necesita más parametrización. Observe que utilizar TensorFlow directamente requiere aún más esfuerzo.
-
Antes de usarlos, tendremos que transformar nuestros datos en estructuras numéricas, normalmente tensores o al menos matrices que, al igual que los vectores, son matemáticamente tensores. Además, Keras asimila correctamente las matrices de R, mientras que TensorFlow y Keras tienen su propio tipo de tensor.
-
Tendremos que transformar la columna de nuestra variable respuesta, que es categórica (setosa, versicolor, virginica) en tres columnas de 0 o 1 que nos indicarán si el iris es de tal o cual tipo. Como primera aproximación, podría estar tentado de transformar las categorías en niveles (1,2,3), pero el método adoptado aquí es mucho más potente y generalizable.
-
Tendremos que realizar la operación inversa, pasando de tres columnas a una, con objeto de que los resultados sean más comprensibles para los humanos.
Entonces, ¿por qué hacer todo esto? He aquí algunas pistas:
-
Este nuevo contexto es muy propicio para el desarrollo de redes neuronales de todo tipo, modernas y, en ocasiones, basadas en modelos que están parcialmente entrenados (con la técnica de transfer learning, que se puede implementar fácilmente con Keras).
-
Los modelos que se crean son exportables y, algunas veces, se pueden utilizar directamente en una amplia variedad de contextos, que van desde supercomputadoras hasta componentes electrónicos, incluidos teléfonos móviles, objetos cotidianos o add-on usb en los que se puede exportar la ejecución de modelos.
-
Podremos trabajar de manera más fina nuestro modelo y visualizar la evolución de sus métricas durante las iteraciones de su construcción (las famosas epochs), como la función de pérdida (loss) y la precisión o accuracy (en el caso de variables categóricas).
-
Algunos contextos técnicos empresariales se basan en potentes implementaciones de TensorFlow, lo que le permite acceder a una gran...