关于算法:R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据MNIST

63次阅读

共计 3908 个字符,预计需要花费 10 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=23184 

在本文中,咱们将学习如何应用 keras,用手写数字图像数据集(即 MNIST)进行深度学习。本文的目标是为了让大家亲自体验并相熟培训课程中的神经网络局部。

1 软件包的下载和装置

在这个例子的笔记本中,须要 keras R 包。因为它有许多须要下载和装置的依赖包,因而须要几分钟的工夫能力实现。请急躁期待! 

1.1 下载 keras

咱们能够通过 CRAN 调用 install.packages(“keras”) 来取得。

1.2 加载 keras 包和所需的 tensorflow 后端

因为 keras 只是风行的深度学习框架的一个接口,咱们必须装置一个非凡的深度学习后端。默认和举荐的后端是 TensorFlow。通过调用 install_keras(),它将为 TensorFlow 装置所有须要的依赖项。上面的单元格须要一分钟左右的工夫来运行。

  

当初,咱们筹备好摸索深度学习了。

2 MNIST 数据集的概述

在深度学习中,比传统的机器学习畛域更胜利的利用之一是图像识别。咱们将在本教程中应用宽泛应用的 MNIST 手写数字图像数据集。对于该数据集的更多信息能够在以下网站找到:https://en.wikipedia.org/wiki…。

2.1 加载 MNIST 数据集

这个数据集曾经蕴含在 keras/tensorflow 的装置中,咱们能够依照上面的单元格形容简略地加载数据集。加载数据集只须要不到一分钟的工夫。

dataset_mnist()

2.2 训练和测试数据集

MNIST 数据集的数据结构简单明了,有两块。(1) 训练集:x(即特色):60000x28x28 张量,对应于 60000 张 28×28 像素的图像,采纳灰度示意(即每个 28×28 矩阵中所有的值都是 0 到 255 之间的整数),y(即因变量):一个长度为 60000 的向量,蕴含相应的数字,整数值在 0 到 9 之间。(2) 测试集:与训练集雷同,但只有 10000 个图像和因变量。数据集的具体构造能够通过上面的 str(mnist) 看到。

str(mnist)

当初咱们筹备好训练和测试数据集的特色(x)和因变量(y),咱们能够用 str() 函数查看 x\_train 和 y\_train 的构造。

str(x_train)
str(y_train)

2.3 绘制图像

当初让咱们应用 R 将一个选定的 28×28 矩阵绘制成图像。显示图像的形式是从矩阵表示法中旋转了 90 度。因而,还须要额定的步骤来重新排列矩阵,以便咱们可能应用 image() 函数来显示它的理论方向。

index_image = 28 ## 扭转这个索引以看不同的图像。output\_matrix <- t(output\_matrix)

这里是上述图像的原始 28×28 矩阵。

input_matrix

3 卷积神经网络模型

在本节中,咱们将展现如何应用卷积神经网络(CNN)对 MNIST 手写数据集进行分类,将图像分为数字。这与咱们之前学习的问题完全相同,但 CNN 是一种比个别的深度神经网络更好的图像识别深度学习办法。CNN 利用了二维图像中相邻像素之间的关系来取得更好的性能。它还防止了为全彩的高分辨率图像生成数千或数百万的特色。

3.1 数据集导入和参数设置

当初让咱们再次从头开始导入 MNIST 数据集,因为咱们曾经专门为深度神经网络模型做了一些预处理。对于 CNN,有不同的预处理步骤。咱们还定义了一些当前要应用的参数。

# 加载 mnist 数据的训练和测试数据集
x_train <- train$x
y_train <- train$y
x_test <- test$x
y_test <- test$y
# 定义一些用于 CNN 模型的参数
epochs <- 10

# 输出图像维度
img_rows <- 28

3.2 数据预处理

对于个别的 CNN 办法,MxN 图像的输出是一个具备 K 个特定通道的 MxNxK 三维数组。例如,一个灰度 MxN 图像只有一个通道,其输出是 MxNx1 张量。一个 MXN 每通道 8 位的 RGB 图像有三个通道,有 3 个 MxN 数组,数值在 0 和 255 之间,所以输出是 MxNx3 张量。对于咱们当初的问题,图像是灰度的,但咱们须要通过应用 array\_reshape() 将二维数组重塑为三维张量来特地定义有一个通道。input\_shape 变量将在前面的 CNN 模型中应用。对于 RGB 色彩的图像,通道的数量是 3,如果输出的图像是 RGB 格局,咱们须要在上面的代码单元中用 “3 “ 代替 “1”。

3.2.1 在维度中增加通道

x\_train <- array\_reshape(x\_train, c(nrow(x\_train), img\_rows, img\_cols, 1))
x\_test <- array\_reshape(x\_test, c(nrow(x\_test), img\_rows, img\_cols, 1))
input\_shape <- c(img\_rows, img_cols, 1)

这里是重塑图像的构造,第一维是图像索引,第 2 - 4 维是一个三维张量,只管只有一个通道。

str(x_train)

3.2.2 标准化

与 DNN 模型一样,为了在优化过程中同样思考数值的稳定性,咱们将输出值标准化为 0 和 1 之间。

x\_train <- x\_train / 255
x\_test <- x\_test / 255

3.2.3 将因变量转换为分类变量

与 DNN 模型一样,因变量被转换为分类变量。

# 将类向量转换为二进制类矩阵
to_categorical(train, numclass)

3.3 构建一个 CNN 模型

正如咱们所探讨的,CNN 模型蕴含一系列二维卷积层,其中有几个参数。(1)kernal\_size,通常是 3 ×3 或 5 ×5;(2) 过滤器的数量,对应于输入张量中的通道数量(即第三维);(3) 激活函数。对于第一层,还有一个 input\_shape 参数,即输出图像的尺寸和通道。为了避免适度拟合和放慢计算速度,通常在一个或几个二维卷积层之后利用一个池化层。一个典型的池化层将 2 ×2 池大小的最大值作为输入的新值,这基本上是将大小缩小到一半。除了池化街坊值之外,也能够应用 Dropout。在几个二维卷积层之后,咱们还须要将三维张量输入 “ 扁平化 “ 为一维张量,而后增加一个或几个密集层,将二维卷积层的输入连贯到指标因变量类别。

3.3.1 定义一个 CNN 模型构造

当初咱们定义一个 CNN 模型,其中有两个带有最大池的二维卷积层,第 2 层带有附加滤波以避免过拟合。而后将输入扁平化,并应用两个密集层连贯到图像的类别。

# 定义模型构造 
  conv_2d(filters = 32,size = c(3,3)) %>% 
  max\_pooling\_2d(size = c(2, 2)) %>% 
  conv_2d(filters = 64, size = c(3,3),  'relu') %>% 
  max_pooling(size = c(2, 2)) %>% 
  dropout(rate = 0.25) %>% 
  layer_flatten() %>%
summary(model)

3.3.2  编译模型

与 DNN 模型相似,咱们须要编译所定义的 CNN 模型。

# 编译模型

 loss\_categorical\_crossentropy,
optimizer_adadelta(),
 c('accuracy')

训练模型并保留每个训练迭代(epochs)的历史。请留神,因为咱们没有应用 GPU,它须要几分钟的工夫来实现。如果在 GPU 上运行,训练工夫能够大大减少。

3.3.3 训练模型

当初,咱们能够用咱们解决过的数据来训练模型。每个 epochs 的历史记录都能够被保留下来以追踪进度。请留神,因为咱们没有应用 GPU,它须要几分钟的工夫来实现。在期待后果时,请急躁期待。如果在 GPU 上运行,训练工夫能够大大减少。

# 训练模型
fit(
  x\_train, y\_train,
  validation_split = 0.2
)

plot(cnn)

能够在测试数据集上评估训练后的模型准确性,这是很好的。

 evaluate(x\_test, y\_test)

3.4 模型预测

对于任何新的图像,在通过同样的预处理后,咱们能够用训练好的模型来预测该图像属于哪一个数字。

#
# 模型预测

 
              predict\_classes(x\_test)

3.5 查看误判的图像

当初让咱们查看几张被误判的图像,看看是否能比这个简略的 CNN 模型做得更好。

## 错分类图像的数量
sum(cnn_pred != testy)

x\[cnn_pred != test$y,\]
y\[cnn_pred !=test$y\]
cnn\_pred\[cnn\_pred !=test$y\]
index_image = 6 ## 扭转这个索引以看到不同的图像。image(1:28,  output_matrix


 

最受欢迎的见解

1.r 语言用神经网络改良 nelson-siegel 模型拟合收益率曲线剖析

2.r 语言实现拟合神经网络预测和后果可视化

3.python 用遗传算法 - 神经网络 - 含糊逻辑控制算法对乐透剖析

4. 用于 nlp 的 python:应用 keras 的多标签文本 lstm 神经网络分类

5. 用 r 语言实现神经网络预测股票实例

6.R 语言基于 Keras 的小数据集深度学习图像分类

7. 用于 NLP 的 seq2seq 模型实例用 Keras 实现神经机器翻译

8.python 中基于网格搜索算法优化的深度学习模型剖析糖

9.matlab 应用贝叶斯优化的深度学习

正文完
 0