Keras with R (CNN)

  MLP 本身已经可以达到很不错的准确率了,但是随着模型的迭代次数增加,精度基本趋向于稳定而不再有更多变化。这时候模型本身就遇到了瓶颈,需要更高级深入的模型来做更专业的工作。 CNN 基于这样的问题被开发设计出来,专门解决图像识别的问题。
  基于之前的模型,加入卷积层,池化层使用 R 语言作为控制语言来训练一个 CNN , 看看效果。

library(keras)

# download
mnist <- dataset_mnist()
x_train <- mnist$train$x
y_train <- mnist$train$y
x_test <- mnist$test$x
y_test <- mnist$test$y

# reshape
x_train <- array_reshape(x_train, c(nrow(x_train), 28, 28, 1))
x_test <- array_reshape(x_test, c(nrow(x_test), 28, 28, 1))

# rescale
x_train <- x_train / 255
x_test <- x_test / 255

y_train <- to_categorical(y_train, 10)
y_test <- to_categorical(y_test, 10)
# 定义模型
model <- keras_model_sequential() 
model %>% 
  # 第一层卷积,最大池化,dropout
  layer_conv_2d(filters = 32, kernel_size = c(3, 3), activation = "relu", input_shape = c(28, 28, 1)) %>% 
  layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
  layer_dropout(rate = 0.25) %>% 
  # 第二层卷积,最大池化,dropout
  layer_conv_2d(filters = 64, kernel_size = c(3, 3), activation = "relu") %>% 
  layer_max_pooling_2d(pool_size = c(2, 2)) %>% 
  layer_dropout(rate = 0.25) %>% 
  # 全连接层
  layer_flatten() %>% 
  layer_dense(units = 1024, activation = 'relu') %>% 
  layer_dropout(rate = 0.5) %>%
  layer_dense(units = 10, activation = 'softmax')

这里写图片描述

  上图输入模型各个层的shape,这些具体数值可以根据情况做调整,可以看到 Total params 高达160多万。这么多参数,也难怪它学习能力那么强了。

# 设置模型优化策略并训练模型
model %>% compile(
  loss = 'categorical_crossentropy',
  optimizer = optimizer_adam(lr = 0.001),
  metrics = c('accuracy')
)

history <- model %>% fit(
  x_train, y_train, 
  epochs = 30, batch_size = 100, 
  validation_split = 0.2,
  verbose = 2
)

  这里注意从卷积层输入的shape, 是一个三维的数组,各个维度分别代表 width,height,pixels 这里顺序于 python 不太一样。是因为 R 是 (m, n, x) 的形式, 而 python 是 (x, m, n),其中 m 代表行, n 代表列,x 代表第三维度。

  看看训练好的模型效果:
这里写图片描述
   loss 为 0.02, 准确率为 99.2%

这里写图片描述

  如图所示,模型在第三次迭代后就acc就达到了 98% ,之后一直在 99% 处微小波动。而之前训练的 MLP 是在98% 处波动,说明模型整体精度提高了 1% ,但是仅仅是这1%的提升,训练所耗费的时间要大很多。这和我们学习工作中类似,总有遇到瓶颈的时候,而跨越这个瓶颈不但需要付出更多的时间和努力,并且还需要一些新的改进方法来指引,最终才能获取那 1% 的进步。

猜你喜欢

转载自blog.csdn.net/qq_24834541/article/details/78778304