mnist_transfer_cnn
Transfer learning toy example:
- Train a simple convnet on the MNIST dataset the first 5 digits [0..4].
- Freeze convolutional layers and fine-tune dense layers for the classification of digits [5..9].
library(keras)
now <- Sys.time()
batch_size <- 128
num_classes <- 5
epochs <- 5
# input image dimensions
img_rows <- 28
img_cols <- 28
# number of convolutional filters to use
filters <- 32
# size of pooling area for max pooling
pool_size <- 2
# convolution kernel size
kernel_size <- c(3, 3)
# input shape
input_shape <- c(img_rows, img_cols, 1)
# the data, shuffled and split between train and test sets
data <- dataset_mnist()
x_train <- data$train$x
y_train <- data$train$y
x_test <- data$test$x
y_test <- data$test$y
# create two datasets one with digits below 5 and one with 5 and above
x_train_lt5 <- x_train[y_train < 5]
y_train_lt5 <- y_train[y_train < 5]
x_test_lt5 <- x_test[y_test < 5]
y_test_lt5 <- y_test[y_test < 5]
x_train_gte5 <- x_train[y_train >= 5]
y_train_gte5 <- y_train[y_train >= 5] - 5
x_test_gte5 <- x_test[y_test >= 5]
y_test_gte5 <- y_test[y_test >= 5] - 5
# define two groups of layers: feature (convolutions) and classification (dense)
feature_layers <-
layer_conv_2d(filters = filters, kernel_size = kernel_size,
input_shape = input_shape) %>%
layer_activation(activation = 'relu') %>%
layer_conv_2d(filters = filters, kernel_size = kernel_size) %>%
layer_activation(activation = 'relu') %>%
layer_max_pooling_2d(pool_size = pool_size) %>%
layer_dropout(rate = 0.25) %>%
layer_flatten()
# feature_layers = [
# Conv2D(filters, kernel_size,
# padding='valid',
# input_shape=input_shape),
# Activation('relu'),
# Conv2D(filters, kernel_size),
# Activation('relu'),
# MaxPooling2D(pool_size=pool_size),
# Dropout(0.25),
# Flatten(),
# ]
#
# classification_layers = [
# Dense(128),
# Activation('relu'),
# Dropout(0.5),
# Dense(num_classes),
# Activation('softmax')
# ]