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)
$constant("Hellow Tensorflow") tf
## 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)
<- dataset_mnist()
mnist $train$x <- mnist$train$x/255
mnist$test$x <- mnist$test$x/255 mnist
<- keras_model_sequential() %>%
model 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
)
<- predict(model, mnist$test$x)
predictions 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
<- load_model_tf("model")
reloaded_model all.equal(predict(model, mnist$test$x), predict(reloaded_model, mnist$test$x))
## [1] TRUE