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)
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/255model <- 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