6.1.1 Instalación de los paquetes tensorflow y keras
Primer ejemplo real usando un clasificador de imágenes básicos, usaremos el paquete Tensorflow para predecir y analizar datos de forma más exhaustiva. Usaremos RMarkdown
library(reticulate)
## Warning: package 'reticulate' was built under R version 4.3.3
py_config()
## python: C:/Users/HP/OneDrive/Documentos/.virtualenvs/r-tensorflow/Scripts/python.exe
## libpython: C:/Users/HP/AppData/Local/Programs/Python/Python312/python312.dll
## pythonhome: C:/Users/HP/OneDrive/Documentos/.virtualenvs/r-tensorflow
## version: 3.12.4 (tags/v3.12.4:8e8a4ba, Jun 6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)]
## Architecture: 64bit
## numpy: C:/Users/HP/OneDrive/Documentos/.virtualenvs/r-tensorflow/Lib/site-packages/numpy
## numpy_version: 1.26.4
## tensorflow: C:\Users\HP\OneDrive\DOCUME~1\VIRTUA~1\R-TENS~1\Lib\site-packages\tensorflow\__init__.p
##
## NOTE: Python version was forced by VIRTUAL_ENV
library(tensorflow)
tf$constant("Hello, TensorFlow!")
## tf.Tensor(b'Hello, TensorFlow!', shape=(), dtype=string)
install.packages("keras")
## Installing package into 'C:/Users/HP/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'keras' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\HP\AppData\Local\Temp\Rtmp6pF1xh\downloaded_packages
library(keras) #se pueden hacer estos 2 pasos o ir a la pestaña paquetes, es lo mismo
## Warning: package 'keras' was built under R version 4.3.3
6.1.2 Creando vectores
fashion_mnist <- dataset_fashion_mnist()
#60 mil imágenes de escala grisacea de 28x28px
c(train_images, train_labels) %<-% fashion_mnist$train
#80% de las imágenes
#Arreglo matricial de millones de elementos usados para entrenamiento
#Se usan cuando ya tenemos un resultado y queremos seguir mejorando su visualizando
#o el comportamiento que tienen en el tiempo
c(test_images, test_labels) %<-% fashion_mnist$test
#20% de las imágenes de muestreo
#Con ellas vamos a experimentar el comportamiento previo a un resultado
class_names = c("T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot")
6.1.3 Explorando datos
dim(train_images) #60000 imágenes calidad de 28x28px
## [1] 60000 28 28
dim(train_labels) #si hay 60k imágenes hay 60k etiquetas
## [1] 60000
train_labels[1:20]
## [1] 9 0 0 3 0 2 7 2 5 5 0 9 5 5 7 9 1 0 6 4
#Cada etiqueta es un entero entre 0 a 9, segmentación en cuanto a su arreglo de
#los 20 primeros valores que tiene,
#son 60k imágenes cuyos dígitos ya se encuentran estratificadas y segmentadas de 0 a 9
Hay 10k imágenes en el set de muestra, cada imagen representa una resolución de 28x28px
dim(test_images) #10k imágenes
## [1] 10000 28 28
dim(test_labels) #10k imágenes = 10k etiquetas
## [1] 10000
6.1.4 Construcción del modelo y análisis de datos
library(ggplot2)
library(tidyr)
image_1 <- as.data.frame(train_images[1, , ])
#transformamos un dataframe de la base de datos train_images
colnames(image_1) <- seq_len(ncol(image_1))
image_1$y <- seq_len(nrow(image_1))
#es una variable que se va a ubicar al final de las columnas
image_1 <- gather(image_1, "x", "value", -y)
image_1$x <- as.integer(image_1$x)
ggplot(image_1, aes(x = x, y = y, fill = value)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "black", na.value = NA) +
scale_y_reverse() +
theme_minimal() +
theme(panel.grid = element_blank()) +
theme(aspect.ratio = 1) +
xlab(" ") +
ylab(" ")
train_images <- train_images/255
test_images <- test_images/255
par(mfcol = c(5, 5)) #5 filas, 5 columnas 25 imágenes
par(mar = c(0, 0, 1.5, 0), xaxs = "i", yaxs = "i")
for (i in 1:25){
img <- train_images[i, , ]
img <- t(apply(img, 2, rev))
image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = "n", yaxt = "n",
main = paste(class_names[train_labels[i] +1]))
}
6.1.5 Elaboración, compilación y entrenamiento del modelo, red neural
Código con versión no compatible actualmente en keras:
library(tidyr)
library(keras)
model <- keras_model_sequential()
model %>%
layer_flatten(input_shape = c(28, 28)) %>%
layer_activation('relu') %>%
layer_activation('softmax')
model %>% compile(
optimizer = "adam",
loss = "sparse_categorical_crossentropy",
metrics = c("accuracy")
)
model %>% fit(train_images, train_labels, epochs = 5, verbose = 5)
score <- model %>% evaluate(test_images, test_labels, verbose = 0)
cat("Test loss:", score[1], "\n")
prediction <- model %>% predict(test_images)
predictions[1, ]
which.max(predictions[1,])
class_pred <- model %>% predict_classes(test_images)
class_pred[1:20]
test_labels[1]
library(keras)
input <- layer_input(shape = c(28, 28))
output <- input %>%
layer_flatten() %>%
layer_dense(units = 128, activation = "relu") %>%
layer_dense(units = 10, activation = "softmax")
model <- keras_model(inputs = input, outputs = output)
model$compile(
optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = list('accuracy')
)
epochs <- as.integer(5)
print(class(epochs))
## [1] "integer"
model$fit(train_images, train_labels, epochs = epochs, verbose = 2)
## Epoch 1/5
## 1875/1875 - 6s - 3ms/step - accuracy: 0.8237 - loss: 0.5000
## Epoch 2/5
## 1875/1875 - 4s - 2ms/step - accuracy: 0.8652 - loss: 0.3775
## Epoch 3/5
## 1875/1875 - 4s - 2ms/step - accuracy: 0.8759 - loss: 0.3389
## Epoch 4/5
## 1875/1875 - 5s - 2ms/step - accuracy: 0.8857 - loss: 0.3127
## Epoch 5/5
## 1875/1875 - 5s - 2ms/step - accuracy: 0.8924 - loss: 0.2947
## <keras.src.callbacks.history.History object at 0x000001609E183740>
score <- model$evaluate(test_images, test_labels, verbose = 0)
cat("Test loss:", score[1], "\n")
## Test loss: 0.3552181
predictions <- model$predict(test_images)
##
## [1m 1/313[0m [37m━━━━━━━━━━━━━━━━━━━━[0m [1m19s[0m 63ms/step
## [1m 35/313[0m [32m━━[0m[37m━━━━━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m 67/313[0m [32m━━━━[0m[37m━━━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m 98/313[0m [32m━━━━━━[0m[37m━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m129/313[0m [32m━━━━━━━━[0m[37m━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m160/313[0m [32m━━━━━━━━━━[0m[37m━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m193/313[0m [32m━━━━━━━━━━━━[0m[37m━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m223/313[0m [32m━━━━━━━━━━━━━━[0m[37m━━━━━━[0m [1m0s[0m 2ms/step
## [1m255/313[0m [32m━━━━━━━━━━━━━━━━[0m[37m━━━━[0m [1m0s[0m 2ms/step
## [1m288/313[0m [32m━━━━━━━━━━━━━━━━━━[0m[37m━━[0m [1m0s[0m 2ms/step
## [1m313/313[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 2ms/step
## [1m313/313[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m1s[0m 2ms/step
predictions[1, ]
## [1] 1.195014e-05 2.915404e-07 9.328386e-07 1.350374e-07 1.844948e-06
## [6] 3.758254e-03 1.259913e-05 5.831259e-02 1.815648e-05 9.378831e-01
#infitesimales
which.max(predictions[1,]) #la última prenda es la que más se elabora
## [1] 10
predictions <- model$predict(test_images)
##
## [1m 1/313[0m [37m━━━━━━━━━━━━━━━━━━━━[0m [1m8s[0m 27ms/step
## [1m 33/313[0m [32m━━[0m[37m━━━━━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m 68/313[0m [32m━━━━[0m[37m━━━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m100/313[0m [32m━━━━━━[0m[37m━━━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m132/313[0m [32m━━━━━━━━[0m[37m━━━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m165/313[0m [32m━━━━━━━━━━[0m[37m━━━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m195/313[0m [32m━━━━━━━━━━━━[0m[37m━━━━━━━━[0m [1m0s[0m 2ms/step
## [1m228/313[0m [32m━━━━━━━━━━━━━━[0m[37m━━━━━━[0m [1m0s[0m 2ms/step
## [1m264/313[0m [32m━━━━━━━━━━━━━━━━[0m[37m━━━━[0m [1m0s[0m 2ms/step
## [1m294/313[0m [32m━━━━━━━━━━━━━━━━━━[0m[37m━━[0m [1m0s[0m 2ms/step
## [1m313/313[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m1s[0m 2ms/step
class_pred <- apply(predictions, 1, which.max) - 1
class_pred[1:20]
## [1] 9 2 1 1 6 1 4 6 5 7 4 5 7 3 4 1 2 2 8 0
test_labels[1]
## [1] 9
6.1.6 Análisis de varias imágenes a la vez
par(mfcol = c(5,5))
par(mar = c(0, 0, 1.5, 0), xaxs = "i", yaxs = "i")
for(i in 1:25){
img <- test_images[i, , ]
img <- t(apply(img, 2, rev))
#subtract 1 as labels go from 0 to 9
predicted_label <- which.max(predictions[i, ]) -1
true_label <- test_labels[i]
if(predicted_label == true_label){
color <- "#008800"
} else {
color <- "#bb0000"
}
image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = "n", yaxt = "n",
main = paste0(class_names[predicted_label + 1], " (",
class_names[true_label + 1], ")"),
col.main = color)
}
img <- test_images[1, , , drop = F]
dim(img)
## [1] 1 28 28
predictions <- model$predict(img)
##
## [1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 31ms/step
## [1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 31ms/step
predictions
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.195014e-05 2.915399e-07 9.328351e-07 1.350375e-07 1.844945e-06
## [,6] [,7] [,8] [,9] [,10]
## [1,] 0.003758245 1.259914e-05 0.0583126 1.81565e-05 0.9378833
prediction <- predictions[1, ] -1
which.max(prediction)
## [1] 10
predictions <- model$predict(img)
##
## [1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 30ms/step
## [1m1/1[0m [32m━━━━━━━━━━━━━━━━━━━━[0m[37m[0m [1m0s[0m 30ms/step
class_pred <- apply(predictions, 1, which.max) - 1
# Restar 1 para que las clases comiencen desde 0, si es necesario
class_pred
## [1] 9