提交 ac2c70ba 编写于 作者: W wizardforcel

2020-09-05 15:13:51

上级 45930bf7
......@@ -44,25 +44,6 @@
2. 我还假定您至少具有使用 Python 进行编程的经验,或者至少具有其他编程语言(如 Java 或 C ++)。
3. 深度学习是计算密集型的,我们在这里构建的某些模型需要 NVIDIA GPU 在合理的时间内运行。 如果您没有快速的 GPU,则可能希望在 Amazon Web Services 或 Google Cloud Platform 上使用基于 GPU 的云实例。
# 下载示例代码文件
您可以从 [www.packtpub.com](http://www.packtpub.com) 的帐户中下载本书的示例代码文件。 如果您在其他地方购买了此书,则可以访问 [www.packtpub.com/support](http://www.packtpub.com/support) 并注册以将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
1. 登录或注册 [www.packtpub.com](http://www.packtpub.com/support)
2. 选择支持选项卡。
3. 单击代码下载和勘误。
4. 在搜索框中输入书籍的名称,然后按照屏幕上的说明进行操作。
下载文件后,请确保使用以下任何一种的最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* 适用于 macOS 的 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 的 [https://github.com/PacktPublishing/Deep-Learning-Quick-Reference](https://github.com/PacktPublishing/Deep-Learning-Quick-Reference) 上。 我们还从 **[https://github.com/PacktPublishing/](https://github.com/PacktPublishing/)** 提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
# 使用约定
本书中使用了许多文本约定。
......@@ -105,21 +86,3 @@ model-weights.05-0.985217.hdf5
警告或重要提示如下所示。
提示和技巧如下所示。
# 保持联系
始终欢迎读者的反馈。
**一般反馈**:给`feedback@packtpub.com`发送电子邮件,并在邮件主题中提及书名。 如果您对本书的任何方面有疑问,请通过`questions@packtpub.com`向我们发送电子邮件。
**勘误表**:尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您在这本书中发现错误,请向我们报告,我们将不胜感激。 访问 [www.packtpub.com/submit-errata](http://www.packtpub.com/submit-errata) ,选择您的图书,点击勘误提交表格链接,然后输入详细信息。
**盗版**:如果您在互联网上以任何形式看到我们的作品的任何非法副本,请向我们提供位置地址或网站名称,我们将不胜感激。 请通过`copyright@packtpub.com`与我们联系,并提供材料链接。
**如果您有兴趣成为作者**:如果您有某个专业知识并且有兴趣撰写或撰写书籍,请访问 [authors.packtpub.com](http://authors.packtpub.com/) ]。
# 评论
请留下评论。 阅读和使用本书后,为什么不在您购买本书的网站上留下评论? 然后,潜在的读者可以查看并使用您的公正意见来做出购买决定; 同样,Packt 的我们可以理解您对我们产品的看法,我们的作者可以在书中看到您的反馈。 谢谢!
有关 Packt 的更多信息,请访问 [packtpub.com](https://www.packtpub.com/)
\ No newline at end of file
......@@ -183,9 +183,9 @@ TensorFlow 是 Google 在 2015 年发布的一个开源项目。此后,它已
我最喜欢的 TensorFlow 替代品包括:
* **Apache MXNet** :一个非常高性能的框架,带有一个名为 **Gluon( [https://mxnet.apache.org/](https://mxnet.apache.org/) )的新命令式接口**
* **PyTorch** :Facebook 最初开发的一种非常新颖且有希望的架构( [http://pytorch.org/](http://pytorch.org/)
* **CNTK:**也可以与 Keras 一起使用的 Microsoft 深度学习框架( [https://www.microsoft.com/zh-cn/cognitive-toolkit/](https://www.microsoft.com/en-us/cognitive-toolkit/)
* **Apache MXNet**:一个非常高性能的框架,带有一个名为 [**Gluon**](https://mxnet.apache.org/) 的新命令式接口
* [**PyTorch**](http://pytorch.org/):Facebook 最初开发的一种非常新颖且有希望的架构
* [**CNTK**](https://www.microsoft.com/en-us/cognitive-toolkit/):也可以与 Keras 一起使用的 Microsoft 深度学习框架
尽管我确实坚信 Keras 和 TensorFlow 是本书的正确选择,但我也想承认这些出色的框架以及每个项目对领域做出的贡献。
......@@ -208,7 +208,7 @@ sudo apt-get update
sudo apt-get install build-essential
```
接下来,我们可以下载并安装 CUDA Toolkit。 如前所述,我们将安装 8.0 版及其相关补丁。 您可以在 [https://developer.nvidia.com/cuda-zone 中找到最适合您的 CUDA 工具包。](https://developer.nvidia.com/cuda-zone)
接下来,我们可以下载并安装 CUDA Toolkit。 如前所述,我们将安装 8.0 版及其相关补丁。 您可以在[这个页面](https://developer.nvidia.com/cuda-zone)中找到最适合您的 CUDA 工具包。
```py
wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run
......@@ -241,7 +241,7 @@ $nvidia-smi
最后,我们需要安装 cuDNN,这是 NVIDIA CUDA 深度神经网络库。
首先,将 cuDNN 下载到本地计算机。 为此,您需要在 **NVIDIA 开发人员网络**中注册为开发人员。 您可以在 cuDNN 主页上的 [https://developer.nvidia.com/cuDNN](https://developer.nvidia.com/cudnn) 上找到 cuDNN。 将其下载到本地计算机后,可以使用`scp`将其移至 EC2 实例。 虽然确切的说明会因云提供商的不同而有所差异,但是您可以在 [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html) 中找到有关通过 SSH / SCP 连接到 AWS EC2 的其他信息。 。
首先,将 cuDNN 下载到本地计算机。 为此,您需要在 **NVIDIA 开发人员网络**中注册为开发人员。 您可以在 [cuDNN 主页](https://developer.nvidia.com/cudnn) 上找到 cuDNN。 将其下载到本地计算机后,可以使用`scp`将其移至 EC2 实例。 虽然确切的说明会因云提供商的不同而有所差异,但是您可以在[这个页面](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)中找到有关通过 SSH / SCP 连接到 AWS EC2 的其他信息。 。
将 cuDNN 移至 EC2 映像后,可以使用以下代码解压缩文件:
......@@ -393,7 +393,7 @@ pip install keras
火车数据集将按预期用于训练网络。
val 数据集或验证数据集将用于查找理想的超参数并测量过度拟合。 在*时期结束时*,即网络有机会观察训练集中的每个数据点时,我们将对 val 集进行预测。 该预测将用于监视过度拟合,并将帮助我们知道网络何时完成训练。 像这样在每个时期末尾使用 val 设置与典型用法有些不同。 有关保留验证的更多信息,请参考 Hastie 和 Tibshirani 撰写的《统计学习的要素》( [https://web.stanford.edu/~hastie/ElemStatLearn](https://web.stanford.edu/~hastie/ElemStatLearn) /)
val 数据集或验证数据集将用于查找理想的超参数并测量过度拟合。 在*时期结束时*,即网络有机会观察训练集中的每个数据点时,我们将对 val 集进行预测。 该预测将用于监视过度拟合,并将帮助我们知道网络何时完成训练。 像这样在每个时期末尾使用 val 设置与典型用法有些不同。 有关保留验证的更多信息,请参考 Hastie 和 Tibshirani 撰写的[《统计学习的要素》](https://web.stanford.edu/~hastie/ElemStatLearn)
一旦完成所有训练,就将使用测试数据集,以根据网络未看到的一组数据准确地测量模型性能。
......
......@@ -18,7 +18,7 @@
深度神经网络很难解释,尽管尝试这样做是一个活跃的研究领域。
有关介绍深度神经网络的当前状态的介绍,请查看 Montavon 等人的《解释和理解深度神经网络的方法》( [https://arxiv.org/abs/1706.07979](https://arxiv.org/abs/1706.07979)
有关介绍深度神经网络的当前状态的介绍,请查看 Montavon 等人的[《解释和理解深度神经网络的方法》](https://arxiv.org/abs/1706.07979)
# 使用神经网络进行回归的好处
......@@ -57,7 +57,7 @@
# 定义示例问题
在我们的示例问题中,我们将使用 P. Cortez 等人创建的葡萄酒质量数据集。 ( [https://archive.ics.uci.edu/ml/datasets/wine+quality](https://archive.ics.uci.edu/ml/datasets/wine+quality)。 考虑到白酒的其他 10 个化学特性,我们将预测白葡萄酒数据中所含酒精的百分比。
在我们的示例问题中,我们将使用 P. Cortez 等人创建的[葡萄酒质量数据集](https://archive.ics.uci.edu/ml/datasets/wine+quality)。 考虑到白酒的其他 10 个化学特性,我们将预测白葡萄酒数据中所含酒精的百分比。
此数据集中总共有 4,898 个观测值或元素,对于经典回归问题而言可能很大,但对于深度学习问题而言却很小。
......@@ -110,7 +110,7 @@ def load_data():
最后,load_data()函数返回一个字典,该字典将所有内容保持整齐并放在一个位置。 如果您以后看到我参考数据[“ X_train”],则知道我正在参考训练数据集,该数据集已存储在数据字典中。
该项目的代码和数据均可在该书的 GitHub 网站上找到( [https://github.com/mbernico/deep_learning_quick_reference](https://github.com/mbernico/deep_learning_quick_reference)
[该项目的代码和数据均可在该书的 GitHub 网站上找到](https://github.com/mbernico/deep_learning_quick_reference)
# 定义成本函数
......
......@@ -15,7 +15,7 @@ TensorBoard 是一个基于 Web 的应用程序,可以帮助您可视化 Tenso
正如您现在可能已经猜到的那样,深度神经网络可能变得相当复杂。 不幸的是,这意味着很多事情可能出错。 众所周知,我时不时地会犯一个错误,而当错误发生在一个深度神经网络内部时,该深度神经网络位于一个框架内,该框架在另一个框架上运行,在一个 GPU 上运行,很难找到这些错误。 他们。 TensorBoard 可能是您需要在其他本来很暗的房间中发现问题的手电筒。 TensorBoard 将允许您在培训网络时监视指标和参数的变化,这可以大大加快故障排除速度。
TensorBoard 也非常适合优化。 借助 TensorBoard,您可以直观地比较多个模型运行。 这使您可以试验不断变化的体系结构和超参数,然后相对于网络的其他运行评估那些变化。 所有这一切都可能在每个时期发生,因此如果您愿意,您可以取消效果不佳的模型运行,从而节省了时间和金钱。 您可以在 [https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard](https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard) 上阅读有关 TensorBoard 的更多信息。
TensorBoard 也非常适合优化。 借助 TensorBoard,您可以直观地比较多个模型运行。 这使您可以试验不断变化的体系结构和超参数,然后相对于网络的其他运行评估那些变化。 所有这一切都可能在每个时期发生,因此如果您愿意,您可以取消效果不佳的模型运行,从而节省了时间和金钱。 您可以在[这个页面](https://www.tensorflow.org/programmers_guide/summaries_and_tensorboard)上阅读有关 TensorBoard 的更多信息。
# 设置 TensorBoard
......@@ -71,7 +71,7 @@ tensorboard --logdir ~/ch3_tb_log --port 6006
Keras 中的回调是可以在训练过程中运行的功能。 他们可以做各种伟大的事情,例如在某个时代之后节省模型权重,记录事情,更改超参数或方便地编写 TensorBoard 日志文件。 您甚至可以创建自己的自定义回调。
在下一节中,我们将使用 TensorBoard 回调。 但是,我鼓励您在 [https://keras.io/callbacks](https://keras.io/callbacks) 上查看 Keras 中可用的所有回调。
在下一节中,我们将使用 TensorBoard 回调。 但是,我鼓励您在[这个页面](https://keras.io/callbacks)上查看 Keras 中可用的所有回调。
TensorBoard 回调是可以在模型训练之前进行配置和实例化的对象。 我们将创建这些回调的列表。 一旦创建了要用于深度神经网络的回调列表,我们就可以将该列表作为参数传递给模型的`.fit()`方法。 然后,将在每个时期或 Keras 适当时使用这些回调。 在我们继续下一个示例时,这将更有意义。
......@@ -108,7 +108,7 @@ def create_callbacks():
由于 TensorFlow 会自动为您计算梯度,因此很少使用。 但是,如果您要使用自定义激活或费用,它可能是出色的故障排除工具。
TensorBoard 回调可以接受用于在图像上运行神经网络或通过使用嵌入式层的其他参数。 我们将在本书的后面介绍这两个方面。 如果您对这些功能感兴趣,请访问 TensorBoard API 文档,网址为 [https://keras.io/callbacks/#tensorboard](https://keras.io/callbacks/#tensorboard)
TensorBoard 回调可以接受用于在图像上运行神经网络或通过使用嵌入式层的其他参数。 我们将在本书的后面介绍这两个方面。 如果您对这些功能感兴趣,请访问 [TensorBoard API 文档](https://keras.io/callbacks/#tensorboard)
现在,我们只需要创建回调列表,并将`mlp``callbacks`参数匹配即可。 看起来像这样:
......
......@@ -35,7 +35,7 @@
# 定义我们的数据集
我们将在本章中使用的数据集称为 ***癫痫发作识别*** 数据集。 数据最初来自论文*,指示脑电活动的时间序列中的非线性确定性和有限维结构:Andrzejak RG 等人在 Phys 上发表的对记录区域和大脑状态的依赖性*。 修订版 E,64,061907。您可以在 [http://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition](http://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition) 的 UCI 机器学习存储库中找到数据。
我们将在本章中使用的数据集称为 ***癫痫发作识别*** 数据集。 数据最初来自论文*,指示脑电活动的时间序列中的非线性确定性和有限维结构:Andrzejak RG 等人在 Phys 上发表的对记录区域和大脑状态的依赖性*。 修订版 E,64,061907。您可以在 [UCI 机器学习存储库](http://archive.ics.uci.edu/ml/datasets/Epileptic+Seizure+Recognition)中找到数据。
我们的目标是创建一个深度神经网络,根据输入特征,该网络可以预测患者是否有癫痫发作。
......
......@@ -30,7 +30,7 @@
# 问题定义
`MNIST`数据集已成为几乎规范的神经网络数据集。 该数据集由 60,000 个手写数字组成的图像,属于代表它们各自数字(10,1,2 ... 9)的 10 类。 由于此数据集变得如此普遍,因此许多深度学习框架都在 API 中内置了 MNIST 加载方法。 TensorFlow 和 Keras 都拥有一个,我们将使用 Keras MNIST 加载器使我们的生活更轻松。 但是,如果您想从原始数据中获取数据,或者想进一步了解 MNIST 的历史,可以在 [http://yann.lecun.com/exdb/mnist/](http://yann.lecun.com/exdb/mnist/)中找到更多信息。
`MNIST`数据集已成为几乎规范的神经网络数据集。 该数据集由 60,000 个手写数字组成的图像,属于代表它们各自数字(10,1,2 ... 9)的 10 类。 由于此数据集变得如此普遍,因此许多深度学习框架都在 API 中内置了 MNIST 加载方法。 TensorFlow 和 Keras 都拥有一个,我们将使用 Keras MNIST 加载器使我们的生活更轻松。 但是,如果您想从原始数据中获取数据,或者想进一步了解 MNIST 的历史,可以在[这个页面](http://yann.lecun.com/exdb/mnist/)中找到更多信息。
# 模型输入和输出
......@@ -221,7 +221,7 @@ model.fit(x=data["train_X"], y=data["train_y"],
我正在使用与以前相同的回调。 我没有使用我们在[第 4 章](../Text/04.html)*中构建的 ROC AUC 回调,因为使用 Keras 进行了二进制分类*,因为 ROC AUC 没有为多分类器明确定义。
存在一些针对该问题的创造性解决方案。 例如,**通过成对分析**[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3250 & rep = rep1 & type = pdf](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3250&rep=rep1&type=pdf) )和 V **olume 在 ROC 表面下**[http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.2427 & rep = rep1 & type = pdf](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.2427&rep=rep1&type=pdf)都是出色的论文,都可以解决这个问题。 但是,实际上,这些方法及其度量标准很少在 R 中使用,最常在 R 中实现。因此,到目前为止,让我们坚持使用多类准确性,并且远离 R。
存在一些针对该问题的创造性解决方案。 例如,[**通过成对分析**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.3250&rep=rep1&type=pdf)[**ROC 表面下体积**](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.2427&rep=rep1&type=pdf) 都是出色的论文,都可以解决这个问题。 但是,实际上,这些方法及其度量标准很少在 R 中使用,最常在 R 中实现。因此,到目前为止,让我们坚持使用多类准确性,并且远离 R。
让我们观看 TensorBoard 在我们的模型训练中:
......
......@@ -163,13 +163,13 @@ tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow devic
# 超频
Hyperband 是一项超参数优化技术,由 Lisha Li,Kevin Jamieson,Guilia DeSalvo,Afshin Rostamizadeh 和 Ameet Talwalker 于 2016 年在伯克利开发。 您可以在 [https://arxiv.org/pdf/1603.06560.pdf](https://arxiv.org/pdf/1603.06560.pdf) 阅读他们的原始论文。
Hyperband 是一项超参数优化技术,由 Lisha Li,Kevin Jamieson,Guilia DeSalvo,Afshin Rostamizadeh 和 Ameet Talwalker 于 2016 年在伯克利开发。 您可以在[这里](https://arxiv.org/pdf/1603.06560.pdf)阅读他们的原始论文。
想象一下,就像我们在`RandomSearchCV`中所做的那样,随机采样许多潜在的超参数集。 完成`RandomSearchCV`后,它将选择一个单一的超参数配置作为其采样的*最佳*。 Hyperband 利用这样的思想,即即使经过少量迭代,最佳的超参数配置也可能会胜过其他配置。 Hyperband 中的乐队来自土匪,指的是基于多臂土匪技术(用于优化竞争选择之间的资源分配以优化性能为目标的技术)的勘探与开发。
使用 Hyperband,我们可以尝试一些可能的配置集( *n* ),仅训练一次迭代。 作者将迭代一词留作多种可能的用途。 但是,我将时代作为迭代。 一旦完成第一个培训循环,就将根据性能对结果进行配置。 然后,对该列表的上半部分进行大量迭代的训练。 然后重复进行减半和剔除的过程,我们得到了一些非常小的配置集,我们将针对在搜索中定义的完整迭代次数进行训练。 与在每种可能的配置中搜索最大历元相比,此过程使我们在更短的时间内获得了*最佳*超参数集。
在本章的 GitHub 存储库中,我在`hyperband.py`中包括了`hyperband`算法的实现。 此实现主要源自 FastML 的实现,您可以在 [http://fastml.com/tuning-hyperparams-fast-with-hyperband/](http://fastml.com/tuning-hyperparams-fast-with-hyperband/) 中找到。 要使用它,您需要首先实例化一个`hyperband`对象,如以下代码所示:
在本章的 GitHub 存储库中,我在`hyperband.py`中包括了`hyperband`算法的实现。 此实现主要源自 FastML 的实现,您可以在[这个页面](http://fastml.com/tuning-hyperparams-fast-with-hyperband/)中找到。 要使用它,您需要首先实例化一个`hyperband`对象,如以下代码所示:
```py
from hyperband import Hyperband
......@@ -216,7 +216,7 @@ def try_params(data, num_iters, hyperparameters):
results = hb.run()
```
在这种情况下,`results`将是每次运行,其运行时间和测试的超参数的字典。 因为即使这种高度优化的搜索都需要花费大量时间,并且 GPU 时间也很昂贵,所以我将 MNIST 搜索的结果包括在本章的 GitHub 存储库的`hyperband-output-mnist.txt`中,可以在以下位置找到: [https: //github.com/mbernico/deep_learning_quick_reference/tree/master/chapter_6](https://github.com/mbernico/deep_learning_quick_reference/tree/master/chapter_6)
在这种情况下,`results`将是每次运行,其运行时间和测试的超参数的字典。 因为即使这种高度优化的搜索都需要花费大量时间,并且 GPU 时间也很昂贵,所以我将 MNIST 搜索的结果包括在本章的 GitHub 存储库的`hyperband-output-mnist.txt`中,[可以在以下位置找到](https://github.com/mbernico/deep_learning_quick_reference/tree/master/chapter_6)
# 摘要
......
......@@ -253,7 +253,7 @@ model.fit(x=data["train_X"], y=data["train_y"],
![](img/bc72fd8e-e789-444f-836f-7ad5e015642c.png)
不足为奇,50,000 次观察不是很多数据,尤其是对于计算机视觉问题。 在实践中,计算机视觉问题得益于非常大的数据集。 实际上,Chen Sun 指出,附加数据倾向于与 [https://arxiv.org/abs/1707.02968](https://arxiv.org/abs/1707.02968) 中数据量的对数线性地帮助计算机视觉模型。 不幸的是,在这种情况下,我们无法真正找到更多数据。 但是也许我们可以做些。 接下来让我们讨论数据扩充。
不足为奇,50,000 次观察不是很多数据,尤其是对于计算机视觉问题。 在实践中,计算机视觉问题得益于非常大的数据集。 实际上,[Chen Sun 指出](https://arxiv.org/abs/1707.02968),附加数据倾向于以数据量的对数线性帮助计算机视觉模型。 不幸的是,在这种情况下,我们无法真正找到更多数据。 但是也许我们可以做些。 接下来让我们讨论数据扩充。
# 使用数据扩充
......
......@@ -13,7 +13,7 @@
[第 7 章](../Text/07.html)*卷积神经网络*中,我们训练了约 50,000 个观测值的卷积神经网络,并且由于网络和问题的复杂性,我们过度拟合了 短短几个时期后就开始训练。 如果您还记得的话,我曾评论说我们的培训集中有 50,000 个观察结果对于计算机视觉问题不是很大。 确实如此。 计算机视觉问题喜欢数据,而我们可以提供给他们的数据越多,它们的性能就越好。
我们可能认为计算机视觉技术最先进的深度神经网络通常在称为 **ImageNet** 的数据集上进行训练。 `ImageNet`数据集( [http://www.image-net.org/](http://www.image-net.org/)是包含 120 万张图像的 1,000 个分类器。 这还差不多! 如此庞大的数据集使研究人员能够构建真正复杂的深度神经网络,以检测复杂的特征。 当然,在 120 万张图像上训练有时具有 100 多个图层的模型的价格很高。 培训可能需要数周和数月,而不是数小时。
我们可能认为计算机视觉技术最先进的深度神经网络通常在称为 **ImageNet** 的数据集上进行训练。 [`ImageNet`数据集](http://www.image-net.org/)是包含 120 万张图像的 1,000 个分类器。 这还差不多! 如此庞大的数据集使研究人员能够构建真正复杂的深度神经网络,以检测复杂的特征。 当然,在 120 万张图像上训练有时具有 100 多个图层的模型的价格很高。 培训可能需要数周和数月,而不是数小时。
但是,如果我们可以从一个最先进的,多层的,经过数百万张图像训练的网络开始,然后仅使用少量数据将该网络应用于我们自己的计算机视觉问题,该怎么办? 那就是**转移学习**
......@@ -49,7 +49,7 @@
# 源/目标数量和相似性的影响
直到最近,很少有人研究数据量和源/目标域相似性对迁移学习性能的影响。 但是,这是一个对迁移学习的可用性很重要的主题,也是我撰写的主题。 在我的同事撰写的*调查数据量和域相似性对迁移学习应用程序的影响*中,( [https://arxiv.org/pdf/1712.04008.pdf](https://arxiv.org/pdf/1712.04008.pdf) ), 李云涛,张定超和我本人,对这些主题进行了一些实验。 这就是我们发现的东西。
直到最近,很少有人研究数据量和源/目标域相似性对迁移学习性能的影响。 但是,这是一个对迁移学习的可用性很重要的主题,也是我撰写的主题。 在我的同事撰写的[《调查数据量和域相似性对迁移学习应用程序的影响》](https://arxiv.org/pdf/1712.04008.pdf),对这些主题进行了一些实验。 这就是我们发现的东西。
# 更多数据总是有益的
......@@ -67,7 +67,7 @@
# 目标域概述
在本章的示例中,我将使用 Kaggle 的`Dogs versus Cats`数据集。 该数据集包含 25,000 张猫和狗的图像。 每个班级之间达到完美平衡,每个班级 12,500。 可以从 [https://www.kaggle.com/c/dogs-vs-cats/data](https://www.kaggle.com/c/dogs-vs-cats/data) 下载数据集。
在本章的示例中,我将使用 Kaggle 的`Dogs versus Cats`数据集。 该数据集包含 25,000 张猫和狗的图像。 每个班级之间达到完美平衡,每个班级 12,500。 可以从[这里](https://www.kaggle.com/c/dogs-vs-cats/data)下载数据集。
这是一个二进制分类问题。 每张照片都包含狗或猫,但不能同时包含两者。
......@@ -79,7 +79,7 @@
# 源网络架构
我们将使用 **Inception-V3** 网络体系结构( [https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.pdf](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Szegedy_Rethinking_the_Inception_CVPR_2016_paper.pdf)。 与您到目前为止在本书中所看到的相比,Inception 体系结构很有趣并且非常复杂。 如果您从[第 7 章](../Text/07.html)*卷积神经网络*中回想起,我们必须围绕网络体系结构做出的决定之一就是选择过滤器大小。 对于每一层,我们必须决定是否应使用例如 *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 章](../Text/07.html)*卷积神经网络*中回想起,我们必须围绕网络体系结构做出的决定之一就是选择过滤器大小。 对于每一层,我们必须决定是否应使用例如 *3 x 3* 滤镜,而不是 *5 x 5* 滤镜。 当然,也许根本就不需要另一次卷积。 也许像池化之类的东西可能更合适。 因此,如果我们在每一层都做所有事情,该怎么办? 这就是开始的动机。
该体系结构基于一系列模块或称为**初始模块**的构建块。 在每个初始模块中,先前的激活都赋予 *1 x 1* 卷积, *3 x 3* 卷积, *5 x 5* 卷积和最大值 池层。 然后将输出串联在一起。
......@@ -125,7 +125,7 @@ for layer in base_model.layers:
# 资料准备
我们将首先从 Kaggle( [https://www.kaggle.com/c/dogs-vs-cats/data](https://www.kaggle.com/c/dogs-vs-cats/data)下载数据,然后将`train.zip`解压缩到本书的`Chapter08`目录中。 现在,您将拥有一个名为`train/`的目录,其中包含 25,000 张图像。 每个名称都将类似于`cat.number.jpg`
我们将首先从 [Kaggle](https://www.kaggle.com/c/dogs-vs-cats/data) 下载数据,然后将`train.zip`解压缩到本书的`Chapter08`目录中。 现在,您将拥有一个名为`train/`的目录,其中包含 25,000 张图像。 每个名称都将类似于`cat.number.jpg`
我们想移动这些数据,以便我们为 train,val 和 test 具有单独的目录。 这些目录中的每一个都应具有 cat and dog 目录。 这都是非常无聊且平凡的工作,因此,我创建了`data_setup.py`来为您执行此操作。 一旦运行它,数据将在本章的其余部分中全部格式化。
......@@ -135,7 +135,7 @@ for layer in base_model.layers:
# 数据输入
快速浏览图像应使您确信我们的图像的分辨率和大小均不同。 正如您从[第 7 章](../Text/07.html)*卷积神经网络,*所了解的那样,我们需要这些图像的大小与神经网络的输入张量一致。 这是一个非常现实的问题,您将经常面对计算机视觉任务。 虽然当然可以使用 **ImageMagick**[http://www.imagemagick.org](http://www.imagemagick.org)之类的程序来批量调整图像大小,但 Keras `ImageDataGenerator`类可用于 快速调整图像大小,这就是我们要做的。
快速浏览图像应使您确信我们的图像的分辨率和大小均不同。 正如您从[第 7 章](../Text/07.html)*卷积神经网络,*所了解的那样,我们需要这些图像的大小与神经网络的输入张量一致。 这是一个非常现实的问题,您将经常面对计算机视觉任务。 虽然当然可以使用 [**ImageMagick**](http://www.imagemagick.org) 之类的程序来批量调整图像大小,但 Keras `ImageDataGenerator`类可用于 快速调整图像大小,这就是我们要做的。
Inception-V3 期望 299 x 299 x 3 图像。 我们可以在数据生成器中指定此目标大小,如以下代码所示:
......
......@@ -139,7 +139,7 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
例如,如果我们在三月份拥有价值 80 美元的股票,而在四月份突然价值 100 美元,则该股票的流率将为 20 美元。
一阶微分不能保证平稳的时间序列。 我们可能还需要删除季节或趋势。 趋势消除是专业预测员日常生活的重要组成部分。 如果我们使用传统的统计模型进行预测,则需要做更多的工作。 虽然我们没有涵盖这些内容的页面,但我们可能还需要执行二阶差分,季节性趋势下降或更多操作。 **增强 Dickey-Fuller****ADF** )测试是一种统计测试,通常用于确定我们的时间序列是否实际上是静止的。 如果您想知道时间序列是否稳定,可以使用增强的 Dickey-Fuller 检验来检查( [https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test](https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test)。 但是,对于 LSTM,一阶微分通常可能就足够了。 只需了解网络最肯定会学习您数据集中剩余的季节和时期。
一阶微分不能保证平稳的时间序列。 我们可能还需要删除季节或趋势。 趋势消除是专业预测员日常生活的重要组成部分。 如果我们使用传统的统计模型进行预测,则需要做更多的工作。 虽然我们没有涵盖这些内容的页面,但我们可能还需要执行二阶差分,季节性趋势下降或更多操作。 **增强 Dickey-Fuller****ADF** )测试是一种统计测试,通常用于确定我们的时间序列是否实际上是静止的。 如果您想知道时间序列是否稳定,[可以使用增强的 Dickey-Fuller 检验来检查](https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test)。 但是,对于 LSTM,一阶微分通常可能就足够了。 只需了解网络最肯定会学习您数据集中剩余的季节和时期。
# ARIMA 和 ARIMAX 预测
......@@ -157,7 +157,7 @@ ARIMAX 模型允许在时间序列模型中包含一个或多个协变量。 您
如果您有许多具有复杂的高阶交互作用的协变量,那么您已进入 LSTM 的最佳预测时间序列。 在本书的开头,我们讨论了多层感知器如何对输入变量之间的复杂相互作用进行建模,从而为我们提供了自动特征工程,该工程提供了线性或逻辑回归的提升。 此属性可以继续使用 LSTM 进行具有许多输入变量的时间序列预测。
如果您想全面了解 ARIMA,ARIMAX 和时间序列预测,建议从 Rob J. Hyndman 的博客 Hyndsight 开始,网址为 [https://robjhyndman.com/hyndsight/](https://robjhyndman.com/hyndsight/)
如果您想全面了解 ARIMA,ARIMAX 和时间序列预测,建议从 [Rob J. Hyndman 的博客 Hyndsight](https://robjhyndman.com/hyndsight/) 开始
# 使用 LSTM 进行时间序列预测
......
......@@ -113,7 +113,7 @@ docB = "the dog sat on my bed"
这就是计数向量化。 这是我们工具箱中最简单的矢量化技术。
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(*和*)占我们所讲单词的 7%,是第二个最受欢迎的单词(的*)出现频率的两倍 )。 语言中单词的分布是幂律分布,这是称为 Zipf 定律的基础( [https://en.wikipedia.org/wiki/Zipf%27s_law](https://en.wikipedia.org/wiki/Zipf%27s_law) )。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用**。*
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(*和*)占我们所讲单词的 7%,是第二个最受欢迎的单词(的*)出现频率的两倍 )。 语言中单词的分布是幂律分布,[这是称为 Zipf 定律的基础](https://en.wikipedia.org/wiki/Zipf%27s_law)。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用**。*
更好的策略是根据单词在文档中的相对重要性对单词进行加权。 为此,我们可以使用 TF-IDF。
......@@ -191,11 +191,11 @@ array([ 5.81600726e-01, 3.07168198e+00, 3.73339128e+00,
当然,除此以外,还有更多的培训词嵌入网络的方法,而我故意过分简化了快速参考样式。
如果您想了解更多信息,我建议您先阅读 Mikolov 等人的*单词和短语的分布式表示及其组成*。 ( [https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)。 本文介绍了一种流行的创建单词嵌入的方法,称为`word2vec`
如果您想了解更多信息,我建议您先阅读 Mikolov 等人的[《单词和短语的分布式表示及其组成》](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)。 本文介绍了一种流行的创建单词嵌入的方法,称为`word2vec`
# 通过计数学习单词嵌入
学习单词嵌入的另一种方法是通过计数。 用于词表示的**全局向量****GloVe** 是 Pennington 等人创建的算法。 ( [https://nlp.stanford.edu/projects/glove/](https://nlp.stanford.edu/projects/glove/)
学习单词嵌入的另一种方法是通过计数。 [用于词表示的**全局向量**或 **GloVe** 是 Pennington 等人创建的算法](https://nlp.stanford.edu/projects/glove/)
GloVe 通过创建单词共现的非常大的矩阵来工作。 对于某些语料库,这实际上是两个单词彼此相邻出现的次数的计数。 该算法的作者根据单词的接近程度来加权此计数,以使彼此接近的单词对每个计数的贡献更大。 一旦创建了这个共现矩阵,它将分解为一个较小的空间,从而生成一个单词 x 特征较大的矩阵。
......@@ -207,7 +207,7 @@ GloVe 通过创建单词共现的非常大的矩阵来工作。 对于某些语
一种幼稚的方法可能是获取文档中所有单词的向量并计算均值。 我们可能将此值解释为文档的平均语义值。 在实践中,通常使用此解决方案,并且可以产生良好的结果。 但是,它并不总是优于 BoW 嵌入模型。 考虑短语*狗咬人**狗咬人*。 希望您会同意我的观点,这是两个截然不同的陈述。 但是,如果我们对它们的词向量进行平均,它们将具有相同的值。 这使我们提出了一些其他策略,可以用来设计文档中的特征,例如使用每个向量的均值,最大值和最小值。
Le 和 Mikolov 在*句子和文档的分布式表示*[https://arxiv.org/abs/1405.4053](https://arxiv.org/abs/1405.4053)中提出了一种从单词到文档的更好的想法。 基于`word2vec`的思想,本文将段落标识符添加到我们描述的用于学习单词向量的神经网络的输入中。 使用文本中的单词以及文档 ID 可以使网络学习将可变长度文档嵌入矢量空间中。 该技术称为 **doc2vec** ,它可以很好地用作主题建模以及为模型创建输入特征的技术。
Le 和 Mikolov 在[《句子和文档的分布式表示》](https://arxiv.org/abs/1405.4053)中提出了一种从单词到文档的更好的想法。 基于`word2vec`的思想,本文将段落标识符添加到我们描述的用于学习单词向量的神经网络的输入中。 使用文本中的单词以及文档 ID 可以使网络学习将可变长度文档嵌入矢量空间中。 该技术称为 **doc2vec** ,它可以很好地用作主题建模以及为模型创建输入特征的技术。
最后,许多深度学习框架都包含了嵌入层的概念。 嵌入层使您可以了解嵌入空间,这是网络正在执行的总体任务的一部分。 使用深度神经网络时,嵌入层可能是矢量化文本的最佳选择。 接下来让我们看一下嵌入层。
......@@ -401,7 +401,7 @@ model.fit(x=data["X_train"], y=data["y_train"],
# 有和没有 GloVe 的文档分类
在此示例中,我们将使用一个比较著名的文本分类问题,称为 **20 新闻组问题**[http://www.cs.cmu.edu/afs/cs.cmu。 edu / project / theo-20 / www / data / news20.html](http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/news20.html)。 在此问题中,我们获得了 19,997 个文档,每个文档都属于一个新闻组。 我们的目标是使用帖子的文本来预测该文本所属的新闻组。对于我们中间的千禧一代,新闻组是 **Reddit** 的先驱(但可能更接近伟大的 -Reddit 的曾祖父)。 这些新闻组涵盖的主题差异很大,包括政治,宗教和操作系统等主题,您应避免在礼貌的公司中讨论所有这些主题。 这些职位相当长,语料库中有 174,074 个独特的单词。
在此示例中,我们将使用一个比较著名的文本分类问题,称为 [**20 新闻组问题**](http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/news20.html)。 在此问题中,我们获得了 19,997 个文档,每个文档都属于一个新闻组。 我们的目标是使用帖子的文本来预测该文本所属的新闻组。对于我们中间的千禧一代,新闻组是 **Reddit** 的先驱(但可能更接近伟大的 -Reddit 的曾祖父)。 这些新闻组涵盖的主题差异很大,包括政治,宗教和操作系统等主题,您应避免在礼貌的公司中讨论所有这些主题。 这些职位相当长,语料库中有 174,074 个独特的单词。
这次,我将构建模型的两个版本。 在第一个版本中,我们将使用嵌入层,并且将学习嵌入空间,就像在前面的示例中一样。 在第二个版本中,我将使用 GloVe 向量作为嵌入层的权重。 然后,我将花一些时间比较和对比这两种方法。
......
......@@ -84,7 +84,7 @@
# 翻译指标
知道翻译是否良好很难。 机器翻译质量的通用度量标准称为**双语评估研究****BLEU** ),它最初是由 Papineni 等人在 BLEU 中创建的:一种自动评估机器的方法 翻译( [http://aclweb.org/anthology/P/P02/P02-1040.pdf](http://aclweb.org/anthology/P/P02/P02-1040.pdf) )。 BLEU 是基于 ngram 的分类精度的改进应用程序。 如果您想使用 BLEU 来衡量翻译质量,TensorFlow 团队已经发布了一个脚本,该脚本可以根据给定的地面真实翻译和机器预测翻译的语料来计算 BLEU 分数。 您可以在 [https://github.com/tensorflow/nmt/blob/master/nmt/scripts/bleu.py](https://github.com/tensorflow/nmt/blob/master/nmt/scripts/bleu.py) 找到该脚本。
知道翻译是否良好很难。 机器翻译质量的通用度量标准称为**双语评估研究****BLEU** ),它最初是由 Papineni 等人在[《BLEU:一种自动评估机器翻译的方法》](http://aclweb.org/anthology/P/P02/P02-1040.pdf)中创建的。 BLEU 是基于 ngram 的分类精度的改进应用程序。 如果您想使用 BLEU 来衡量翻译质量,TensorFlow 团队已经发布了一个脚本,该脚本可以根据给定的地面真实翻译和机器预测翻译的语料来计算 BLEU 分数。 您可以在[这里](https://github.com/tensorflow/nmt/blob/master/nmt/scripts/bleu.py)找到该脚本。
# 机器翻译
......@@ -92,9 +92,9 @@
在本案例研究中,我们将教计算机讲法语。 在几个小时的培训中,该模型将比我说法语更好。 考虑一下,这真是太神奇了。 我将训练一台计算机来执行我自己无法完成的任务。 当然,也许您确实会说法语,但这并不会给您留下深刻的印象,在这种情况下,我将美国著名演员亚当·桑德勒(Adam Sandler)称为比利·麦迪逊(Billy Madison):好吧,对我来说很难,所以退缩!
该示例的大部分来自于弗朗索瓦·乔勒(Francois Chollet)的博客文章,标题为“序列到序列学习的十分钟介绍( [https://blog.keras.io/a-ten-minute -sequence-to-sequence-to-sequence-learning-in-keras.html](https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html)。 尽管我怀疑自己是否可以改进这项工作,但我希望使用本示例的目的是花一点点多一点的时间看一下序列到序列的网络,以使您掌握实现自己的所有知识。
该示例的大部分来自于弗朗索瓦·乔勒(Francois Chollet)的博客文章,标题为[《序列到序列学习的十分钟介绍》](https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html)。 尽管我怀疑自己是否可以改进这项工作,但我希望使用本示例的目的是花一点点多一点的时间看一下序列到序列的网络,以使您掌握实现自己的所有知识。
与往常一样,本章的代码可以在本书的 Git 存储库中的`Chapter11`下找到。 您可以在 [http://www.manythings.org/anki/](http://www.manythings.org/anki/) 中找到此示例所需的数据,该文件将存档许多双语句子对的数据集,我们将在后面详细讨论。 我要使用的文件是 [fra-eng.zip](http://www.manythings.org/anki/fra-eng.zip) 。 这是英语/法语句子对的集合。 如果需要,您可以轻松选择其他语言,而无需进行太多修改。
与往常一样,本章的代码可以在本书的 Git 存储库中的`Chapter11`下找到。 您可以在[这个页面](http://www.manythings.org/anki/)中找到此示例所需的数据,该文件将存档许多双语句子对的数据集,我们将在后面详细讨论。 我要使用的文件是 [fra-eng.zip](http://www.manythings.org/anki/fra-eng.zip) 。 这是英语/法语句子对的集合。 如果需要,您可以轻松选择其他语言,而无需进行太多修改。
在本案例研究中,我们将构建一个网络,该网络可以在给定一些英语句子的情况下学习法语句子。 这将是一个具有老师强迫作用的字符级序列到序列模型。
......
......@@ -109,7 +109,7 @@
# 深心
至少没有提到 Mnih 等人的论文*和深度强化学习一起玩 Atari* ,就不会完成关于强化学习的讨论。 ( [https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf) ),然后是 DeepMind,现在是 Google。 在这篇具有里程碑意义的论文中,作者使用了卷积神经网络来训练深度 Q 网络来玩 Atari 2600 游戏。 他们从 Atari 2600 游戏中获取原始像素输出,将其缩小一点,将其转换为灰度,然后将其用作网络的状态空间输入。 为了使计算机了解屏幕上对象的速度和方向,他们使用了四个图像缓冲区作为深度 Q 网络的输入。
至少没有提到 Mnih 等人的论文[《和深度强化学习一起玩 Atari》](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf),就不会完成关于强化学习的讨论。 然后是 DeepMind,现在是 Google。 在这篇具有里程碑意义的论文中,作者使用了卷积神经网络来训练深度 Q 网络来玩 Atari 2600 游戏。 他们从 Atari 2600 游戏中获取原始像素输出,将其缩小一点,将其转换为灰度,然后将其用作网络的状态空间输入。 为了使计算机了解屏幕上对象的速度和方向,他们使用了四个图像缓冲区作为深度 Q 网络的输入。
作者能够创建一个代理,该代理能够使用完全相同的神经网络体系结构玩 7 个 Atari 2600 游戏,并且在其中三个游戏上,该代理要比人类更好。 后来又扩大到 49 场比赛,其中大多数比赛都比人类出色。 本文是迈向通用 AI 的非常重要的一步,它实际上是目前在强化学习中开展的许多研究的基础。
......@@ -228,7 +228,7 @@ dqn.compile(Adam(lr=1e-3), metrics=['mae'])
# 训练
Keras RL 提供了多个类似 Keras 的回调,可以方便地进行模型检查指向和记录。 我将在下面使用这两个回调。 如果您想查看 Keras-RL 提供的更多回调,可以在以下位置找到它们: [https://github.com/matthiasplappert/keras-rl/blob/master/rl/callbacks.py](https://github.com/matthiasplappert/keras-rl/blob/master/rl/callbacks.py) 。 您还可以找到可用于创建自己的 Keras-RL 回调的 Callback 类。
Keras RL 提供了多个类似 Keras 的回调,可以方便地进行模型检查指向和记录。 我将在下面使用这两个回调。 如果您想查看 Keras-RL 提供的更多回调,[可以在以下位置找到它们](https://github.com/matthiasplappert/keras-rl/blob/master/rl/callbacks.py)。 您还可以找到可用于创建自己的 Keras-RL 回调的 Callback 类。
我们将使用以下代码来训练我们的模型:
......
......@@ -13,9 +13,9 @@
# GAN 概述
生成对抗网络都是关于生成新内容的。 GAN 能够学习一些分布并从该分布创建新样本。 该样本可能只是我们训练数据中未出现的直线上的新点,但也可能是非常复杂的数据集中的新点。 GAN 已用于生成新的音乐,声音和图像。 根据 Yann LeCun 所说,*对抗训练是切成薄片*[https://www.quora.com/session/Yann-LeCun/1](https://www.quora.com/session/Yann-LeCun/1) )以来最酷的事情。 我不确定切片面包是否特别酷,但是 Yann LeCun 是​​一个非常酷的家伙,所以我会信守诺言。 无论如何,GAN 都非常受欢迎,虽然它可能不如我们在业务环境中涵盖的其他一些主题那么实用,但在我们对深度学习技术的调查中值得考虑。
生成对抗网络都是关于生成新内容的。 GAN 能够学习一些分布并从该分布创建新样本。 该样本可能只是我们训练数据中未出现的直线上的新点,但也可能是非常复杂的数据集中的新点。 GAN 已用于生成新的音乐,声音和图像。 根据 Yann LeCun 所说,[《对抗训练是切片以来最酷的事情》](https://www.quora.com/session/Yann-LeCun/1)。 我不确定切片面包是否特别酷,但是 Yann LeCun 是​​一个非常酷的家伙,所以我会信守诺言。 无论如何,GAN 都非常受欢迎,虽然它可能不如我们在业务环境中涵盖的其他一些主题那么实用,但在我们对深度学习技术的调查中值得考虑。
2014 年,伊恩·古德费洛(Ian Goodfellow)等人。 撰写了一篇名为**生成对抗网络**[https://arxiv.org/pdf/1406.2661.pdf](https://arxiv.org/pdf/1406.2661.pdf)的论文,提出了使用两个深度网络进行对抗训练的框架,每个尝试 打败对方。 该框架由两个独立的网络组成:鉴别器和生成器。
2014 年,伊恩·古德费洛(Ian Goodfellow)等人。 撰写了一篇名为[**生成对抗网络**](https://arxiv.org/pdf/1406.2661.pdf)的论文,提出了使用两个深度网络进行对抗训练的框架,每个尝试 打败对方。 该框架由两个独立的网络组成:鉴别器和生成器。
鉴别器正在查看来自训练集的真实数据和来自生成器的假数据。 它的工作是将每一个作为传入数据实例分类为真实还是伪造。
......@@ -27,7 +27,7 @@
关于 GAN 的论文很多,每篇都提出了新的新颖架构和调整。 但是,它们中的大多数至少在某种程度上基于**深卷积 GAN****DCGAN** )。 在本章的其余部分中,我们将重点介绍这种模型,因为当您采用此处未介绍的新的令人兴奋的 GAN 架构(例如**有条件 GAN****cGAN** ),Stack GAN,InfoGAN 或 Wasserstein GAN,或者可能还有一些其他的新变种,您可能会选择接下来看看。
DCGAN 由 Alex Radford,Luke Metz 和 Soumith Chintala 在论文*通过深度卷积生成对抗网络*[https://arxiv.org/pdf/1511.06434.pdf](https://arxiv.org/pdf/1511.06434.pdf)
DCGAN 由 Alex Radford,Luke Metz 和 Soumith Chintala 在论文[《深度卷积生成对抗网络》](https://arxiv.org/pdf/1511.06434.pdf)中提出
接下来让我们看一下 DCGAN 的总体架构。
......@@ -57,7 +57,7 @@ GAN 的整体体系结构如下图所示。 生成器和判别器分别是单独
在完全连接的层之后,事情变得更加简单。 就像我们一直一样,我们正在使用卷积层。 但是,这次我们反向使用它们。 我们不再使用最大池来缩减样本量。 取而代之的是,我们进行上采样,在学习视觉特征时使用卷积来构建我们的网络,并最终输出适当形状的张量。
通常,生成器中最后一层的激活是双曲正切,并且训练图像矩阵中的元素被归一化为-1 和 1 之间。这是我将在整章中提到的众多 GAN hack 之一。 研究人员已经发现了一些经验证明可以帮助构建稳定的 GAN 的 hack,Soumith Chintala 可以在此 Git 上找到大多数黑客,而 Soumith Chintala 也是 DCGAN 原始论文的作者之一,在 [https:/ /github.com/soumith/ganhacks](https://github.com/soumith/ganhacks) 。 深度学习研究的世界无疑是一个很小的领域。
通常,生成器中最后一层的激活是双曲正切,并且训练图像矩阵中的元素被归一化为-1 和 1 之间。这是我将在整章中提到的众多 GAN hack 之一。 研究人员已经发现了一些经验证明可以帮助构建稳定的 GAN 的 hack,Soumith Chintala 可以在此 Git 上找到大多数黑客,[而 Soumith Chintala 也是 DCGAN 原始论文的作者之一](https://github.com/soumith/ganhacks)。 深度学习研究的世界无疑是一个很小的领域。
# 鉴别器架构
......@@ -107,7 +107,7 @@ DCGAN 框架是使用迷你批处理来进行训练的,这与我之前在本
# GAN 的安全选择
我之前已经提到过 Soumith Chintala 的 GAN hacks Git( [https://github.com/soumith/ganhacks](https://github.com/soumith/ganhacks),当您试图使 GAN 稳定时,这是一个很好的起点。 既然我们已经讨论了训练稳定的 GAN 会有多么困难,让我们来谈谈一些安全的选择,这些选择可能会帮助您成功找到自己的地方。 尽管有很多技巧,但以下是本章中尚未涵盖的我的主要建议:
我之前已经提到过 Soumith Chintala 的 [GAN hacks Git](https://github.com/soumith/ganhacks),当您试图使 GAN 稳定时,这是一个很好的起点。 既然我们已经讨论了训练稳定的 GAN 会有多么困难,让我们来谈谈一些安全的选择,这些选择可能会帮助您成功找到自己的地方。 尽管有很多技巧,但以下是本章中尚未涵盖的我的主要建议:
* **批处理规范**:使用批处理规范化时,请为真实数据和伪数据构造不同的微型批处理,并分别进行更新。
* **泄漏的 ReLU** :泄漏的 ReLU 是 ReLU 激活功能的变异。 回想一下 ReLU 函数是![](img/f11e5dcb-d17d-4280-9485-b003fd9e0d4b.png)
......@@ -127,7 +127,7 @@ DCGAN 框架是使用迷你批处理来进行训练的,这与我之前在本
我们之前曾与 MNIST 合作,但是这次我们将使用 GAN 生成新的 MNIST 图像。 训练 GAN 可能需要很长时间。 但是,此问题很小,可以在几个小时内在大多数笔记本电脑上运行,这是一个很好的例子。 稍后,我们将把这个例子扩展到 CIFAR-10 图像。
我在这里使用的网络体系结构已被许多人发现并进行了优化,包括 DCGAN 论文的作者以及像 ErikLinder-Norén 这样的人,他是 GAN 实现的优秀集合,称为 **Keras GAN**[https://github.com/eriklindernoren/Keras-GAN](https://github.com/eriklindernoren/Keras-GAN)作为我在此处使用的代码的基础。 如果您想知道我是如何在这里使用的体系结构选择的,这些就是我试图站在肩膀上的巨人。
我在这里使用的网络体系结构已被许多人发现并进行了优化,包括 DCGAN 论文的作者以及像 ErikLinder-Norén 这样的人,他是 GAN 实现的优秀集合,称为 [**Keras GAN**](https://github.com/eriklindernoren/Keras-GAN) 作为我在此处使用的代码的基础。 如果您想知道我是如何在这里使用的体系结构选择的,这些就是我试图站在肩膀上的巨人。
# 加载数据集
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册