原文链接: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张28x28像素的图像,采纳灰度示意(即每个28x28矩阵中所有的值都是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将一个选定的28x28矩阵绘制成图像。显示图像的形式是从矩阵表示法中旋转了90度。因而,还须要额定的步骤来重新排列矩阵,以便咱们可能应用image()函数来显示它的理论方向。
index_image = 28 ## 扭转这个索引以看不同的图像。output\_matrix <- t(output\_matrix)
这里是上述图像的原始28x28矩阵。
input_matrix
3 卷积神经网络模型
在本节中,咱们将展现如何应用卷积神经网络(CNN)对MNIST手写数据集进行分类,将图像分为数字。这与咱们之前学习的问题完全相同,但CNN是一种比个别的深度神经网络更好的图像识别深度学习办法。CNN利用了二维图像中相邻像素之间的关系来取得更好的性能。它还防止了为全彩的高分辨率图像生成数千或数百万的特色。
3.1 数据集导入和参数设置
当初让咱们再次从头开始导入MNIST数据集,因为咱们曾经专门为深度神经网络模型做了一些预处理。对于CNN,有不同的预处理步骤。咱们还定义了一些当前要应用的参数。
#加载mnist数据的训练和测试数据集x_train <- train$xy_train <- train$yx_test <- test$xy_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 / 255x\_test <- x\_test / 255
3.2.3 将因变量转换为分类变量
与DNN模型一样,因变量被转换为分类变量。
#将类向量转换为二进制类矩阵to_categorical(train, numclass)
3.3 构建一个CNN模型
正如咱们所探讨的,CNN模型蕴含一系列二维卷积层,其中有几个参数。(1)kernal\_size,通常是3x3或5x5;(2)过滤器的数量,对应于输入张量中的通道数量(即第三维);(3)激活函数。对于第一层,还有一个input\_shape参数,即输出图像的尺寸和通道。为了避免适度拟合和放慢计算速度,通常在一个或几个二维卷积层之后利用一个池化层。一个典型的池化层将2x2池大小的最大值作为输入的新值,这基本上是将大小缩小到一半。除了池化街坊值之外,也能够应用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应用贝叶斯优化的深度学习