【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享

简介: 【视频】神经网络正则化方法防过拟合和R语言CNN分类手写数字图像数据MNIST|数据分享

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

在本文中,在训练深度神经网络时,在训练集和验证集上实现相同的性能通常很麻烦。验证集上相当高的误差是过度拟合的明显标志:神经网络在训练数据方面变得过于专业,我们将学习如何使用keras,用手写数字图像数据集(即MNIST)查看文末了解数据获取方式进行深度学习。

在本文中,我们提供了有关如何绕过此问题的综合指南。


神经网络中的过拟合


在处理任何机器学习应用程序时,重要的是要清楚地了解模型的偏差和方差在传统的机器学习算法中,我们讨论了偏差与方差的权衡**,它包括试图最小化模型的方差和偏差时的斗争。为了减少模型的偏差,即减少错误假设造成的误差,我们需要一个更复杂的模型。相反,减少模型的方差,即模型在捕捉训练数据变化方面的敏感度,意味着一个更简单的模型。很简单,在传统机器学习中,偏差与方差的权衡源于同时需要更复杂和更简单模型的冲突。


深度学习时代,有一些工具可以在不损害模型偏差的情况下仅减少模型的方差,或者相反,在不增加方差的情况下减少偏差。在探索用于防止神经网络过度拟合的不同技术之前,重要的是要弄清楚高方差或高偏差的含义。


考虑一个常见的神经网络任务,例如图像识别,并考虑一个识别图片中是否存在熊猫的神经网络。我们可以自信地评估人类可以以接近 0% 的错误率执行这项任务。因此,这是图像识别网络准确性的合理基准。在训练集上训练神经网络并评估其在训练集和验证集上的性能后,我们可能会得出以下不同的结果:

  1. 训练错误 = 20% 和验证错误 = 22%
  2. 训练错误 = 1% 和验证错误 = 15%
  3. 训练误差 = 0.5% 和验证误差 = 1%
  4. 训练错误 = 20% 和验证错误 = 30%


第一个例子是高偏差的典型例子:训练集和验证集的误差都很大。相反,第二个示例存在高方差,在处理模型未从中学习的数据时准确度要低得多。第三个结果代表低方差和偏差,该模型可以被认为是有效的。最后,第四个例子展示了高偏差和高方差的情况:与基准相比,不仅训练误差很大,而且验证误差也更高。

从现在开始,我将介绍几种正则化技术,用于减少模型对训练数据的过度拟合。它们对前面示例的情况 2. 和 4. 是有益的。


神经网络的 L1 和 L2 正则化


与经典回归算法(线性、逻辑、多项式等)类似,L1 和 L2 正则化也可用于防止高方差神经网络中的过度拟合。

L1 和 L2 正则化技术背后的想法是将模型的权重限制为更小或将其中一些权重缩小到 0。

考虑经典深度神经网络的成本函数 J:

当然,成本函数 J 是每个层 1、...、L 的权重和偏差的函数。m 是训练样本的数量,ℒ 是损失函数。


L1 正则化

在 L1 正则化中,我们将以下项添加到成本函数 J:

其中矩阵范数是网络的每一层 1, ..., L 的权重绝对值之和:

λ 是正则化项。这是一个必须仔细调整的超参数。λ 直接控制正则化的影响:随着 λ 的增加,对权重收缩的影响更加严重。

L1 正则化下的完整成本函数变为:

对于 λ=0,L1 正则化的效果为空。相反,选择太大的 λ 值会过度简化模型,可能会导致网络拟合不足。

L1 正则化可以被认为是一种神经元选择过程,因为它会使一些隐藏神经元的权重为零。


L2 正则化

在 L2 正则化中,我们添加到成本函数中的项如下:


在这种情况下,正则化项是每个网络层权重的平方范数。该矩阵范数称为 Frobenius 范数,并且明确地计算如下:


请注意,相对于第 l 层的权重矩阵有 n^{[l]} 行和 n^{[l-1]} 列。

最后,L2 正则化下的完整代价函数变为:


同样,λ 是正则化项,对于 λ=0,L2 正则化的效果为空。

L2 正则化使权重值趋近于零,从而产生更简单的模型。


L1 和 L2 正则化如何减少过拟合?

L1 和 L2 正则化技术对过度拟合训练数据有积极影响,原因有两个:


  • 一些隐藏单元的权重变得更接近(或等于)0。因此,它们的影响被削弱了,并且生成的网络更简单,因为它更接近更小的网络。如介绍中所述,更简单的网络不太容易过度拟合。
  • 对于较小的权重,隐藏神经元的激活函数的输入 z 也会变小。对于接近 0 的值,许多激活函数的行为是线性的。

第二个原因并非微不足道,值得扩展。考虑一个双曲正切 (tanh) 激活函数,其图形如下:


双曲正切 (tanh)

从函数图中我们可以看到,如果输入值 x 很小,函数 tanh(x) 的行为几乎是线性的。当 tanh 用作神经网络隐藏层的激活函数时,输入值为:

对于小权重 w 也接近于零。

如果神经网络的每一层都是线性的,我们可以证明整个网络的行为是线性的。因此,约束一些隐藏单元来模拟线性函数,会导致网络更简单,因此有助于防止过度拟合。

更简单的模型通常可以避免训练数据中的噪声,因此过拟合的频率较低。


dropout


dropout 正则化的思想是随机删除网络中的一些节点。在训练过程之前,我们为网络的每个节点设置一个概率(假设 p = 50%)。在训练阶段,每个节点都有 p 概率被关闭。dropout 过程是随机的,它是针对每个训练示例单独执行的。因此,每个训练示例都可能在不同的网络上进行训练。

至于 L2 正则化,dropout 正则化的结果是一个更简单的网络,一个更简单的网络导致一个不太复杂的模型,也不太容易过拟合。


dropout 对简单网络的影响。


R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)


在本文中,我们将学习如何使用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/MNIST_database

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矩阵。


点击标题查阅往期内容


【视频】CNN(卷积神经网络)模型以及R语言实现回归数据分析


01

02

03

04



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,通常是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

数字9被误预测为数字8

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
3月前
|
存储 数据采集 数据处理
R语言数据变换:使用tidyr包进行高效数据整形的探索
【8月更文挑战第29天】`tidyr`包为R语言的数据整形提供了强大的工具。通过`pivot_longer()`、`pivot_wider()`、`separate()`和`unite()`等函数,我们可以轻松地将数据从一种格式转换为另一种格式,以满足不同的分析需求。掌握这些函数的使用,将大大提高我们处理和分析数据的效率。
|
1月前
|
机器学习/深度学习 计算机视觉
TPAMI 2024:计算机视觉中基于图神经网络和图Transformers的方法和最新进展
【10月更文挑战第3天】近年来,图神经网络(GNNs)和图Transformers在计算机视觉领域取得显著进展,广泛应用于图像识别、目标检测和场景理解等任务。TPAMI 2024上的一篇综述文章全面回顾了它们在2D自然图像、视频、3D数据、视觉与语言结合及医学图像中的应用,并深入分析了其基本原理、优势与挑战。GNNs通过消息传递捕捉非欧式结构,图Transformers则结合Transformer模型提升表达能力。尽管存在图结构构建复杂和计算成本高等挑战,但这些技术仍展现出巨大潜力。论文详细内容见:https://arxiv.org/abs/2209.13232。
53 3
|
2月前
R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图
【9月更文挑战第9天】在R语言中,利用`ggplot2`包可绘制多系列柱状图与直方图。首先读取数据文件`data.csv`,加载`ggplot2`包后,使用`ggplot`函数指定轴与填充颜色,并通过`geom_bar`或`geom_histogram`绘图。参数如`stat`, `position`, `alpha`等可根据需要调整,实现不同系列的图表展示。
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
3月前
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
2月前
|
机器学习/深度学习 数据采集 算法
图像处理神经网络数据预处理方法
图像预处理步骤对于图像处理神经网络至关重要。这些步骤不仅保证了数据的一致性和质量,还可以通过数据增强等技术提高模型的泛化能力,从而提升模型的整体性能。每一步骤的选择和应用都基于具体任务和数据集的特性,并在模型训练和测试过程中起到关键作用。
58 0
|
1月前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第7天】本文将深入探讨卷积神经网络(CNN)的基本原理,以及它如何在图像识别领域中大放异彩。我们将从CNN的核心组件出发,逐步解析其工作原理,并通过一个实际的代码示例,展示如何利用Python和深度学习框架实现一个简单的图像分类模型。文章旨在为初学者提供一个清晰的入门路径,同时为有经验的开发者提供一些深入理解的视角。
|
11天前
|
机器学习/深度学习 计算机视觉 网络架构
为什么卷积现在不火了:CNN研究热度降温的深层原因分析
纵观近年的顶会论文和研究热点,我们不得不承认一个现实:CNN相关的研究论文正在减少,曾经的"主角"似乎正逐渐淡出研究者的视野。
43 11
为什么卷积现在不火了:CNN研究热度降温的深层原因分析

热门文章

最新文章