提交 23a69a36 编写于 作者: W wizardforcel

2020-08-27 17:22:12

上级 2ef331ad
此差异已折叠。
......@@ -93,7 +93,7 @@
![](img/ea7fa58f-ba10-4924-a55c-5875ee0b307b.png)
因此,在模型训练期间,我们有一对( *I**S* )图像标题作为输入,其思想是针对上一个方程式优化对数概率的总和 使用有效算法(例如随机梯度下降)来完整训练数据。 考虑到前面公式的 RHS 中的项序列,基于 RNN 的模型是合适的选择,这样,直到 *t-1* 的可变单词数依次由存储状态 *h 表示 <sub>t</sub>* 。 根据先前的 *t-1* 状态和输入对(图像和下一个字) *x <sub>t</sub>* ,使用以下命令在每个步骤中按以下步骤更新此内容: 非线性函数`f(...)`
因此,在模型训练期间,我们有一对(*I**S*)图像标题作为输入,其思想是针对上一个方程式优化对数概率的总和 使用有效算法(例如随机梯度下降)来完整训练数据。 考虑到前面公式的 RHS 中的项序列,基于 RNN 的模型是合适的选择,这样,直到 *t-1* 的可变单词数依次由存储状态 *h 表示 <sub>t</sub>* 。 根据先前的 *t-1* 状态和输入对(图像和下一个字) *x <sub>t</sub>* ,使用以下命令在每个步骤中按以下步骤更新此内容: 非线性函数`f(...)`
*h <sub>t + 1</sub> = f(h <sub>t</sub> ,x <sub>t</sub> )*
......
......@@ -91,7 +91,7 @@ LAB 色彩空间(来源:Holger kkk Everding –自己的作品,CC BY-SA 4.
最近的工作,以及迁移学习的力量,已经巧妙地尝试利用包含灰度通道作为其组成部分之一的颜色模型。 那会响吗? 现在让我们从另一个角度看问题陈述。
除了无所不在的 RGB 颜色空间外,我们还讨论了 LAB。 LAB 色彩空间包含灰度值,因为 *L* 通道(用于亮度),而其余两个通道( *a**b* )赋予颜色属性。 因此,着色问题可以用以下数学方式建模:
除了无所不在的 RGB 颜色空间外,我们还讨论了 LAB。 LAB 色彩空间包含灰度值,因为 *L* 通道(用于亮度),而其余两个通道(*a**b*)赋予颜色属性。 因此,着色问题可以用以下数学方式建模:
![](img/90336338-d933-4938-99f5-5a8295c39919.png)
......@@ -101,7 +101,7 @@ LAB 色彩空间(来源:Holger kkk Everding –自己的作品,CC BY-SA 4.
colornet 转换
简而言之,我们已经将图像着色的任务转换为将一个通道(灰度 **L** 通道)转换为两个颜色通道( **A****B**)的任务 ,说明如下:
简而言之,我们已经将图像着色的任务转换为将一个通道(灰度 **L** 通道)转换为两个颜色通道(**A****B**)的任务 ,说明如下:
![](img/9ff5a5d4-1ebb-4948-9c61-6e45b7a3a6d5.png)
......
......@@ -83,7 +83,7 @@
![](img/38d54157-0b1a-4a50-bced-6460281a2b6f.png)
单击启动实例按钮应带您到该页面,以选择您自己的 **Amazon Machine Image** **AMI**)。 通常,AMI 由构建虚拟服务器所需的各种软件配置组成。 它包括以下内容:
单击启动实例按钮应带您到该页面,以选择您自己的 **Amazon Machine Image****AMI**)。 通常,AMI 由构建虚拟服务器所需的各种软件配置组成。 它包括以下内容:
* 实例的根卷的模板,其中包括服务器的操作系统,应用程序和其他配置设置。
* 启动许可设置,用于控制哪些 AWS 账户可以使用 AMI 启动实例。
......@@ -685,7 +685,7 @@ history = model.fit(X, y, batch_size=5, epochs=30,verbose=2)
| h | ![](img/d6ae84fd-03b3-4511-9ce7-cf04ed45a6c9.png) |
| 恢复 | ![](img/af2bf69a-947a-4c6e-a8f5-09769d6c213b.png)或![](img/7137e27c-ad6f-4d2b-a734-7add27c6a166.png) |
如果我们有一个 k 类( *k > 2* )分类问题,那么我们基本上想学习条件概率分布 *P(y | x)*。 因此,输出层应具有 *k* 个神经元,其值应为 1。为了使网络了解所有 *k* 单位的输出应为 1, 使用 **softmax 激活**功能。 这是乙状结肠激活的概括。 像 S 型函数一样,softmax 函数将每个单元的输出压缩为 0 到 1 之间。
如果我们有一个 k 类(*k > 2*)分类问题,那么我们基本上想学习条件概率分布 *P(y | x)*。 因此,输出层应具有 *k* 个神经元,其值应为 1。为了使网络了解所有 *k* 单位的输出应为 1, 使用 **softmax 激活**功能。 这是乙状结肠激活的概括。 像 S 型函数一样,softmax 函数将每个单元的输出压缩为 0 到 1 之间。
而且,它会将每个输出相除,以使输出的总和等于 1:
......@@ -731,7 +731,7 @@ history = model.fit(X, y, batch_size=5, epochs=30,verbose=2)
# 损失函数
损失函数将神经网络的输出与训练中的目标值进行比较,产生一个损失值/分数,以测量网络的预测与期望值的匹配程度。 在上一节中,我们看到了针对不同任务(例如回归和二进制分类)的不同类型损失函数的需求。 以下是一些其他流行的损失函数:
损失函数将神经网络的输出与训练中的目标值进行比较,产生一个损失值/分数,以测量网络的预测与期望值的匹配程度。 在上一节中,我们看到了针对不同任务(例如回归和二分类)的不同类型损失函数的需求。 以下是一些其他流行的损失函数:
* **二进制交叉熵**:关于逻辑单元的上一节讨论的两类分类问题的对数损失或交叉熵损失。
* **分类交叉熵**:如果我们有 *K* 类分类问题,那么我们将广义交叉熵用于 *K* 类。
......@@ -1036,7 +1036,7 @@ RMSprop 通过采用先前平方梯度的 EWMA 来修改 AdaGrad 算法。 它
**自适应力矩****Adam**)。 它充分利用了基于动量的算法和自适应学习率算法,并将它们组合在一起。 在此,动量算法应用于由 RMSprop 计算的重新缩放的梯度。
# 神经网络中的过拟合和不足拟合
# 神经网络中的过拟合和不足拟合
与其他任何 ML 训练一样,用于训练深度学习模型的数据集也分为训练,测试和验证。 在模型的迭代训练期间,通常,验证误差比训练误差略大。 如果测试误差和验证误差之间的差距随着迭代的增加而增加,则是**过拟合**的情况。 如果训练误差不再减小到足够低的值,我们可以得出结论,该模型是**不适合**的。
......@@ -1049,17 +1049,17 @@ RMSprop 通过采用先前平方梯度的 EWMA 来修改 AdaGrad 算法。 它
![](img/1fa01356-977d-41e1-ab20-36fab28171bf.png)
(左):线性函数根据数据拟合而拟合。 (中):适合数据的二次函数可以很好地推广到看不见的点
(右)适合数据的次数为 9 的多项式存在过拟合的问题
(右)适合数据的次数为 9 的多项式存在过拟合的问题
具有极高容量的模型可能通过训练集中的学习模式而过拟合训练集,而训练模式可能无法很好地推广到看不见的测试集。 而且,它非常适合少量的训练数据。 另一方面,低容量的模型可能难以适应训练集:
具有极高容量的模型可能通过训练集中的学习模式而过拟合训练集,而训练模式可能无法很好地推广到看不见的测试集。 而且,它非常适合少量的训练数据。 另一方面,低容量的模型可能难以适应训练集:
![](img/2ade6f4c-448f-4fad-acd7-2ef73fac4d5e.png)
在培训和验证损失方面过拟合/不足拟合
在培训和验证损失方面过拟合/不足拟合
# 如何避免过拟合-正则化
# 如何避免过拟合-正则化
度拟合是 ML 中的核心问题。 对于神经网络,开发了许多策略来避免过度拟合并减少泛化误差。 这些策略统称为**正则化**
拟合是 ML 中的核心问题。 对于神经网络,开发了许多策略来避免过拟合并减少泛化误差。 这些策略统称为**正则化**
# 重量分享
......
......@@ -72,7 +72,7 @@
自从 Ian Goodfellow 及其合著者在 2014 年 NIPS 论文中首次引入以来,**生成对抗网络****GAN**)就[广受青睐](https://arxiv.org/pdf/1406.2661.pdf)。 现在我们看到了 GAN 在各个领域的应用。 Insilico Medicine 的研究人员提出了一种使用 GAN 进行人工药物发现的方法。 他们还发现了在图像处理和视频处理问题中的应用,例如图像样式转换和**深度卷积生成对抗网络****DCGAN**)。
顾名思义,这是使用神经网络的另一种生成模型。 GAN 具有两个主要组成部分:生成器神经网络和鉴别器神经网络。 生成器网络采用随机噪声输入,并尝试生成数据样本。 鉴别器网络将生成的数据与真实数据进行比较,并使用 S 型输出激活来解决生成的数据是否为伪造的二进制分类问题。 生成器和鉴别器都在不断竞争,并试图互相愚弄-这就是 GAN 也被称为**对抗网络**的原因。 这种竞争驱使两个网络都提高其权重,直到鉴别器开始输出 0.5 的概率为止。 也就是说,直到生成器开始生成真实图像为止。 通过反向传播同时训练两个网络。 这是 GAN 的高级结构图:
顾名思义,这是使用神经网络的另一种生成模型。 GAN 具有两个主要组成部分:生成器神经网络和鉴别器神经网络。 生成器网络采用随机噪声输入,并尝试生成数据样本。 鉴别器网络将生成的数据与真实数据进行比较,并使用 S 型输出激活来解决生成的数据是否为伪造的二分类问题。 生成器和鉴别器都在不断竞争,并试图互相愚弄-这就是 GAN 也被称为**对抗网络**的原因。 这种竞争驱使两个网络都提高其权重,直到鉴别器开始输出 0.5 的概率为止。 也就是说,直到生成器开始生成真实图像为止。 通过反向传播同时训练两个网络。 这是 GAN 的高级结构图:
![](img/e1a9d83e-820d-491b-8427-d1068af52a1e.png)
......@@ -242,7 +242,7 @@ VGG-16:输入大小为 224 x 224 x 3 的 RGB 图像,每层中的滤镜数量
# 残留神经网络
在 ILSVRC 2015 中,由 Kaiming He 及其来自 Microsoft Research Asia 的合著者介绍了一种具有*跳过连接**批量归一化*的新颖 CNN 架构,称为**残留神经网络** ]( **ResNet**)。 这样,他们就可以训练一个具有 152 层(比 VGG 网络深八倍)的神经网络,同时仍比 VGG 网络具有更低的复杂度。 它的前 5 个错误率达到 3.57%,在此数据集上超过了人类水平的性能。
在 ILSVRC 2015 中,由 Kaiming He 及其来自 Microsoft Research Asia 的合著者介绍了一种具有*跳过连接**批量归一化*的新颖 CNN 架构,称为**残留神经网络** ](**ResNet**)。 这样,他们就可以训练一个具有 152 层(比 VGG 网络深八倍)的神经网络,同时仍比 VGG 网络具有更低的复杂度。 它的前 5 个错误率达到 3.57%,在此数据集上超过了人类水平的性能。
该体系结构的主要思想如下。 他们没有希望一组堆叠的层将直接适合所需的基础映射 *H(x)*,而是尝试适应残差映射。 更正式地讲,他们让堆叠的层集学习残差 *R(x)= H(x)-x* ,随后通过跳过连接获得真实映射。 然后将输入添加到学习的残差 *R(x)+ x*
......@@ -276,7 +276,7 @@ print(model.summary())
![](img/86ce06a7-a636-494c-b62f-1addb7e0d1a3.png)
这是一种浅薄的体系结构,需要根据 MNIST 数据(28 x 28 个手写数字图像)进行训练。 这具有两个卷积层。 第一卷积层具有 256 个特征图,具有 9 x 9 内核(步幅= 1)和 ReLu 激活。 因此,每个特征图是(28-9 + 1)x(28-9 + 1)或 20 x20。第二个卷积层又具有 256 个特征图,具有 9 x 9 个内核(步幅= 2)和 ReLu 激活。 这里每个特征图是 6 x 6、6 =((20-9)/ 2 + 1)。 对该图层进行了重塑,或者将特征图重新分组为 32 组,每组具有 8 个特征图(256 = 8 x 32)。 分组过程旨在创建每个大小为 8 的特征向量。为了表示姿势,向量表示是一种更自然的表示。 来自第二层的分组特征图称为**主胶囊**层。 我们有(32 x 6 x 6)八维胶囊向量,其中每个胶囊包含 8 个卷积单元,内核为 9 x 9,步幅为 2。最后一个胶囊层( **DigitCaps**)有十六个 每位类别(10 个类别)的三维胶囊,这些胶囊中的每一个都从主胶囊层中的所有胶囊接收输入。
这是一种浅薄的体系结构,需要根据 MNIST 数据(28 x 28 个手写数字图像)进行训练。 这具有两个卷积层。 第一卷积层具有 256 个特征图,具有 9 x 9 内核(步幅= 1)和 ReLu 激活。 因此,每个特征图是(28-9 + 1)x(28-9 + 1)或 20 x20。第二个卷积层又具有 256 个特征图,具有 9 x 9 个内核(步幅= 2)和 ReLu 激活。 这里每个特征图是 6 x 6、6 =((20-9)/ 2 + 1)。 对该图层进行了重塑,或者将特征图重新分组为 32 组,每组具有 8 个特征图(256 = 8 x 32)。 分组过程旨在创建每个大小为 8 的特征向量。为了表示姿势,向量表示是一种更自然的表示。 来自第二层的分组特征图称为**主胶囊**层。 我们有(32 x 6 x 6)八维胶囊向量,其中每个胶囊包含 8 个卷积单元,内核为 9 x 9,步幅为 2。最后一个胶囊层(**DigitCaps**)有十六个 每位类别(10 个类别)的三维胶囊,这些胶囊中的每一个都从主胶囊层中的所有胶囊接收输入。
胶囊的输出矢量的长度表示由胶囊表示的实体存在于当前输入中的概率。 胶囊向量的长度被归一化,并保持在 0 到 1 之间。此外,在向量的范数上使用了压缩函数,以使短向量缩小到几乎零长度,而长向量缩小到略小于 1 的长度。
......@@ -365,7 +365,7 @@ return vj
我建议您在查看 [Christophers 的博客](http://colah.github.io/posts/2015-08-Understanding-LSTMs/),以获取有关 LSTM 步骤的更详细说明。 我们在这里查看的大多数图表均来自此。
LSTM 可以用于序列预测以及序列分类。 例如,我们可以预测未来的股价。 另外,我们可以使用 LSTM 构建分类器,以预测来自某些健康监控系统的输入信号是致命还是非致命信号(二进制分类器)。 我们甚至可以使用 LSTM 构建文本文档分类器。 单词序列将作为 LSTM 层的输入,LSTM 的隐藏状态将连接到密集的 softmax 层作为分类器。
LSTM 可以用于序列预测以及序列分类。 例如,我们可以预测未来的股价。 另外,我们可以使用 LSTM 构建分类器,以预测来自某些健康监控系统的输入信号是致命还是非致命信号(二分类器)。 我们甚至可以使用 LSTM 构建文本文档分类器。 单词序列将作为 LSTM 层的输入,LSTM 的隐藏状态将连接到密集的 softmax 层作为分类器。
# 堆叠式 LSTM
......
......@@ -68,7 +68,7 @@
![](img/d21e706b-b7fc-4321-8536-06c2f01ee8ce.png)
使用此框架,我们可以将迁移学习定义为旨在改善目标目标功能 *f <sub>T</sub>* (或目标任务, *T <sub>T</sub> )的过程。* ),使用来自 *T* <sub>*S*</sub> 源的知识,在目标域中将 *D <sub>T</sub>* *D <sub>S</sub>* 域中的任务。 这导致以下四种情况:
使用此框架,我们可以将迁移学习定义为旨在改善目标目标功能 *f <sub>T</sub>* (或目标任务, *T <sub>T</sub> )的过程。*),使用来自 *T* <sub>*S*</sub> 源的知识,在目标域中将 *D <sub>T</sub>* *D <sub>S</sub>* 域中的任务。 这导致以下四种情况:
* **特征空间**:源域和目标域的特征空间互不相同,例如χ <sub>s</sub> ≠χ <sub>t</sub> 。 例如,如果我们的任务与文档分类有关,则此方案以不同的语言引用源任务和目标任务。
* **边际概率**:边际概率或源域和目标域不同,例如 P(X <sub>s</sub> )≠P(X <sub>t</sub> )。 这种情况也称为**域适配** *。*
......@@ -174,7 +174,7 @@ Pan 和 Yang 撰写的论文《迁移学习综述》[可以在此处找到](http
# 零镜头学习
零镜头学习是迁移学习的另一个极端变体,它不依赖任何标记的示例来学习任务。 这听起来令人难以置信,尤其是当使用示例学习是大多数监督学习算法所要解决的问题时。 零数据学习或零短学习方法在训练阶段本身进行了巧妙的调整,以利用附加信息来理解看不见的数据。 在他们的 *[Lear Lear* *ning* )一书中,Goodfellow 及其合作者提出了 z *eroshot 学习*作为学习三个变量的场景,例如 传统输入变量 *x* ,传统输出变量 *y* 以及描述任务的其他随机变量 *T* 。 因此,训练模型以学习 *P(y | x,T)*的条件概率分布。 零镜头学习在机器翻译等场景中非常有用,在这种情况下,我们甚至可能没有目标语言的标签。
零镜头学习是迁移学习的另一个极端变体,它不依赖任何标记的示例来学习任务。 这听起来令人难以置信,尤其是当使用示例学习是大多数监督学习算法所要解决的问题时。 零数据学习或零短学习方法在训练阶段本身进行了巧妙的调整,以利用附加信息来理解看不见的数据。 在他们的 *[Lear Lear* *ning*)一书中,Goodfellow 及其合作者提出了 z *eroshot 学习*作为学习三个变量的场景,例如 传统输入变量 *x* ,传统输出变量 *y* 以及描述任务的其他随机变量 *T* 。 因此,训练模型以学习 *P(y | x,T)*的条件概率分布。 零镜头学习在机器翻译等场景中非常有用,在这种情况下,我们甚至可能没有目标语言的标签。
# 迁移学习的挑战
......
......@@ -21,13 +21,13 @@
现在让我们考虑一个现实世界的问题,在本章中,我们还将继续使用它来说明我们不同的深度学习模型,并在同一模型上利用迁移学习。 您必须一次又一次听到深度学习的关键要求之一是,我们需要大量数据和样本来构建可靠的深度学习模型。 其背后的想法是模型可以从大量样本中自动学习特征。 但是,如果我们没有足够的训练样本并且要解决的问题仍然是一个相对复杂的问题,我们该怎么办? 例如,计算机视觉问题,例如图像分类,可能难以使用传统的统计技术或**机器学习****ML**)技术解决。 我们会放弃深度学习吗?
考虑到**图像分类**问题,由于我们要处理的图像本质上是高维张量,因此拥有更多数据可使深度学习模型学习更好的图像基本特征表示。 但是,即使我们每个类别的图像样本的范围从几百到数千,基本的 CNN 模型在正确的体系结构和规范化条件下仍能正常运行。 这里要记住的关键点是,CNN 会学习与缩放,平移和旋转不变的模式和特征,因此我们在这里不需要自定义特征工程技术。 但是,我们可能仍然会遇到模型过拟合之类的问题,我们将在本章稍后部分尝试解决这些问题。
考虑到**图像分类**问题,由于我们要处理的图像本质上是高维张量,因此拥有更多数据可使深度学习模型学习更好的图像基本特征表示。 但是,即使我们每个类别的图像样本的范围从几百到数千,基本的 CNN 模型在正确的体系结构和规范化条件下仍能正常运行。 这里要记住的关键点是,CNN 会学习与缩放,平移和旋转不变的模式和特征,因此我们在这里不需要自定义特征工程技术。 但是,我们可能仍然会遇到模型过拟合之类的问题,我们将在本章稍后部分尝试解决这些问题。
关于迁移学习,已经在著名的 [ImageNet 数据集](http://image-net.org/about-overview)上训练了一些出色的预训练深度学习模型。 我们已经在第 3 章和*了解深度学习架构*中详细介绍了其中一些模型,本章将利用著名的`VGG-16`模型。 想法是使用通常是图像分类专家的预训练模型来解决我们的问题,即数据样本较少。
# 制定我们的现实问题
正如我们前面提到的,我们将在图像分类问题上进行工作,每个类别的训练样本数量较少。 我们的问题的数据集可在 Kaggle 上获得,它是其中最受欢迎的基于计算机视觉的数据集之一。 我们将使用的数据集来自[**猫狗**挑战](https://www.kaggle.com/c/dogs-vs-cats/data),而我们的 主要目标是建立一个可以成功识别图像并将其分类为猫或狗的模型。 就机器学习而言,这是一个基于图像的二进制分类问题。
正如我们前面提到的,我们将在图像分类问题上进行工作,每个类别的训练样本数量较少。 我们的问题的数据集可在 Kaggle 上获得,它是其中最受欢迎的基于计算机视觉的数据集之一。 我们将使用的数据集来自[**猫狗**挑战](https://www.kaggle.com/c/dogs-vs-cats/data),而我们的 主要目标是建立一个可以成功识别图像并将其分类为猫或狗的模型。 就机器学习而言,这是一个基于图像的二分类问题。
首先,从数据集页面下载`train.zip`文件并将其存储在本地系统中。 下载后,将其解压缩到文件夹中。 该文件夹将包含 25,000 张猫和狗的图像; 即每个类别 12500 张图像。
......@@ -199,7 +199,7 @@ print(train_labels[1495:1505], train_labels_enc[1495:1505])
我们将从建立具有三个卷积层的基本 CNN 模型开始,再加上用于从图像中自动提取特征的最大池化,以及对输出卷积特征图进行下采样。 要刷新有关卷积和池化层如何工作的记忆,请查看第 3 章和*了解深度学习架构*中的 CNN 部分。
提取这些特征图后,我们将使用一个密集层以及一个具有 S 型函数的输出层进行分类。 由于我们正在执行二进制分类,因此`binary_crossentropy`损失函数就足够了。 我们将使用流行的 RMSprop 优化器,该优化器可帮助我们使用反向传播来优化网络中单元的权重,从而使网络中的损失降到最低,从而得到一个不错的分类器。 请参阅第 2 章,*深度学习要点*中的*随机梯度下降**SGD 改进*部分,以获取深入的想法 有关优化器如何工作的信息。 简而言之,优化器(如 RMSprop)指定有关损耗梯度如何用于更新传递到我们网络的每批数据中的参数的规则。
提取这些特征图后,我们将使用一个密集层以及一个具有 S 型函数的输出层进行分类。 由于我们正在执行二分类,因此`binary_crossentropy`损失函数就足够了。 我们将使用流行的 RMSprop 优化器,该优化器可帮助我们使用反向传播来优化网络中单元的权重,从而使网络中的损失降到最低,从而得到一个不错的分类器。 请参阅第 2 章,*深度学习要点*中的*随机梯度下降**SGD 改进*部分,以获取深入的想法 有关优化器如何工作的信息。 简而言之,优化器(如 RMSprop)指定有关损耗梯度如何用于更新传递到我们网络的每批数据中的参数的规则。
让我们利用 Keras 并立即构建我们的 CNN 模型架构:
......@@ -317,7 +317,7 @@ l2 = ax2.legend(loc="best")
![](img/d38f922d-b1ed-41c4-888c-146a5fa4c0a1.png)
您可以清楚地看到,在 2-3 个时期之后,模型开始对训练数据进行过拟合。 我们在验证集中获得的平均准确度约为 **72%** ,这不是一个不好的开始! 我们可以改进此模型吗?
您可以清楚地看到,在 2-3 个时期之后,模型开始对训练数据进行过拟合。 我们在验证集中获得的平均准确度约为 **72%** ,这不是一个不好的开始! 我们可以改进此模型吗?
# 具有正则化的 CNN 模型
......@@ -377,9 +377,9 @@ Epoch 30/30
![](img/3f0bcdb3-568a-48e2-8003-b2cd4f4f4b61.png)
从前面的输出中您可以清楚地看到,尽管模型花费了更长的时间,但仍然最终使模型过拟合,并且我们还获得了约 **78%** 的更好的验证精度,这虽然不错,但并不令人惊讶。
从前面的输出中您可以清楚地看到,尽管模型花费了更长的时间,但仍然最终使模型过拟合,并且我们还获得了约 **78%** 的更好的验证精度,这虽然不错,但并不令人惊讶。
模型过拟合的原因是因为我们的训练数据少得多,并且模型在每个时期随着时间的推移不断看到相同的实例。 解决此问题的一种方法是利用图像增强策略,以与现有图像略有不同的图像来增强我们现有的训练数据。 我们将在下一节中详细介绍。 让我们暂时保存该模型,以便以后可以使用它来评估其在测试数据上的性能:
模型过拟合的原因是因为我们的训练数据少得多,并且模型在每个时期随着时间的推移不断看到相同的实例。 解决此问题的一种方法是利用图像增强策略,以与现有图像略有不同的图像来增强我们现有的训练数据。 我们将在下一节中详细介绍。 让我们暂时保存该模型,以便以后可以使用它来评估其在测试数据上的性能:
```py
model.save('cats_dogs_basic_cnn.h5')
......@@ -387,7 +387,7 @@ model.save('cats_dogs_basic_cnn.h5')
# 具有图像增强功能的 CNN 模型
让我们通过使用适当的图像增强策略添加更多数据来改进我们的常规 CNN 模型。 由于我们先前的模型每次都在相同的小数据点样本上进行训练,因此无法很好地推广,并在经过几个时期后最终过拟合。
让我们通过使用适当的图像增强策略添加更多数据来改进我们的常规 CNN 模型。 由于我们先前的模型每次都在相同的小数据点样本上进行训练,因此无法很好地推广,并在经过几个时期后最终过拟合。
图像增强背后的想法是,我们遵循一个既定过程,从训练数据集中获取现有图像,并对它们应用一些图像变换操作,例如旋转,剪切,平移,缩放等,以生成新的,经过修改的版本 现有图像。 由于这些随机转换,我们每次都不会获得相同的图像,我们将利用 Python 生成器在训练过程中将这些新图像提供给我们的模型。
......@@ -444,7 +444,7 @@ print('Labels:', [item[1][0] for item in dog])
l = [ax[i].imshow(dog[i][0][0]) for i in range(0,5)]
```
这向我们展示了图像增强如何帮助创建新图像,以及在其上训练模型应如何帮助对抗过拟合:
这向我们展示了图像增强如何帮助创建新图像,以及在其上训练模型应如何帮助对抗过拟合:
![](img/47937375-d105-4389-89ce-20b30cfda764.png)
......@@ -733,7 +733,7 @@ Epoch 30/30
![](img/ae38af80-e7a5-45ff-a1b9-d7991de028b6.png)
在第五个时期之后,模型训练与验证准确性之间存在相当大的差距,这清楚表明模型在此之后对训练数据过拟合。 但是总的来说,这似乎是迄今为止最好的模型,通过利用 VGG-16 模型作为特征提取器,我们甚至不需要使用图像增强策略就可以接近 **90%** 验证精度。 但是我们还没有充分利用迁移学习的全部潜力。 让我们尝试在此模型上使用我们的图像增强策略。 在此之前,我们使用以下代码将此模型保存到磁盘:
在第五个时期之后,模型训练与验证准确性之间存在相当大的差距,这清楚表明模型在此之后对训练数据过拟合。 但是总的来说,这似乎是迄今为止最好的模型,通过利用 VGG-16 模型作为特征提取器,我们甚至不需要使用图像增强策略就可以接近 **90%** 验证精度。 但是我们还没有充分利用迁移学习的全部潜力。 让我们尝试在此模型上使用我们的图像增强策略。 在此之前,我们使用以下代码将此模型保存到磁盘:
```py
model.save('cats_dogs_tlearn_basic_cnn.h5')
......
......@@ -99,7 +99,7 @@ model.add(Dropout(0.5))
model.add(Dense(NUM_CLASSES, activation='softmax'))
```
为了提高总体泛化性能,该模型还包含`BatchNormalization`层和`DropOut`层。 这些层有助于我们控制过拟合,还可以防止网络存储数据集本身。
为了提高总体泛化性能,该模型还包含`BatchNormalization`层和`DropOut`层。 这些层有助于我们控制过拟合,还可以防止网络存储数据集本身。
我们仅用 25 个纪元来运行模型,以在验证集上达到约 65%的准确性。 以下屏幕快照显示了训练后的模型的输出预测:
......
......@@ -44,7 +44,7 @@
* 多项式朴素贝叶斯
* 支持向量机
* k 最近邻
* k 最近邻
具有线性核的**支持向量机****SVM**)与用于文本分类的基准数据集相比,通常显示出更高的准确性。
......@@ -173,7 +173,7 @@ pd.DataFrame(similar_words).transpose()
GloVe 模型代表全局向量,它是一种无监督的学习模型,可用于获取类似于 Word2Vec 的密集词向量。 但是,该技术不同,并且对聚合的全局单词-单词共现矩阵执行训练,从而为我们提供了具有有意义子结构的向量空间。 该方法发表在 Pennington 及其合作者的论文[《GloVe:用于词表示的全局向量》](https://www.aclweb.org/anthology/D14-1162)。 我们已经讨论了基于计数的矩阵分解方法,例如**潜在语义分析****LSA**)和预测方法,例如 Word2vec。 本文声称,目前这两个家庭都遭受重大弊端。 像 LSA 之类的方法可以有效地利用统计信息,但是它们在词类比任务上的表现相对较差-我们是如何找到语义相似的词的。 像 skip-gram 这样的方法在类比任务上可能会做得更好,但它们在全局级别上却很少利用语料库的统计信息。
GloVe 模型的基本方法是首先创建一个庞大的单词-上下文共现矩阵,该矩阵由(单词,上下文)对组成,这样该矩阵中的每个元素都代表一个单词在上下文中出现的频率(可以是一个单词 单词顺序)。 这个词-语境矩阵 *WC* 与在各种任务的文本分析中普遍使用的术语-文档矩阵非常相似。 矩阵分解用于将矩阵 *WC* 表示为两个矩阵的乘积。 **字特征****WF**)矩阵和**特征上下文****FC**)矩阵。 *WC = WF x FC* 。 用一些随机权重初始化 *WF**FC* ,然后将它们相乘得到 *WC'*(近似于 *WC* )并进行测量 与 *WC* 有多近。 我们使用**随机梯度下降****SGD**)进行多次操作,以最大程度地减少误差。 最后, *WF* 矩阵为我们提供了每个单词的单词嵌入,其中 *F* 可以预设为特定数量的维。 要记住的非常重要的一点是,Word2vec 和 GloVe 模型在工作方式上非常相似。 他们两个的目的都是建立一个向量空间,每个词的位置根据其上下文和语义而受到其相邻词的影响。 Word2vec 从单词共现对的本地单个示例开始,而 GloVe 从整个语料库中所有单词的全局汇总共现统计开始。
GloVe 模型的基本方法是首先创建一个庞大的单词-上下文共现矩阵,该矩阵由(单词,上下文)对组成,这样该矩阵中的每个元素都代表一个单词在上下文中出现的频率(可以是一个单词 单词顺序)。 这个词-语境矩阵 *WC* 与在各种任务的文本分析中普遍使用的术语-文档矩阵非常相似。 矩阵分解用于将矩阵 *WC* 表示为两个矩阵的乘积。 **字特征****WF**)矩阵和**特征上下文****FC**)矩阵。 *WC = WF x FC* 。 用一些随机权重初始化 *WF**FC* ,然后将它们相乘得到 *WC'*(近似于 *WC*)并进行测量 与 *WC* 有多近。 我们使用**随机梯度下降****SGD**)进行多次操作,以最大程度地减少误差。 最后, *WF* 矩阵为我们提供了每个单词的单词嵌入,其中 *F* 可以预设为特定数量的维。 要记住的非常重要的一点是,Word2vec 和 GloVe 模型在工作方式上非常相似。 他们两个的目的都是建立一个向量空间,每个词的位置根据其上下文和语义而受到其相邻词的影响。 Word2vec 从单词共现对的本地单个示例开始,而 GloVe 从整个语料库中所有单词的全局汇总共现统计开始。
在以下各节中,我们将同时使用 Word2vec 和 GloVe 来解决各种分类问题。 我们已经开发了一些实用程序代码,可从文件读取和加载 GloVe 和 Word2vec 向量,并返回嵌入矩阵。 预期的文件格式是标准 GloVe 文件格式。 以下是几个单词的五维嵌入格式示例:单词后跟矢量,所有空格分开:
......@@ -339,7 +339,7 @@ embedding_layer = Embedding(vocab_size,
name='embedding')
```
接下来,我们必须构建单词卷积层。 我们希望在所有句子上应用相同的一维卷积滤波器,也就是说,在所有句子之间共享相同的卷积滤波器权重。 首先,我们使用`Lambda`层将输入分成句子。 然后,如果我们使用 *C* 卷积滤波器,则每个句子的二维张量形状( *SENTENCE_LEN×EMBEDDING _DIM* )将转换为(([ *SENTENCE_LEN-filter + 1)×C)*张量。 以下代码执行相同的操作:
接下来,我们必须构建单词卷积层。 我们希望在所有句子上应用相同的一维卷积滤波器,也就是说,在所有句子之间共享相同的卷积滤波器权重。 首先,我们使用`Lambda`层将输入分成句子。 然后,如果我们使用 *C* 卷积滤波器,则每个句子的二维张量形状(*SENTENCE_LEN×EMBEDDING _DIM*)将转换为(([ *SENTENCE_LEN-filter + 1)×C)*张量。 以下代码执行相同的操作:
```py
#Let's take sentence_len=30, embedding_dim=50, num_sentences = 10
......@@ -481,7 +481,7 @@ holdout_target = test_df['sentiment'].values
holdout_corpus_to_seq = preprocessor.transform(holdout_corpus)
```
让我们使用`GloVe`类用 GloVe 初始化嵌入,并构建文档模型。 我们还需要定义文档模型参数,例如卷积过滤器的数量,激活函数,隐藏单元等。 为了避免网络的过拟合,我们可以在输入层,卷积层甚至最终层或密集层之间插入丢失层。 同样,正如我们在密集层所观察到的,放置高斯噪声层可作为更好的正则化器。 可以使用以下定义的所有这些参数初始化`DocumentModel`类。 为了对模型参数进行良好的初始化,我们从少量的时期和少量的采样训练示例开始。 最初,我们开始使用六个词卷积过滤器(如针对 IMDB 数据的论文所述),然后发现该模型不适合-训练的精度未超过 80%,然后我们继续缓慢地增加词过滤器的数量 。 同样,我们发现了大量的句子卷积过滤器。 我们尝试了卷积层的 ReLU 和 tanh 激活。 如[论文](https://arxiv.org/pdf/1406.3830.pdf)所述,他们将 tanh 激活用于其模型:
让我们使用`GloVe`类用 GloVe 初始化嵌入,并构建文档模型。 我们还需要定义文档模型参数,例如卷积过滤器的数量,激活函数,隐藏单元等。 为了避免网络的过拟合,我们可以在输入层,卷积层甚至最终层或密集层之间插入丢失层。 同样,正如我们在密集层所观察到的,放置高斯噪声层可作为更好的正则化器。 可以使用以下定义的所有这些参数初始化`DocumentModel`类。 为了对模型参数进行良好的初始化,我们从少量的时期和少量的采样训练示例开始。 最初,我们开始使用六个词卷积过滤器(如针对 IMDB 数据的论文所述),然后发现该模型不适合-训练的精度未超过 80%,然后我们继续缓慢地增加词过滤器的数量 。 同样,我们发现了大量的句子卷积过滤器。 我们尝试了卷积层的 ReLU 和 tanh 激活。 如[论文](https://arxiv.org/pdf/1406.3830.pdf)所述,他们将 tanh 激活用于其模型:
```py
glove=GloVe(50)
......@@ -744,7 +744,7 @@ for l_name in ['word_conv','sentence_conv','hidden_0', 'final']:
}
```
训练时,我们使用了另一种技巧来避免过度拟合。 我们在前 10 个时间段后冻结嵌入层(即`train_embedding=False`),仅训练其余层。 经过 50 个纪元后,我们在 IMDB 数据集上实现了 **89%** 的准确度,这是本文提出的结果。 我们观察到,如果我们在训练之前不初始化嵌入权重,则模型将开始过度拟合,并且无法实现 **80%** 以上的准确性验证。
训练时,我们使用了另一种技巧来避免过拟合。 我们在前 10 个时间段后冻结嵌入层(即`train_embedding=False`),仅训练其余层。 经过 50 个纪元后,我们在 IMDB 数据集上实现了 **89%** 的准确度,这是本文提出的结果。 我们观察到,如果我们在训练之前不初始化嵌入权重,则模型将开始过拟合,并且无法实现 **80%** 以上的准确性验证。
# 使用 CNN 模型创建文档摘要
......
......@@ -21,7 +21,7 @@
# 制定我们的现实问题
我们这里的实际案例研究的主要目标是音频事件的识别和分类。 这是一个有监督的学习问题,我们将在音频事件数据集上使用属于特定类别(它们是声音的来源)的音频数据样本进行处理。
我们这里的实际案例研究的主要目标是音频事件的识别和分类。 这是一个监督学习问题,我们将在音频事件数据集上使用属于特定类别(它们是声音的来源)的音频数据样本进行处理。
我们将利用迁移学习和深度学习中的概念来构建可靠的分类器,从而在任何给定音频样本属于我们预定类别之一的情况下,我们都应该能够正确预测该声音的来源。 我们将使用的数据集通常被称为 [UrbanSound8K 数据集](https://urbansounddataset.weebly.com/),并且具有 8,732 个带标签的音频声音文件(其持续时间通常等于或大于 少于 4 秒),其中包含城市常见声音的摘录。 该数据集中的声音的十个类别如下:
......@@ -639,7 +639,7 @@ train_labels_ohe.shape, validation_labels_ohe.shape, test_labels_ohe.shape
((18300, 10), (6100, 10), (6100, 10))
```
现在,我们将使用具有四个隐藏层的完全连接的网络来构建深度学习分类器。 我们将使用常见的组件(如辍学)来防止过拟合,并使用模型的 Adam 优化器。 以下代码描述了模型体系结构的详细信息:
现在,我们将使用具有四个隐藏层的完全连接的网络来构建深度学习分类器。 我们将使用常见的组件(如辍学)来防止过拟合,并使用模型的 Adam 优化器。 以下代码描述了模型体系结构的详细信息:
```py
model = models.Sequential()
......@@ -731,7 +731,7 @@ l2 = ax2.legend(loc="best")
![](img/a164d6a2-685a-4ad5-b1fe-3af618612e17.png)
我们可以看到模型在训练和验证之间的损失和准确性是相当一致的。 也许略有过拟合,但考虑到它们之间的差异很小,可以忽略不计。
我们可以看到模型在训练和验证之间的损失和准确性是相当一致的。 也许略有过拟合,但考虑到它们之间的差异很小,可以忽略不计。
# 评估分类器性能
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册