From a0b1b99a74a74bc66a1d987c4aca7afe2349236c Mon Sep 17 00:00:00 2001 From: Tomasz Kalinowski Date: Wed, 8 May 2024 09:07:54 -0400 Subject: [PATCH] convert to Rmd; polish; render; --- .../examples/vision/mnist_siamese_graph.Rmd | 124 +++++--- .../examples/vision/mnist_siamese_graph.Rmd | 300 ++++++++++++++++++ .../mnist_siamese_graph/unnamed-chunk-5-1.png | Bin 0 -> 31043 bytes .../mnist_siamese_graph/unnamed-chunk-7-1.png | Bin 0 -> 8811 bytes .../mnist_siamese_graph/unnamed-chunk-7-2.png | Bin 0 -> 10022 bytes 5 files changed, 381 insertions(+), 43 deletions(-) rename vignettes/examples/mnist_siamese_graph.R => vignettes-src/examples/vision/mnist_siamese_graph.Rmd (51%) create mode 100644 vignettes/examples/vision/mnist_siamese_graph.Rmd create mode 100644 vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-5-1.png create mode 100644 vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-1.png create mode 100644 vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-2.png diff --git a/vignettes/examples/mnist_siamese_graph.R b/vignettes-src/examples/vision/mnist_siamese_graph.Rmd similarity index 51% rename from vignettes/examples/mnist_siamese_graph.R rename to vignettes-src/examples/vision/mnist_siamese_graph.Rmd index cacddc4b9c..705621ed2f 100644 --- a/vignettes/examples/mnist_siamese_graph.R +++ b/vignettes-src/examples/vision/mnist_siamese_graph.Rmd @@ -1,29 +1,63 @@ -#' Train a Siamese MLP on pairs of digits from the MNIST dataset. -#' -#' It loosely follows Hadsell-et-al.'06 [1] (see paper for mode -#' details) but the euclidean distance is replaced by a subtraction -#' layer and one fully-connect (FC) layer. -#' -#' [1] "Dimensionality Reduction by Learning an Invariant Mapping" -#' https://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf -#' -#' Gets to 98.11% test accuracy after 20 epochs. 3 seconds per epoch -#' on a AMD Ryzen 7 PRO 4750U (CPU) -#' -#' R/Keras implementation by Ivo Kwee - https://github.com/ivokwee - - -library(keras) +--- +title: Train a Siamese MLP on pairs of digits from the MNIST dataset. +author: Mehdi, Ivo Kwee - https://github.com/ivokwee +date-created: 2020/05/30 +last-modified: 2020/04/21 +domain: vision +category: intermediate +output: rmarkdown::html_vignette +knit: ({source(here::here("tools/knit.R")); knit_vignette}) +tether: https://raw.githubusercontent.com/keras-team/keras-io/master/examples/vision/siamese_contrastive.py +--- +## Introduction + +[Siamese Networks](https://en.wikipedia.org/wiki/Siamese_neural_network) +are neural networks which share weights between two or more sister networks, +each producing embedding vectors of its respective inputs. + +In supervised similarity learning, the networks are then trained to maximize the +contrast (distance) between embeddings of inputs of different classes, while minimizing the distance between +embeddings of similar classes, resulting in embedding spaces that reflect +the class segmentation of the training inputs. + +This implementation loosely follows Hadsell-et-al.'06 [1] (see paper for mode +details) but the euclidean distance is replaced by a subtraction +layer and one fully-connect (FC) layer. + +[1] "Dimensionality Reduction by Learning an Invariant Mapping" + https://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf + +Gets to 98.11% test accuracy after 20 epochs. 3 seconds per epoch +on a AMD Ryzen 7 PRO 4750U (CPU) + +```{r setup} +library(keras3) +``` + + +```{r} contrastive_loss <- function(y_true, y_pred) { # Contrastive loss from Hadsell-et-al.'06 # https://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf - K <- keras::backend() margin = 1 - margin_square = K$square(K$maximum(margin - (y_pred), 0)) - K$mean((1 - y_true) * K$square(y_pred) + (y_true) * margin_square) + margin_square = op_square(op_maximum(margin - (y_pred), 0)) + op_mean((1 - y_true) * op_square(y_pred) + (y_true) * margin_square) } - +``` + +## Create pairs of images + +We will train the model to differentiate between digits of different classes. For +example, digit `0` needs to be differentiated from the rest of the +digits (`1` through `9`), digit `1` - from `0` and `2` through `9`, and so on. +To carry this out, we will select N random images from class A (for example, +for digit `0`) and pair them with N random images from another class B +(for example, for digit `1`). Then, we can repeat this process for all classes +of digits (until digit `9`). Once we have paired digit `0` with other digits, +we can repeat this process for the remaining classes for the rest of the digits +(from `1` until `9`). +```{r} create_pairs <- function(x, y) { # Positive and negative pair creation. # Alternates between positive and negative pairs. @@ -40,7 +74,10 @@ compute_accuracy <- function(predictions, labels) { # Compute classification accuracy with a fixed threshold on distances. mean(labels[predictions > 0.5]) } +``` + +```{r} # the data, shuffled and split between train and test sets mnist <- dataset_mnist() x_train <- mnist$train$x @@ -57,23 +94,23 @@ tr <- create_pairs(x_train, y_train) te <- create_pairs(x_test, y_test) names(tr) +``` -##---------------------------------------------------------------------- ## Network definition -##---------------------------------------------------------------------- +```{r} # input layers input_dim = 784 input_1 <- layer_input(shape = c(input_dim)) input_2 <- layer_input(shape = c(input_dim)) - + # definition of the base network that will be shared base_network <- keras_model_sequential() %>% - layer_dense(units = 128, activation = 'relu') %>% - layer_dropout(rate = 0.1) %>% - layer_dense(units = 128, activation = 'relu') %>% - layer_dropout(rate = 0.1) %>% - layer_dense(units = 128, activation = 'relu') + layer_dense(units = 128, activation = 'relu') %>% + layer_dropout(rate = 0.1) %>% + layer_dense(units = 128, activation = 'relu') %>% + layer_dropout(rate = 0.1) %>% + layer_dense(units = 128, activation = 'relu') # because we re-use the same instance `base_network`, the weights of # the network will be shared across the two branches @@ -82,17 +119,17 @@ branch_2 <- base_network(input_2) # merging layer out <- layer_subtract(list(branch_1, branch_2)) %>% - layer_dropout(rate = 0.1) %>% + layer_dropout(rate = 0.1) %>% layer_dense(units = 16, activation = 'relu') %>% - layer_dense(1, activation = "sigmoid") + layer_dense(1, activation = "sigmoid") # create and compile model model <- keras_model(list(input_1, input_2), out) +``` -#----------------------------------------------------------- -# train -#----------------------------------------------------------- +## Train +```{r} model %>% compile( optimizer = "rmsprop", #loss = "binary_crossentropy", @@ -102,8 +139,8 @@ model %>% compile( history <- model %>% fit( list(tr$pair1, tr$pair2), tr$y, - batch_size = 128, - epochs = 20, + batch_size = 128, + epochs = 20, validation_data = list( list(te$pair1, te$pair2), te$y @@ -111,10 +148,12 @@ history <- model %>% fit( ) plot(history) +``` + +## Evaluate -#----------------------------------------------------------- +```{r} # compute final accuracy on training and test sets -#----------------------------------------------------------- tr_pred <- predict(model, list(tr$pair1, tr$pair2))[,1] tr_acc <- compute_accuracy(tr_pred, tr$y) @@ -123,21 +162,20 @@ te_acc <- compute_accuracy(te_pred, te$y) sprintf('* Accuracy on training set: %0.2f%%', (100 * tr_acc)) sprintf('* Accuracy on test set: %0.2f%%', (100 * te_acc)) +``` -#----------------------------------------------------------- -# show some plots -#----------------------------------------------------------- +## Plots +```{r} par(mfrow=c(1,1)) vioplot::vioplot( te_pred ~ te$y ) i=3 visualizePair <- function(i) { - image(rbind(matrix( te$pair1[i,],28,28)[,28:1], matrix( te$pair2[i,],28,28)[,28:1])) + image(rbind(matrix( te$pair1[i,],28,28)[,28:1], matrix( te$pair2[i,],28,28)[,28:1])) title(paste("true:", te$y[i],"| pred:", round(te_pred[i],5))) } par(mfrow=c(3,3)) lapply(1:9, visualizePair) - - +``` diff --git a/vignettes/examples/vision/mnist_siamese_graph.Rmd b/vignettes/examples/vision/mnist_siamese_graph.Rmd new file mode 100644 index 0000000000..ace2217dbe --- /dev/null +++ b/vignettes/examples/vision/mnist_siamese_graph.Rmd @@ -0,0 +1,300 @@ +--- +title: Train a Siamese MLP on pairs of digits from the MNIST dataset. +date-created: 2020/05/30 +last-modified: 2020/04/21 +domain: vision +category: intermediate +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Train a Siamese MLP on pairs of digits from the MNIST dataset.} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +## Introduction + +[Siamese Networks](https://en.wikipedia.org/wiki/Siamese_neural_network) +are neural networks which share weights between two or more sister networks, +each producing embedding vectors of its respective inputs. + +In supervised similarity learning, the networks are then trained to maximize the +contrast (distance) between embeddings of inputs of different classes, while minimizing the distance between +embeddings of similar classes, resulting in embedding spaces that reflect +the class segmentation of the training inputs. + +This implementation loosely follows Hadsell-et-al.'06 [1] (see paper for mode +details) but the euclidean distance is replaced by a subtraction +layer and one fully-connect (FC) layer. + +[1] "Dimensionality Reduction by Learning an Invariant Mapping" + https://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf + +Gets to 98.11% test accuracy after 20 epochs. 3 seconds per epoch +on a AMD Ryzen 7 PRO 4750U (CPU) + + +```r +library(keras3) +``` + + + +```r +contrastive_loss <- function(y_true, y_pred) { + # Contrastive loss from Hadsell-et-al.'06 + # https://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf + margin = 1 + margin_square = op_square(op_maximum(margin - (y_pred), 0)) + op_mean((1 - y_true) * op_square(y_pred) + (y_true) * margin_square) +} +``` + +## Create pairs of images + +We will train the model to differentiate between digits of different classes. For +example, digit `0` needs to be differentiated from the rest of the +digits (`1` through `9`), digit `1` - from `0` and `2` through `9`, and so on. +To carry this out, we will select N random images from class A (for example, +for digit `0`) and pair them with N random images from another class B +(for example, for digit `1`). Then, we can repeat this process for all classes +of digits (until digit `9`). Once we have paired digit `0` with other digits, +we can repeat this process for the remaining classes for the rest of the digits +(from `1` until `9`). + +```r +create_pairs <- function(x, y) { + # Positive and negative pair creation. + # Alternates between positive and negative pairs. + digit_indices <- tapply(1:length(y), y, list) + y1 <- y + y2 <- sapply(y, function(a) sample(0:9,1,prob=0.1+0.8*(0:9==a))) + idx1 <- 1:nrow(x) + idx2 <- sapply(as.character(y2), function(a) sample(digit_indices[[a]],1)) + is_same <- 1*(y1==y2) + list(pair1 = x[idx1,], pair2 = x[idx2,], y = is_same) +} + +compute_accuracy <- function(predictions, labels) { + # Compute classification accuracy with a fixed threshold on distances. + mean(labels[predictions > 0.5]) +} +``` + + + +```r +# the data, shuffled and split between train and test sets +mnist <- dataset_mnist() +x_train <- mnist$train$x +y_train <- mnist$train$y +x_test <- mnist$test$x +y_test <- mnist$test$y +x_train <- array_reshape(x_train, c(nrow(x_train), 784)) +x_test <- array_reshape(x_test, c(nrow(x_test), 784)) +x_train <- x_train / 255 +x_test <- x_test / 255 + +# create training+test positive and negative pairs +tr <- create_pairs(x_train, y_train) +te <- create_pairs(x_test, y_test) + +names(tr) +``` + +``` +## [1] "pair1" "pair2" "y" +``` + +## Network definition + + +```r +# input layers +input_dim = 784 +input_1 <- layer_input(shape = c(input_dim)) +input_2 <- layer_input(shape = c(input_dim)) + +# definition of the base network that will be shared +base_network <- keras_model_sequential() %>% + layer_dense(units = 128, activation = 'relu') %>% + layer_dropout(rate = 0.1) %>% + layer_dense(units = 128, activation = 'relu') %>% + layer_dropout(rate = 0.1) %>% + layer_dense(units = 128, activation = 'relu') + +# because we re-use the same instance `base_network`, the weights of +# the network will be shared across the two branches +branch_1 <- base_network(input_1) +branch_2 <- base_network(input_2) + +# merging layer +out <- layer_subtract(list(branch_1, branch_2)) %>% + layer_dropout(rate = 0.1) %>% + layer_dense(units = 16, activation = 'relu') %>% + layer_dense(1, activation = "sigmoid") + +# create and compile model +model <- keras_model(list(input_1, input_2), out) +``` + +## Train + + +```r +model %>% compile( + optimizer = "rmsprop", + #loss = "binary_crossentropy", + loss = contrastive_loss, + metrics = metric_binary_accuracy +) + +history <- model %>% fit( + list(tr$pair1, tr$pair2), tr$y, + batch_size = 128, + epochs = 20, + validation_data = list( + list(te$pair1, te$pair2), + te$y + ) +) +``` + +``` +## Epoch 1/20 +## 469/469 - 22s - 47ms/step - binary_accuracy: 0.7565 - loss: 0.1644 - val_binary_accuracy: 0.8782 - val_loss: 0.0989 +## Epoch 2/20 +## 469/469 - 1s - 2ms/step - binary_accuracy: 0.8886 - loss: 0.0873 - val_binary_accuracy: 0.9220 - val_loss: 0.0622 +## Epoch 3/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9246 - loss: 0.0590 - val_binary_accuracy: 0.9380 - val_loss: 0.0485 +## Epoch 4/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9456 - loss: 0.0436 - val_binary_accuracy: 0.9493 - val_loss: 0.0398 +## Epoch 5/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9572 - loss: 0.0343 - val_binary_accuracy: 0.9582 - val_loss: 0.0331 +## Epoch 6/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9644 - loss: 0.0283 - val_binary_accuracy: 0.9661 - val_loss: 0.0273 +## Epoch 7/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9707 - loss: 0.0236 - val_binary_accuracy: 0.9658 - val_loss: 0.0271 +## Epoch 8/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9747 - loss: 0.0206 - val_binary_accuracy: 0.9692 - val_loss: 0.0247 +## Epoch 9/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9771 - loss: 0.0184 - val_binary_accuracy: 0.9695 - val_loss: 0.0238 +## Epoch 10/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9795 - loss: 0.0167 - val_binary_accuracy: 0.9697 - val_loss: 0.0244 +## Epoch 11/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9814 - loss: 0.0152 - val_binary_accuracy: 0.9726 - val_loss: 0.0218 +## Epoch 12/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9831 - loss: 0.0139 - val_binary_accuracy: 0.9734 - val_loss: 0.0210 +## Epoch 13/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9841 - loss: 0.0128 - val_binary_accuracy: 0.9748 - val_loss: 0.0202 +## Epoch 14/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9852 - loss: 0.0121 - val_binary_accuracy: 0.9755 - val_loss: 0.0198 +## Epoch 15/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9860 - loss: 0.0112 - val_binary_accuracy: 0.9730 - val_loss: 0.0217 +## Epoch 16/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9868 - loss: 0.0106 - val_binary_accuracy: 0.9758 - val_loss: 0.0204 +## Epoch 17/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9879 - loss: 0.0100 - val_binary_accuracy: 0.9754 - val_loss: 0.0202 +## Epoch 18/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9884 - loss: 0.0095 - val_binary_accuracy: 0.9773 - val_loss: 0.0185 +## Epoch 19/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9883 - loss: 0.0096 - val_binary_accuracy: 0.9747 - val_loss: 0.0207 +## Epoch 20/20 +## 469/469 - 1s - 1ms/step - binary_accuracy: 0.9896 - loss: 0.0087 - val_binary_accuracy: 0.9764 - val_loss: 0.0199 +``` + +```r +plot(history) +``` + +![plot of chunk unnamed-chunk-5](mnist_siamese_graph/unnamed-chunk-5-1.png) + +## Evaluate + + +```r +# compute final accuracy on training and test sets + +tr_pred <- predict(model, list(tr$pair1, tr$pair2))[,1] +``` + +``` +## 1875/1875 - 2s - 856us/step +``` + +```r +tr_acc <- compute_accuracy(tr_pred, tr$y) +te_pred <- predict(model, list(te$pair1, te$pair2))[,1] +``` + +``` +## 313/313 - 0s - 1ms/step +``` + +```r +te_acc <- compute_accuracy(te_pred, te$y) + +sprintf('* Accuracy on training set: %0.2f%%', (100 * tr_acc)) +``` + +``` +## [1] "* Accuracy on training set: 99.71%" +``` + +```r +sprintf('* Accuracy on test set: %0.2f%%', (100 * te_acc)) +``` + +``` +## [1] "* Accuracy on test set: 98.54%" +``` + +## Plots + + +```r +par(mfrow=c(1,1)) +vioplot::vioplot( te_pred ~ te$y ) +``` + +![plot of chunk unnamed-chunk-7](mnist_siamese_graph/unnamed-chunk-7-1.png) + +```r +i=3 +visualizePair <- function(i) { + image(rbind(matrix( te$pair1[i,],28,28)[,28:1], matrix( te$pair2[i,],28,28)[,28:1])) + title(paste("true:", te$y[i],"| pred:", round(te_pred[i],5))) +} +par(mfrow=c(3,3)) +lapply(1:9, visualizePair) +``` + +![plot of chunk unnamed-chunk-7](mnist_siamese_graph/unnamed-chunk-7-2.png) + +``` +## [[1]] +## NULL +## +## [[2]] +## NULL +## +## [[3]] +## NULL +## +## [[4]] +## NULL +## +## [[5]] +## NULL +## +## [[6]] +## NULL +## +## [[7]] +## NULL +## +## [[8]] +## NULL +## +## [[9]] +## NULL +``` diff --git a/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-5-1.png b/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-5-1.png new file mode 100644 index 0000000000000000000000000000000000000000..58138957cf44a33e1c7e6c6de0145d80162a880c GIT binary patch literal 31043 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 literal 0 HcmV?d00001 diff --git a/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-1.png b/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-1.png new file mode 100644 index 0000000000000000000000000000000000000000..33c831433424ccda8783c897be5d770638d20f39 GIT binary patch literal 8811 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 K>J6$+um2nKQeG4Q literal 0 HcmV?d00001 diff --git a/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-2.png b/vignettes/examples/vision/mnist_siamese_graph/unnamed-chunk-7-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ae74b9af74248351673e248cda0a82299ce1a887 GIT binary patch literal 10022 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 B(p>-m literal 0 HcmV?d00001