Requerimientos

En primer lugar debe instalar python3 en su sistema local. Sugerencia: utilizar miniconda por su instalación minimalista (solo instalará lo necesario).

En segundo lugar debe crear un ambiente (env) denominado ‘r-reticulate’ mediante:

conda create --name r-reticulate python==3.8.5

Sobre este ambiente se instalarán las librerías necesarias.

pip install --upgrade tensorflow

Probar la instalación con:

python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

Asegurar en Preferencias de RStudio que se encuentra activa la version de Python correcta. En este caso es la versión del env r-reticulate.

library(reticulate)
use_condaenv(condaenv = "r-reticulate", conda = "auto", required = FALSE)
#conda_list()
library(tensorflow)
Sys.setenv(RETICULATE_PYTHON="/Users/patricio/opt/miniconda3/envs/r-reticulate/bin/python3")
use_condaenv(condaenv = "r-reticulate", conda = "auto", required = FALSE)
tf$constant("Hellow Tensorflow")
## tf.Tensor(b'Hellow Tensorflow', shape=(), dtype=string)

Clasificación de imágenes

Construcción de una red neuronal para clasificación de imágenes basadas en el dataset MNIST

#
library(keras)
mnist <- dataset_mnist()
mnist$train$x <- mnist$train$x/255
mnist$test$x <- mnist$test$x/255
model <- keras_model_sequential() %>% 
  layer_flatten(input_shape = c(28, 28)) %>% 
  layer_dense(units = 128, activation = "relu") %>% 
  layer_dropout(0.2) %>% 
  layer_dense(10, activation = "softmax")
summary(model)
## Model: "sequential"
## ________________________________________________________________________________
## Layer (type)                        Output Shape                    Param #     
## ================================================================================
## flatten (Flatten)                   (None, 784)                     0           
## ________________________________________________________________________________
## dense_1 (Dense)                     (None, 128)                     100480      
## ________________________________________________________________________________
## dropout (Dropout)                   (None, 128)                     0           
## ________________________________________________________________________________
## dense (Dense)                       (None, 10)                      1290        
## ================================================================================
## Total params: 101,770
## Trainable params: 101,770
## Non-trainable params: 0
## ________________________________________________________________________________
model %>% 
  compile(
    loss = "sparse_categorical_crossentropy",
    optimizer = "adam",
    metrics = "accuracy"
  )
model %>% 
  fit(
    x = mnist$train$x, y = mnist$train$y,
    epochs = 5,
    validation_split = 0.3,
    verbose = 2
  )
predictions <- predict(model, mnist$test$x)
head(predictions, 2)
##              [,1]         [,2]         [,3]         [,4]         [,5]
## [1,] 3.092378e-07 4.479361e-08 8.360083e-05 1.916393e-03 2.132022e-10
## [2,] 4.490908e-09 1.550869e-06 9.999957e-01 2.670487e-06 2.085824e-15
##              [,6]         [,7]         [,8]         [,9]        [,10]
## [1,] 1.388442e-06 9.524958e-11 9.979722e-01 1.317593e-06 2.473457e-05
## [2,] 4.770384e-08 6.627442e-09 4.854773e-13 5.095278e-08 4.242762e-12
model %>% 
  evaluate(mnist$test$x, mnist$test$y, verbose = 0)
##      loss  accuracy 
## 0.0826005 0.9752000
# guardamos el modelo
save_model_tf(object = model, filepath = "model")
# reutilización del modelo guardado
reloaded_model <- load_model_tf("model")
all.equal(predict(model, mnist$test$x), predict(reloaded_model, mnist$test$x))
## [1] TRUE