提交 4e0ea8e6 编写于 作者: W wizardforcel

2020-09-06 19:46:02

上级 45b84bd6
......@@ -26,7 +26,7 @@
第 7 章“从头开始训练 CNN”教您如何使用卷积网络对图像进行分类。
第 8 章“使用预训练的 CNN 的转移学习”描述了如何应用转移学习来从图像分类器中获得惊人的性能,即使数据很少。
第 8 章“使用预训练的 CNN 的迁移学习”描述了如何应用迁移学习来从图像分类器中获得惊人的性能,即使数据很少。
第 9 章“从头开始训练 RNN”,讨论 RNN 和 LSTMS,以及如何将其用于时间序列预测问题。
......
......@@ -10,7 +10,7 @@
# 卷积介绍
经过训练的卷积层由称为过滤器的许多特征检测器组成,这些特征检测器在输入图像上滑动作为移动窗口。 稍后我们将讨论过滤器内部的内容,但现在它可能是一个黑匣子。 想象一个已经训练过的过滤器。 也许该滤镜已经过训练,可以检测图像中的边缘,您可能会认为这是黑暗与明亮之间的过渡。 当它经过图像时,其输出表示它检测到的特征的存在和位置,这对于第二层滤镜很有用。 稍微扩展一下我们的思想实验,现在想象第二个卷积层中的一个滤波器,它也已经被训练过了。 也许这个新层已经学会了检测直角,其中存在由上一层找到的两个边缘。 不断地我们去; 随着我们添加图层,可以了解更多复杂的功能。 特征层次结构的概念对于卷积神经网络至关重要。 下图来自 Honglak Lee 等人的《使用卷积深度信念网络的无监督学习层次表示》[2011],非常好地说明了特征层次结构的概念:
经过训练的卷积层由称为过滤器的许多特征检测器组成,这些特征检测器在输入图像上滑动作为移动窗口。 稍后我们将讨论过滤器内部的内容,但现在它可能是一个黑匣子。 想象一个已经训练过的过滤器。 也许该过滤器已经过训练,可以检测图像中的边缘,您可能会认为这是黑暗与明亮之间的过渡。 当它经过图像时,其输出表示它检测到的特征的存在和位置,这对于第二层过滤器很有用。 稍微扩展一下我们的思想实验,现在想象第二个卷积层中的一个过滤器,它也已经被训练过了。 也许这个新层已经学会了检测直角,其中存在由上一层找到的两个边缘。 不断地我们去; 随着我们添加图层,可以了解更多复杂的功能。 特征层次结构的概念对于卷积神经网络至关重要。 下图来自 Honglak Lee 等人的《使用卷积深度信念网络的无监督学习层次表示》[2011],非常好地说明了特征层次结构的概念:
![](img/c63ca1b1-5e19-423c-8174-d62c87d452bc.png)
......@@ -34,40 +34,40 @@
MNIST 是一个灰度示例,我们可以将每个图像表示为二维矩阵中从 0 到 255 的像素强度值。 但是,大多数时候,我们将使用彩色图像。 彩色图像实际上是三维矩阵,其中维是图像高度,图像宽度和颜色。 这将为图像中的每个像素生成一个矩阵,分别具有红色,蓝色和绿色值。
虽然我们先前展示的是二维滤波器,但我们可以通过在(高度,宽度,3(颜色))矩阵与`3 x 3 x 3`之间进行卷积来将其思想轻松转换为三个维度。 过滤。 最后,当我们在矩阵的所有三个轴上进行逐元素乘积运算时,仍然剩下二维输出。 提醒一下,这些高维矩阵通常称为张量,而我们正在做的就是使它们流动。
虽然我们先前展示的是二维过滤器,但我们可以通过在(高度,宽度,3(颜色))矩阵与`3 x 3 x 3`之间进行卷积来将其思想轻松转换为三个维度。 过滤。 最后,当我们在矩阵的所有三个轴上进行逐元素乘积运算时,仍然剩下二维输出。 提醒一下,这些高维矩阵通常称为张量,而我们正在做的就是使它们流动。
# 卷积层
之前我们已经讨论了由多个线性函数单元以及一些非线性(例如`relu`)组成的深度神经网络层。 在卷积层中,每个单元都是一个滤波器,结合了非线性。 例如,可以在 Keras 中定义卷积层,如下所示:
之前我们已经讨论了由多个线性函数单元以及一些非线性(例如`relu`)组成的深度神经网络层。 在卷积层中,每个单元都是一个过滤器,结合了非线性。 例如,可以在 Keras 中定义卷积层,如下所示:
```py
from keras.layers import Conv2D
Conv2D(64, kernel_size=(3,3), activation="relu", name="conv_1")
```
在此层中,有 64 个独立的单元,每个单元都有`3 x 3 x 3`滤波器。 卷积操作完成后,每个单元都会像传统的完全连接层中那样为输出添加偏置和非线性(稍后会详细介绍该术语)。
在此层中,有 64 个独立的单元,每个单元都有`3 x 3 x 3`过滤器。 卷积操作完成后,每个单元都会像传统的完全连接层中那样为输出添加偏置和非线性(稍后会详细介绍该术语)。
在继续之前,让我们快速浏览一下示例的维度,以便确保我们都在同一页面上。 想象一下,我们有一个 *32 x 32 x 3* 的输入图像。 现在,我们将其与上述卷积层进行卷积。 该层包含 64 个过滤器,因此输出为 *30 x 30 x 64* 。 每个滤波器输​​出一个 *30 x 30* 矩阵。
在继续之前,让我们快速浏览一下示例的维度,以便确保我们都在同一页面上。 想象一下,我们有一个`32 x 32 x 3`的输入图像。 现在,我们将其与上述卷积层进行卷积。 该层包含 64 个过滤器,因此输出为`30 x 30 x 64`。 每个过滤器输​​出一个`30 x 30`矩阵。
# 卷积层的好处
因此,现在您希望对卷积层的工作原理有所了解,让我们讨论为什么我们要进行所有这些疯狂的数学运算。 为什么我们要使用卷积层而不是以前使用的普通层?
假设我们确实使用了普通图层,以得到与之前讨论的相同的输出形状。 我们从 *32 x 32 x 3* 图像开始,所以总共有 3,072 个值。 我们剩下一个 *30 x 30 x 64* 矩阵。 总共有 57,600 个值。 如果我们要使用完全连接的层来连接*和*这两个矩阵,则该层将具有 176,947,200 个可训练参数。 那是 1.76 亿。
假设我们确实使用了普通图层,以得到与之前讨论的相同的输出形状。 我们从`32 x 32 x 3`图像开始,所以总共有 3,072 个值。 我们剩下一个`30 x 30 x 64`矩阵。 总共有 57,600 个值。 如果我们要使用完全连接的层来连接这两个矩阵,则该层将具有 176,947,200 个可训练参数。 那是 1.76 亿。
但是,当我们使用上面的卷积层时,我们使用了 64 个 *3 x 3 x 3* 滤波器,这将导致 1,728 个可学习参数+ 64 个偏差(总共 1,792 个参数)。
但是,当我们使用上面的卷积层时,我们使用了 64 个`3 x 3 x 3`过滤器,这将导致 1,728 个可学习参数 +64 个偏差(总共 1,792 个参数)。
因此,显然卷积层需要的参数要少得多,但是为什么这很重要呢?
# 参数共享
由于滤镜是在整个图像中使用的,因此滤镜会学会检测特征,而不管其在图像中的位置如何。 事实证明,这非常有用,因为它为我们提供了平移不变性,这意味着我们可以检测到重要的内容,而不管其在整个图像中的朝向。
由于过滤器是在整个图像中使用的,因此过滤器会学会检测特征,而不管其在图像中的位置如何。 事实证明,这非常有用,因为它为我们提供了平移不变性,这意味着我们可以检测到重要的内容,而不管其在整个图像中的朝向。
回想一下 MNIST,不难想象我们可能想检测 9 的循环,而不管它在照片中的位置如何。 提前思考,想象一个将图片分类为猫或汽车的分类器。 容易想象有一组过滤器可以检测出像汽车轮胎一样复杂的东西。 无论轮胎的方向在图像中的什么位置,检测该轮胎都是有用的,因为轮胎之类的东西强烈表明该图像不是猫(除非图像是驾驶汽车的猫)。
# 本地连接
滤镜由于其固定大小而着重于相邻像素之间的连通性。 这意味着他们将最强烈地学习本地特征。 当与其他滤波器以及层和非线性结合使用时,这使我们逐渐关注更大,更复杂的功能。 确实需要这种局部化特征的堆叠,这也是卷积层如此之大的关键原因。
过滤器由于其固定大小而着重于相邻像素之间的连通性。 这意味着他们将最强烈地学习本地特征。 当与其他过滤器以及层和非线性结合使用时,这使我们逐渐关注更大,更复杂的功能。 确实需要这种局部化特征的堆叠,这也是卷积层如此之大的关键原因。
# 汇聚层
......@@ -84,7 +84,7 @@ from keras.layers import MaxPooling2D
pool1 = MaxPooling2D(pool_size=(2, 2), name="pool_1")
```
在这里,我们将池窗口定义为 *2 x 2*
在这里,我们将池窗口定义为`2 x 2`
尽管我们之前没有讨论过填充,但是在某些体系结构中,通常将卷积层或池化层的输入填充为 0,以使输出尺寸等于输入。 Keras 的卷积层和池化层中的默认值都是有效填充,这意味着按惯例没有填充。 如果需要,参数`padding="same"`将应用填充。
......@@ -103,11 +103,11 @@ x = BatchNormalization(name="batch_norm_1")
# 在 Keras 中训练卷积神经网络
现在我们已经介绍了卷积神经网络的基础知识,是时候构建一个了。 在本案例研究中,我们将面对一个众所周知的问题,即 **CIFAR-10** 。 该数据集由 Alex Krizhevsky,Vinod Nair 和 Geoffrey Hinton 创建。
现在我们已经介绍了卷积神经网络的基础知识,是时候构建一个了。 在本案例研究中,我们将面对一个众所周知的问题,即 **CIFAR-10**。 该数据集由 Alex Krizhevsky,Vinod Nair 和 Geoffrey Hinton 创建。
# 输入项
CIFAR-10 数据集由属于 10 类的 60,000 张 *32 x 32* 彩色图像组成,每类 6,000 张图像。 我将使用 50,000 张图像作为训练集,使用 5,000 张图像作为验证集,并使用 5,000 张图像作为测试集。
CIFAR-10 数据集由属于 10 类的 60,000 张`32 x 32`彩色图像组成,每类 6,000 张图像。 我将使用 50,000 张图像作为训练集,使用 5,000 张图像作为验证集,并使用 5,000 张图像作为测试集。
卷积神经网络的输入张量层将为(N,32,32,3),我们将像以前一样将其传递给`build_network`函数。 以下代码用于构建网络:
......@@ -146,7 +146,7 @@ pool2 = MaxPooling2D(pool_size=(2, 2), name="pool_2")(batch2)
因此,很明显,我们在这里有两个卷积块,它们由一个卷积层,一个批处理规范化层和一个池化层组成。
在第一块中,我使用具有`relu`激活功能的 64 个 *3 x 3* 过滤器。 我使用的是有效(无)填充,跨度为 1。批处理规范化不需要任何参数,并且实际上不是可训练的。 池化层使用 *2 x 2* 池化窗口,有效填充和跨度为 2(窗口尺寸)。
在第一块中,我使用具有`relu`激活功能的 64 个`3 x 3`过滤器。 我使用的是有效(无)填充,跨度为 1。批处理规范化不需要任何参数,并且实际上不是可训练的。 池化层使用`2 x 2`池化窗口,有效填充和跨度为 2(窗口尺寸)。
第二个块几乎相同。 但是,我将过滤器数量减半为 32。
......@@ -154,9 +154,9 @@ pool2 = MaxPooling2D(pool_size=(2, 2), name="pool_2")(batch2)
# 全连接层
经过两轮卷积和合并后,我们的张量变得相对较小和较深。 在`pool_2`之后,输出尺寸为*n* ,6、6、32)
经过两轮卷积和合并后,我们的张量变得相对较小和较深。 在`pool_2`之后,输出尺寸为`(n, 6, 6, 32)`
我们希望在这些卷积层中提取此 *6 x 6 x 32* 张量表示的相关图像特征。 为了使用这些功能对图像进行分类,在进入最终输出层之前,我们将将该张量连接到几个完全连接的层。
我们希望在这些卷积层中提取此`6 x 6 x 32`张量表示的相关图像特征。 为了使用这些功能对图像进行分类,在进入最终输出层之前,我们将将该张量连接到几个完全连接的层。
在此示例中,我将使用 512 神经元完全连接层,256 神经元完全连接层以及最后的 10 神经元输出层。 我还将使用辍学来帮助防止过度拟合,但只有一点点! 该过程的代码如下,供您参考:
......@@ -170,7 +170,7 @@ fc2 = Dense(256, activation="relu", name="fc2")(d1)
d2 = Dropout(rate=0.2, name="dropout2")(fc2)
```
我之前没有提到上面的`flatten`层。 `flatten`层完全按照其名称的含义执行。 将`flattens` n x 6 x 6 x 32 张量`flattens`转换为 *n x 1152* 向量。 这将作为全连接层的输入。
我之前没有提到上面的`flatten`层。 `flatten`层完全按照其名称的含义执行。 将`flattens``n x 6 x 6 x 32`张量`flattens`转换为`n x 1152`向量。 这将作为全连接层的输入。
# Keras 中的多 GPU 模型
......@@ -315,4 +315,4 @@ model.fit_generator(data_generator.flow(data["train_X"], data["train_y"], batch_
在本章中,我们快速介绍了许多基础知识。 我们讨论了卷积层及其如何用于神经网络。 我们还介绍了批处理规范化,池化层和数据扩充。 最后,我们使用 Keras 从零开始训练卷积神经网络,然后使用数据增强对该网络进行改进。
我们还讨论了如何基于数据的渴望计算机视觉的深度神经网络问题。 在下一章中,我将向您展示**转移学习**,这是我最喜欢的技术之一。 这将帮助您快速解决计算机视觉问题,并获得惊人的结果并且数据量更少。
\ No newline at end of file
我们还讨论了如何基于数据的渴望计算机视觉的深度神经网络问题。 在下一章中,我将向您展示**迁移学习**,这是我最喜欢的技术之一。 这将帮助您快速解决计算机视觉问题,并获得惊人的结果并且数据量更少。
\ No newline at end of file
# 使用预训练的 CNN 进行移学习
# 使用预训练的 CNN 进行移学习
转移学习很棒。 实际上,在一本充满奇妙事物的书中,这可能是我必须告诉您的最奇妙的事物。 如果没有,那也许至少是我可以教给您的最有用和最实用的深度学习技术。 转移学习可以帮助您解决深度学习问题,尤其是计算机视觉问题,而涉及问题范围的数据和数据却很少。 在本章中,我们将讨论什么是转移学习,什么时候应该使用它,最后讨论如何在 Keras 中进行转移学习。
迁移学习很棒。 实际上,在一本充满奇妙事物的书中,这可能是我必须告诉您的最奇妙的事物。 如果没有,那也许至少是我可以教给您的最有用和最实用的深度学习技术。 迁移学习可以帮助您解决深度学习问题,尤其是计算机视觉问题,而涉及问题范围的数据和数据却很少。 在本章中,我们将讨论什么是迁移学习,什么时候应该使用它,最后讨论如何在 Keras 中进行迁移学习。
我们将在本章介绍以下主题:
* 移学习概述
* 移学习概述
* 何时应使用转学
* 源/目标数量和相似性的影响
* Keras 的移学习
* Keras 的移学习
# 移学习概述
# 移学习概述
在第 7 章和*卷积神经网络*中,我们训练了约 50,000 个观测值的卷积神经网络,并且由于网络和问题的复杂性,我们过度拟合了 短短几个时期后就开始训练。 如果您还记得的话,我曾评论说我们的培训集中有 50,000 个观察结果对于计算机视觉问题不是很大。 确实如此。 计算机视觉问题喜欢数据,而我们可以提供给他们的数据越多,它们的性能就越好。
在第 7 章和“卷积神经网络”中,我们训练了约 50,000 个观测值的卷积神经网络,并且由于网络和问题的复杂性,我们过度拟合了 短短几个时期后就开始训练。 如果您还记得的话,我曾评论说我们的培训集中有 50,000 个观察结果对于计算机视觉问题不是很大。 确实如此。 计算机视觉问题喜欢数据,而我们可以提供给他们的数据越多,它们的性能就越好。
我们可能认为计算机视觉技术最先进的深度神经网络通常在称为 **ImageNet** 的数据集上进行训练。 [`ImageNet`数据集](http://www.image-net.org/)是包含 120 万张图像的 1,000 个分类器。 这还差不多! 如此庞大的数据集使研究人员能够构建真正复杂的深度神经网络,以检测复杂的特征。 当然,在 120 万张图像上训练有时具有 100 多个图层的模型的价格很高。 培训可能需要数周和数月,而不是数小时。
但是,如果我们可以从一个最先进的,多层的,经过数百万张图像训练的网络开始,然后仅使用少量数据将该网络应用于我们自己的计算机视觉问题,该怎么办? 那就是**移学习**
但是,如果我们可以从一个最先进的,多层的,经过数百万张图像训练的网络开始,然后仅使用少量数据将该网络应用于我们自己的计算机视觉问题,该怎么办? 那就是**移学习**
要使用移学习,我们将执行以下步骤:
要使用移学习,我们将执行以下步骤:
1. 从训练非常大的复杂计算机视觉问题的模型开始; 我们将其称为我们的源域
2. 删除网络的最后一层(`softmax`层),并可能删除其他完全连接的层
......@@ -31,7 +31,7 @@
# 何时应使用转学
当您的数据有限且存在解决类似问题的网络时,转移学习会非常有效。 您可以使用转移学习将最先进的网络和大量数据带入一个其他小的问题。 那么,什么时候应该使用迁移学习? 随时可以! 但是,我希望您首先考虑两个规定。 我们将在以下各节中讨论它们。
当您的数据有限且存在解决类似问题的网络时,迁移学习会非常有效。 您可以使用迁移学习将最先进的网络和大量数据带入一个其他小的问题。 那么,什么时候应该使用迁移学习? 随时可以! 但是,我希望您首先考虑两个规定。 我们将在以下各节中讨论它们。
# 资料有限
......@@ -45,7 +45,7 @@
如果您的目标域至少与源域有些相似,那么迁移学习会很有效。 例如,假设您正在将图像分类为包含猫或狗。 有许多`ImageNet`训练有素的图像分类器非常适合用于此类型或问题。
相反,让我们想象我们的问题是将 CT 扫描或 MRI 归类为是否包含肿瘤。 此目标域与`ImageNet`源域非常不同。 这样,虽然使用移学习可能(并且可能会)有好处,但我们将需要更多的数据,并且可能需要进行一些微调才能使网络适应此目标域。
相反,让我们想象我们的问题是将 CT 扫描或 MRI 归类为是否包含肿瘤。 此目标域与`ImageNet`源域非常不同。 这样,虽然使用移学习可能(并且可能会)有好处,但我们将需要更多的数据,并且可能需要进行一些微调才能使网络适应此目标域。
# 源/目标数量和相似性的影响
......@@ -53,15 +53,15 @@
# 更多数据总是有益的
在 Google 研究人员在*重新研究深度学习时代数据的不合理有效性中进行的几次实验中,*他们构建了一个内部数据集,其中包含 3 亿个观测值,显然比`ImageNet`大得多。 然后,他们在该数据集上训练了几种最先进的体系结构,从而使模型显示的数据量从 1000 万增加到 3000 万,1 亿,最后是 3 亿。 通过这样做,他们表明模型性能随用于训练的观察次数的对数线性增加,这表明在源域中,更多的数据总是有帮助。
Google 研究人员在《重新研究深度学习时代数据的不合理有效性》中进行的几次实验中,构建了一个内部数据集,其中包含 3 亿个观测值,显然比`ImageNet`大得多。 然后,他们在该数据集上训练了几种最先进的体系结构,从而使模型显示的数据量从 1000 万增加到 3000 万,1 亿,最后是 3 亿。 通过这样做,他们表明模型性能随用于训练的观察次数的对数线性增加,这表明在源域中,更多的数据总是有帮助。
但是目标域呢? 我们使用了一些类似于我们在迁移学习过程中可能使用的类型的数据集重复了 Google 实验,包括我们将在本章稍后使用的`Dogs versus Cats`数据集。 我们发现,在目标域中,模型的性能随用于训练的观察次数的对数线性增加,就像在源域中一样。 更多数据总是有帮助的。
# 源/目标域相似度
移学习的独特之处在于您担心源域和目标域之间的相似度。 经过训练以识别人脸的分类器可能不会轻易转移到识别各种架构的目标领域。 我们进行了源和目标尽可能不同的实验,以及源和目标域非常相似的实验。 毫不奇怪,当迁移学习应用程序中的源域和目标域非常不同时,与相似时相比,它们需要更多的数据。 它们也需要更多的微调,因为当域在视觉上非常不同时,特征提取层需要大量的学习。
移学习的独特之处在于您担心源域和目标域之间的相似度。 经过训练以识别人脸的分类器可能不会轻易转移到识别各种架构的目标领域。 我们进行了源和目标尽可能不同的实验,以及源和目标域非常相似的实验。 毫不奇怪,当迁移学习应用程序中的源域和目标域非常不同时,与相似时相比,它们需要更多的数据。 它们也需要更多的微调,因为当域在视觉上非常不同时,特征提取层需要大量的学习。
# Keras 的移学习
# Keras 的移学习
与本书中的其他示例不同,在这里我们将需要涵盖目标域问题,源域问题以及我们正在使用的网络体系结构。 我们将从目标域的概述开始,这是我们要解决的问题。 然后,我们将介绍网络最初经过培训的源域,并简要介绍我们将使用的网络体系结构。 然后,我们将在本章的其余部分中将问题联系在一起。 我们需要分别考虑两个域,因为它们的大小和相似性与网络性能密切相关。 目标和源的类型越近,结果越好。
......@@ -75,13 +75,13 @@
# 源域概述
我们将从在 ImageNet 上训练的深度神经网络开始。 如果您从*转移学习概述*部分中回顾过,`ImageNet`是一个 1,000 类分类器,训练了大约 120 万张图像。 `ImageNet`数据集中都包含狗和猫的图像,因此在这种情况下,我们的目标域实际上与我们的源域非常相似。
我们将从在 ImageNet 上训练的深度神经网络开始。 如果您从“迁移学习概述”部分中回顾过,`ImageNet`是一个 1,000 类分类器,训练了大约 120 万张图像。 `ImageNet`数据集中都包含狗和猫的图像,因此在这种情况下,我们的目标域实际上与我们的源域非常相似。
# 源网络架构
我们将使用 [**Inception-V3** 网络体系结构](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.pdf)。 与您到目前为止在本书中所看到的相比,Inception 体系结构很有趣并且非常复杂。 如果您从第 7 章,*卷积神经网络*中回想起,我们必须围绕网络体系结构做出的决定之一就是选择过滤器大小。 对于每一层,我们必须决定是否应使用例如 *3 x 3* 滤镜,而不是 *5 x 5* 滤镜。 当然,也许根本就不需要另一次卷积。 也许像池化之类的东西可能更合适。 因此,如果我们在每一层都做所有事情,该怎么办? 这就是开始的动机。
我们将使用 [**Inception-V3** 网络体系结构](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.pdf)。 与您到目前为止在本书中所看到的相比,Inception 体系结构很有趣并且非常复杂。 如果您从第 7 章,“卷积神经网络”中回想起,我们必须围绕网络体系结构做出的决定之一就是选择过滤器大小。 对于每一层,我们必须决定是否应使用例如`3 x 3`过滤器,而不是`5 x 5`过滤器。 当然,也许根本就不需要另一次卷积。 也许像池化之类的东西可能更合适。 因此,如果我们在每一层都做所有事情,该怎么办? 这就是开始的动机。
该体系结构基于一系列模块或称为**初始模块**的构建块。 在每个初始模块中,先前的激活都赋予 *1 x 1* 卷积, *3 x 3* 卷积, *5 x 5* 卷积和最大值 池层。 然后将输出串联在一起。
该体系结构基于一系列模块或称为**初始模块**的构建块。 在每个初始模块中,先前的激活都赋予`1 x 1`卷积,`3 x 3`卷积,`5 x 5`卷积和最大池化层。 然后将输出串联在一起。
Inception-V3 网络由几个相互堆叠的 Inception 模块组成。 最后两层都完全连接,输出层是 1,000 个神经元 softmax。
......@@ -135,7 +135,7 @@ for layer in base_model.layers:
# 数据输入
快速浏览图像应使您确信我们的图像的分辨率和大小均不同。 正如您从第 7 章,*卷积神经网络,*所了解的那样,我们需要这些图像的大小与神经网络的输入张量一致。 这是一个非常现实的问题,您将经常面对计算机视觉任务。 虽然当然可以使用 [**ImageMagick**](http://www.imagemagick.org) 之类的程序来批量调整图像大小,但 Keras `ImageDataGenerator`类可用于 快速调整图像大小,这就是我们要做的。
快速浏览图像应使您确信我们的图像的分辨率和大小均不同。 正如您从第 7 章,“卷积神经网络”,所了解的那样,我们需要这些图像的大小与神经网络的输入张量一致。 这是一个非常现实的问题,您将经常面对计算机视觉任务。 虽然当然可以使用 [**ImageMagick**](http://www.imagemagick.org) 之类的程序来批量调整图像大小,但 Keras `ImageDataGenerator`类可用于 快速调整图像大小,这就是我们要做的。
Inception-V3 期望 299 x 299 x 3 图像。 我们可以在数据生成器中指定此目标大小,如以下代码所示:
......@@ -162,7 +162,7 @@ validation_generator = val_datagen.flow_from_directory(
# 培训(特征提取)
对于此模型,我们将训练两次。 对于第一轮培训,我们将通过冻结网络的培训来进行 10 个时期的特征提取,仅调整完全连接的层权重,如我们在*传输网络架构*部分中所讨论的。 然后,在下一部分中,我们将解冻某些图层并再次进行训练,对另外 10 个纪元进行微调,如以下代码所示:
对于此模型,我们将训练两次。 对于第一轮培训,我们将通过冻结网络的培训来进行 10 个时期的特征提取,仅调整完全连接的层权重,如我们在“迁移网络架构”部分中所讨论的。 然后,在下一部分中,我们将解冻某些图层并再次进行训练,对另外 10 个纪元进行微调,如以下代码所示:
```py
data_dir = "data/train/"
......@@ -186,7 +186,7 @@ scores = model.evaluate_generator(val_generator, steps=val_generator.n // batch_
print("Step 1 Scores: Loss: " + str(scores[0]) + " Accuracy: " + str(scores[1]))
```
在前面的示例中,我们使用`ImageDataGenerator` *n* 属性来了解可用于生成器的图像总数,并将每个时期的步骤定义为该数目除以批处理大小。
在前面的示例中,我们使用`ImageDataGenerator``n`属性来了解可用于生成器的图像总数,并将每个时期的步骤定义为该数目除以批处理大小。
此代码的其余部分应该很熟悉。
......
......@@ -237,11 +237,11 @@ Embedding(input_dim=10000, output_dim=128, input_length=10)
# 一维 CNN 用于自然语言处理
回顾第 7 章,*从头开始训练 CNN* 时,我们使用了卷积在图像区域上滑动窗口以学习复杂的视觉特征。 这使我们能够学习重要的局部视觉功能,而不管这些功能在图片中的位置,然后随着我们的网络越来越深入,逐步地学习越来越复杂的功能。 我们通常在 2D 或 3D 图像上使用 *3 x 3**5 x 5* 滤镜。 如果您对卷积层及其工作原理的理解感到生疏,则可能需要阅读第 7 章和*从头开始训练 CNN。*
回顾第 7 章,*从头开始训练 CNN* 时,我们使用了卷积在图像区域上滑动窗口以学习复杂的视觉特征。 这使我们能够学习重要的局部视觉功能,而不管这些功能在图片中的位置,然后随着我们的网络越来越深入,逐步地学习越来越复杂的功能。 我们通常在 2D 或 3D 图像上使用 *3 x 3**5 x 5* 过滤器。 如果您对卷积层及其工作原理的理解感到生疏,则可能需要阅读第 7 章和*从头开始训练 CNN。*
事实证明,我们可以对一系列单词使用相同的策略。 在这里,我们的 2D 矩阵是嵌入层的输出。 每行代表一个单词,并且该行中的所有元素都是其单词向量。 继续前面的示例,我们将有一个 10 x 128 的向量,其中连续有 10 个单词,每个单词都由 128 个元素的向量空间表示。 我们当然可以在这些单词上滑动过滤器。
卷积滤波器的大小针对 NLP 问题而改变。 当我们构建网络来解决 NLP 问题时,我们的过滤器将与单词 vector 一样宽。 过滤器的高度可以变化,通常在 2 到 5 之间。高度为 5 表示我们一次要在五个字上滑动过滤器。
卷积过滤器的大小针对 NLP 问题而改变。 当我们构建网络来解决 NLP 问题时,我们的过滤器将与单词 vector 一样宽。 过滤器的高度可以变化,通常在 2 到 5 之间。高度为 5 表示我们一次要在五个字上滑动过滤器。
事实证明,对于许多 NLP 问题,CNN 可以很好地运行,并且比 LSTM 快得多。 很难就何时使用 RNN / LSTM 和何时使用 CNN 给出确切的规则。 通常,如果您的问题需要状态,或者从很远的序列中学习到一些东西,那么使用 LSTM 可能会更好。 如果您的问题需要检测描述文本的特定单词集或文档的语义感觉,那么 CNN 可能会更快甚至更好地解决您的问题。
......@@ -249,7 +249,7 @@ Embedding(input_dim=10000, output_dim=128, input_length=10)
由于我已经提出了两种可行的文档分类方法,因此本章将包含两个单独的文档分类示例。 两者都将使用嵌入层。 一个将使用 LSTM,另一个将使用 CNN。
我们还将比较学习嵌入层与从其他人的权重开始采用移学习方法之间的性能。
我们还将比较学习嵌入层与从其他人的权重开始采用移学习方法之间的性能。
这两个示例的代码都可以在本书的 Git 存储库中的`Chapter10`文件夹中找到。 某些数据和 GloVe 向量将需要分别下载。 有关说明,请参见代码中的注释。
......@@ -331,7 +331,7 @@ lstm1 = LSTM(10, activation='tanh', return_sequences=False,
为什么要使用这么小的 LSTM 层? 就像您将要看到的那样,该模型将因过度拟合而陷入困境。 甚至只有 10 个 LSTM 单位也能很好地学习训练数据。 解决此问题的方法可能是添加数据,但实际上不能添加数据,因此保持网络结构简单是一个好主意。
这导致我们使用辍学。 我将在这一层同时使用辍学和经常性辍学。 我们还没有谈论经常性辍学的问题,所以让我们现在解决它。 以这种方式应用于 LSTM 层的常规滤镜将随机掩盖 LSTM 的输入。 反复丢失会随机打开和关闭 LSTM 单元/神经元中*展开的*细胞之间的内存。 与往常一样,辍学是一个超参数,您需要搜索最佳值。
这导致我们使用辍学。 我将在这一层同时使用辍学和经常性辍学。 我们还没有谈论经常性辍学的问题,所以让我们现在解决它。 以这种方式应用于 LSTM 层的常规过滤器将随机掩盖 LSTM 的输入。 反复丢失会随机打开和关闭 LSTM 单元/神经元中*展开的*细胞之间的内存。 与往常一样,辍学是一个超参数,您需要搜索最佳值。
因为我们的输入是基于文档的,并且因为没有任何上下文,所以我们需要记住在文档之间,这是使用无状态 LSTM 的绝佳时机。
......@@ -592,7 +592,7 @@ x = Conv1D(128, 5, activation='relu')(x)
x = GlobalMaxPooling1D()(x)
```
对于`Conv1D`层,第一个整数参数是单位数,第二个是过滤器大小。 我们的滤波器只有一维,因此命名为 1D 卷积。 上例中的窗口大小为 5。
对于`Conv1D`层,第一个整数参数是单位数,第二个是过滤器大小。 我们的过滤器只有一维,因此命名为 1D 卷积。 上例中的窗口大小为 5。
我正在使用的`MaxPooling1D`层也将使用 5 的窗口大小。相同的规则适用于一维实现中的池化层。
......@@ -681,7 +681,7 @@ model.fit(data["X_train"], data["y_train"],
GloVe 预先训练的网络不仅学习得更快,而且在每个时期都表现得更好。 总体而言,这些网络似乎在学习文档分类任务方面做得很好。 大约在第五个时代之后,它们都开始过拟合。 但是,GloVe 模型比没有使用 GloVe 训练的网络更能防止过度拟合。
通常,我建议尽可能在任何地方使用移学习。 图片和文字都是如此。
通常,我建议尽可能在任何地方使用移学习。 图片和文字都是如此。
如果通过这些示例与我一起工作,我建议您对 LSTM 尝试同样的问题。 我认为使用 LSTM 时,您会发现该问题更加难以解决,并且难以解决过度拟合问题。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册