提交 5494410b 编写于 作者: W wizardforcel

2020-12-19 11:10:25

上级 a8704ea6
# Preface
TensorFlow 是用于机器学习以及最近的深度学习的最受欢迎的架构之一。 本书是将 TensorFlow 和 Keras 模型部署到实际应用程序中的指南。
本书从专门的蓝图开始,说明如何构建可生成预测的应用程序。 随后的每节课程都针对特定类型的模型,例如神经网络,使用 Keras 配置深度学习环境,并着重于三个重要问题,即模型如何工作,如何在示例模型中提高我们的预测准确性以及如何 使用实际应用程序评估和评估其性能。
在本书中,您将学习如何创建一个应用程序,该应用程序可以从深度学习中生成预测。 这项学习之旅从探索神经网络的通用组件及其基本性能开始。 在课程结束时,您将探索使用 TensorFlow 创建的训练有素的神经网络。 在其余的课程中,您将学习建立一个将不同组件组合在一起的深度学习模型,并评估它们在预测中的性能。 最后,我们将能够部署可运行的 Web 应用程序
到本书结尾,您将可以通过创建全新的模型并根据需要更改应用程序的核心组件来创建更准确的预测。
# 这本书涵盖的内容
*第 1 课,神经网络和深度学习简介*可帮助您设置和配置深度学习环境,并开始研究各个模型和案例研究。 它还讨论了神经网络及其思想及其起源,并探讨了其功能。
*第 2 课,模型体系结构*显示了如何使用深度学习模型预测比特币价格。
*第 3 课,模型评估和优化*展示了如何评估神经网络模型。 我们将修改网络的超参数以提高其性能。
*第 4 课,产品化*解释了如何将深度学习模型产品化,并提供了如何将模型部署为 Web 应用程序的练习。
# 这本书需要什么
本书将要求以下最低硬件要求:
* 处理器:1.8 GHz 或更高
* 内存:2 GB RAM
* 硬盘:10 GB
在本书中,我们将使用 Python 3,TensorFlow,TensorBoard 和 Keras。 请确保在计算机上安装了以下软件:
* 代码编辑器,例如:Visual Studio 代码(https://code.visualstudio.com/)
* Python 3.6
* Windows 上的 TensorFlow 1.4 或更高版本
* 大声 2
* 张量板
* Jupyter 笔记本
* 大熊猫
* NumPy
* 操作系统:Windows(8 或更高版本),MacOS 或 Linux(Ubuntu)
# 这本书适合谁
本书专为对使用 TensorFlow 和 Keras 开发应用程序感兴趣的开发人员,分析师和数据科学家而设计。 您需要具备编程知识。 我们还假设您熟悉 Python 3 和 Web 应用程序的基本知识。 您还需要对线性代数,概率和统计数据有事先的了解和使用知识。
# 约定
在本书中,您将找到许多可以区分不同类型信息的文本样式。 以下是这些样式的一些示例,并解释了其含义。
文本,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,虚拟 URL,用户输入和 Twitter 句柄中的代码字显示如下:“ `\`类提供了静态方法来生成自身的实例,例如 作为`()`。”
代码块设置如下:
```py
tf.nn.max_pool(
activation,
ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1],
padding="SAME")
```
任何命令行输入或输出的编写方式如下:
```py
$ python3 lesson_1/activity_1/test_stack.py
```
**新术语**和**重要词**以粗体显示。 您在屏幕上看到的字词,例如在菜单或对话框中,将以如下形式显示在文本中:“单击“下一步”按钮将您移至下一个屏幕。”
### 注意
警告或重要提示会出现在这样的框中。
### 提示
提示和技巧如下所示。
# 读者反馈
始终欢迎读者的反馈。 让我们知道您对这本书的看法-您喜欢或不喜欢的东西。 读者反馈对我们很重要,因为它可以帮助我们开发出您真正能充分利用的标题。
要向我们发送一般反馈,只需发送电子邮件`<[feedback@packtpub.com](mailto:feedback@packtpub.com)>`,然后在您的邮件主题中提及该书的标题。
如果您有专业知识的主题,并且对写作或撰写书籍感兴趣,请参阅 [www.packtpub.com/authors](http://www.packtpub.com/authors) 上的作者指南。
# 客户支持
既然您是 Packt 书的骄傲拥有者,我们可以通过很多方法来帮助您从购买中获得最大收益。
# 下载示例代码
您可以从 [http://www.packtpub.com](http://www.packtpub.com) 的帐户中下载本书的示例代码文件。 如果您在其他地方购买了此书,则可以访问 [http://www.packtpub.com/support](http://www.packtpub.com/support) 并注册以将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
1. 使用您的电子邮件地址和密码登录或注册到我们的网站。
2. 将鼠标指针悬停在顶部的 **SUPPORT** 选项卡上。
3. 单击**代码下载** & **勘误表**。
4. 在**搜索**框中输入书籍的名称。
5. 选择您要下载其代码文件的书。
6. 从购买本书的下拉菜单中选择。
7. 点击**代码下载**。
您还可以通过在 Packt Publishing 网站上的图书网页上单击**代码文件**按钮来下载代码文件。 通过在**搜索**框中输入书名可以访问此页面。 请注意,您需要登录到 Packt 帐户。
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* 适用于 Mac 的 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 的 [https://github.com/TrainingByPackt/Beginning-Application-Developmentwith-TensorFlow-and-Keras](https://github.com/TrainingByPackt/Beginning-Application-Developmentwith-TensorFlow-and-Keras) 中。 我们还从 [https://github.com/PacktPublishing/](https://github.com/PacktPublishing/) 提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
# 安装
在开始本课程之前,我们将安装 Visual Studio Code,Python 3,TensorFlow 和 Keras。 安装步骤如下:
## 安装 Visual Studio
1. 在浏览器中访问 [https://code.visualstudio.com/](https://code.visualstudio.com/) 。
2. 单击主页右上角的下载。
3. 接下来,选择 Windows。
4. 按照安装程序中的步骤就可以了! 您的 Visual Studio 代码已准备就绪。
## 安装 Python 3
1. 转到 [https://www.python.org/downloads/](https://www.python.org/downloads/) 。
2. 单击 Download Python 3.6.4 选项下载设置。
3. 按照安装程序中的步骤就可以了! 您的 Python 已准备就绪。
## 安装 TensorFlow
按照以下网站上的说明下载并安装 TensorFlow: [https://www.tensorflow.org/install/install_windows](https://www.tensorflow.org/install/install_windows) 。
## 硬安装
按照以下网站上的说明下载并安装 Keras: [https://keras.io/#installation](https://keras.io/#installation) 。
# 勘误
尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您发现我们的其中一本书中有错误-可能是文本或代码中的错误-如果您能向我们报告,我们将不胜感激。 这样,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。 如果您发现任何勘误,请访问 [http://www.packtpub.com/submit-errata](http://www.packtpub.com/submit-errata) 进行报告,选择您的图书,点击“勘误提交表格”链接,然后输入勘误的详细信息 。 验证勘误后,您的提交将被接受,并且勘误将上传到我们的网站,或添加到该标题的**勘误**部分下的任何现有勘误列表中。
要查看先前提交的勘误,请转到 [https://www.packtpub.com/books/content/support](https://www.packtpub.com/books/content/support) ,然后在搜索字段中输入书籍的名称。 所需信息将出现在**勘误表**部分下。
# 盗版
互联网上版权材料的盗版在所有媒体中都是一个持续存在的问题。 在 Packt,我们非常重视版权和许可的保护。 如果您在 Internet 上以任何形式发现我们的作品的任何非法副本,请立即向我们提供位置地址或网站名称,以便我们寻求补救。
请通过`<[copyright@packtpub.com](mailto:copyright@packtpub.com)>`与我们联系,并提供指向可疑盗版材料的链接。
感谢您在保护作者方面的帮助以及我们为您带来有价值的内容的能力。
# 问题
如果您对本书的任何方面都有疑问,可以通过`<[questions@packtpub.com](mailto:questions@packtpub.com)>`与我们联系,我们将尽力解决该问题。
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
# 前言
TensorFlow 是 Google 流行的机器学习和深度学习产品。 它已迅速成为执行快速,高效和准确的深度学习任务的工具的流行选择。
这本书向您展示了现实世界项目的实际实现,并教您如何利用 TensorFlow 的功能执行高效的深度学习。 在本书中,您将了解执行深度学习的不同范例,例如深度神经网络,卷积神经网络,递归神经网络等等,以及如何使用 TensorFlow 实施它们。
这将在自然语言处理,图像分类和欺诈检测等热门话题领域的三个真实项目的端到端实施的帮助下进行演示。
到本书结尾,您将掌握 TensorFlow 和 Keras 的所有深度学习概念及其实现。
# 这本书是给谁的
本书面向希望将机器学习集成到应用软件中并通过在 TensorFlow 中实施实际项目来掌握深度学习的应用开发人员,数据科学家和机器学习从业人员。 要充分利用本书,需要具备 Python 编程知识和深度学习的基础知识。
# 本书涵盖的内容
[第 1 章](1.html)*机器学习工具包*着眼于安装 Docker,设置机器学习 Docker 文件,与主机共享数据并运行 REST 服务以提供环境。
[第 2 章](2.html)*图像数据*,教 MNIST 数字,如何获取它们,张量实际上只是多维数组,以及如何将图像数据和分类或分类数据编码为张量 。 然后,我们进行了快速回顾并采用了食谱的方法来考虑尺寸和张量,以便为机器学习准备数据。
[第 3 章](3.html)*经典神经网络*涵盖了很多内容! 我们看到了经典的或密集的神经网络的结构。 我们了解激活,非线性和 softmax。 然后我们建立测试和训练数据,并学习如何使用`Dropout``Flatten`构建网络。 我们还将学习有关求解器的所有知识,或者机器实际学习的方法。 然后,我们探索超参数,最后,通过网格搜索对模型进行微调。
[第 4 章](4.html)*卷积神经网络*教您卷积,卷积是一种在图像上移动以提取特征的松散连接方式。 然后,我们学习有关池化的知识,该池总结了最重要的功能。 我们将使用这些技术构建卷积神经网络,并将卷积和池化的许多层结合起来,以生成一个深度神经网络。
[第 5 章](5.html)*图像分类服务器*使用 Swagger API 定义创建 REST API 模型,然后声明性地生成 Python 框架,以便我们为该 API 提供服务。 然后,我们创建一个 Docker 容器,该容器不仅捕获我们正在运行的代码(即我们的服务),而且还捕获我们的预训练机器学习模型。 然后形成一个包,以便我们能够部署和使用我们的容器。 最后,我们使用此容器提供服务并做出预测。
# 充分利用这本书
你需要:
* 命令行外壳经验
* 有 Python 脚本编写或应用程序开发经验
# 下载示例代码文件
您可以从 [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
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 的 [https://github.com/PacktPublishing/Hands-On-Deep-Learning-for-Images-with-TensorFlow](https://github.com/PacktPublishing/Hands-On-Deep-Learning-for-Images-with-TensorFlow) 。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
我们还有丰富的书籍和视频目录中的其他代码包,可通过 **[https://github.com/PacktPublishing/](https://github.com/PacktPublishing/)** 获得。 去看一下!
# 使用约定
本书中使用了许多文本约定。
`CodeInText`:指示文本,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,虚拟 URL,用户输入和 Twitter 句柄中的代码字。 这是一个示例:“您只需键入`docker --help`以确保已安装所有组件。”
任何命令行输入或输出的编写方式如下:
```py
C:\11519>docker build -t keras .
```
**粗体**:表示新术语,重要单词或您在屏幕上看到的单词。 例如,菜单或对话框中的单词会出现在这样的文本中。 这是一个示例:“我们将选择并复制稍后将使用的测试命令,然后单击“应用”。
警告或重要提示如下所示。
提示和技巧如下所示。
# 保持联系
始终欢迎读者的反馈。
**一般反馈**:给`feedback@packtpub.com`发送电子邮件,并在邮件主题中提及书名。 如果您对本书的任何方面有疑问,请通过`questions@packtpub.com`向我们发送电子邮件。
**勘误表**:尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您在这本书中发现错误,请向我们报告,我们将不胜感激。 请访问 [www.packtpub.com/submit-errata](http://www.packtpub.com/submit-errata) ,选择您的书籍,点击勘误提交表格链接,然后输入详细信息。
**盗版**:如果您在 Internet 上以任何形式遇到我们的作品的任何非法副本,请向我们提供位置地址或网站名称,我们将不胜感激。 请通过`copyright@packtpub.com`与我们联系,并提供材料链接。
**如果您有兴趣成为作家**:如果您有一个专业的话题并且对写作或撰写书籍感兴趣,请访问 [authors.packtpub.com](http://authors.packtpub.com/) ]。
# 评论
请留下评论。 阅读和使用本书后,为什么不在您购买本书的网站上留下评论? 然后,潜在的读者可以查看并使用您的公正意见做出购买决定,Packt 的我们可以了解您对我们产品的看法,我们的作者可以在书中看到您的反馈。 谢谢!
有关 Packt 的更多信息,请访问 [packtpub.com](https://www.packtpub.com/)
\ No newline at end of file
# 机器学习工具包
在本章中,我们将研究以下主题:
* 安装 Docker
* 构建机器学习 Docker 文件
* 在您的主机和 Docker 容器之间来回共享数据
* 使用 Docker 容器内部运行的机器学习基础架构构建 REST 服务
# 安装 Docker
我们需要下载 Docker 才能安装它,在本节中,您将看到我们如何在 Windows 上安装 Docker 并使用适合在 Linux 上安装的脚本。
让我们从 [https://www.docker.com/](https://www.docker.com/) 安装 Docker。 完成此操作的最快方法是前往菜单。 在这里,我们将选择下载 Windows 版本。 单击一下,直接转到 Docker 商店,您可以在其中下载适用于您平台的特定安装程序,如以下屏幕快照所示:
![](img/d683abc7-f74f-43a6-b21f-d817e6323905.png)
Docker 安装程序窗口
所有平台都可以在这里找到。 我们将只下载 Windows 的 MSI。 它的下载速度相对较快,将其下载到 PC 上后,只需单击 MSI 安装程序,它就会快速继续。
在 Ubuntu 上安装最好使用脚本来完成。 因此,我提供了一个示例安装脚本(`install-docker.sh`),该脚本将更新您的本地程序包管理器,以指向官方 Docker 发行版存储库,然后仅使用应用即可完成安装。
在 Linux 上安装 Docker 非常简单:只需运行我提供的`install-docker` shell 脚本即可。 软件包将更新,下载然后安装。 当结束时,只需键入`docker --help`以确保已安装所有内容:
![](img/2b2fea71-0d0d-4dd8-b2a1-befc8d3d89b0.png)
输出— docker --help 命令
现在,为了获得 GPU 支持,这将使您的 Keras 和 TensorFlow 模型运行得更快,有一个名为`nvidia-docker`的特殊版本,该版本将 Ubuntu 上的设备暴露给 Docker 容器以允许 GPU 加速。 也有一个安装脚本(`install-nvidia-docker.sh`)。 现在,假设您确实有一个真正的 NVIDIA 图形卡,则可以使用 NVIDIA Docker 代替 Docker。
在这里,我们正在运行一个使用 NVIDIA SMI 的测试命令,它实际上是一个状态程序,向您显示计算机上的 GPU 状态:
![](img/5ab08a9a-44da-427b-82ad-9bc3d7be2a57.png)
GPU 状态
您会看到,我们的 TITAN X 完全暴露于 Docker。 安装 Docker 是一个相对容易的操作。
在下一部分中,我们将研究编写 Docker 文件以建立完整的机器学习环境。
# 机器学习 Docker 文件
现在,让我们开始准备准备机器学习的 Docker 文件。 在本节中,我们将研究克隆源文件,Docker 所需的基本映像,安装其他必需的软件包,公开一个卷以便您可以共享您的工作以及公开端口以便您能够 看 Jupyter Notebooks,这是我们将用来探索机器学习的工具。
现在,您需要获取这些部分附带的源代码。 前往 [https://github.com/wballard/kerasvideo/tree/2018](https://github.com/wballard/kerasvideo/tree/2018) ,您可以在其中快速克隆存储库。 在这里,我们只是使用 GitHub for Windows 作为一种相对快速的方法来克隆该存储库,但是您可以以自己喜欢的任何方式使用 Git。 将这些文件放在哪个目录中都没有关系。 我们只是将它们下载到本地工作目录中。 然后,我们将使用此位置作为开始构建实际 Docker 容器的位置。
在克隆存储库中,查看 Docker 文件:
![](img/d746c8e5-bcc3-4053-84d1-6ad77b427a4d.png)
Docker 文件代码
这就是我们将用来创建环境的东西。 我们从具有 CUDA 和 cuDNN 驱动程序的基本 NVIDIA 映像开始,它将在将来支持 GPU。 现在,在下一部分中,我们将更新容器上的软件包管理器,以确保我们具有`git``wget`更新的图形软件包,以便能够在笔记本中绘制图表:
![](img/0c02cde9-a2be-466f-9bca-41c7743b5636.png)
Docker 文件代码
现在,我们将要安装 Anaconda Python。 我们正在从互联网上下载它,然后将其作为 shell 脚本运行,它将 Python 放置在计算机上。 完成后,我们将进行清理:
![](img/7118e8dd-bd8e-45bb-90e6-428ef1f7cd92.png)
Docker 文件代码
Anaconda 是一种方便的 Python 发行版,可用于机器学习和数据科学任务,因为它带有预构建的数学库,尤其是 Pandas,NumPy,SciPy 和 scikit-learn,它们是使用优化的 **Intel Math Kernal Libraries 构建的。** 。 这是因为,即使没有 GPU,使用 Anaconda 通常也可以获得更好的性能。 它还具有以下优点:不是以 root 身份或全局方式安装在系统下,而是安装在主目录中。 因此,您可以将其添加到现有系统上,而不必担心破坏可能依赖 Python 的系统组件,例如,在用户的`bin`中或由全局软件包管理器安装的组件。
现在,我们将在名为 Keras 的容器上设置一个用户:
![](img/a23c40c9-ff6a-44bc-81e0-3cdd81d2cbb7.png)
Docker 文件代码
当我们运行笔记本时,它们将以该用户身份运行,因此您将始终知道谁拥有文件。 并非一定要创建特定用户来设置容器,但是可以确保设置一致,这很方便。 随着将这些技术更多地与 Docker 结合使用,您可能会探索不同的基础映像,并且在这些映像上设置的那些用户目录可能与您期望的不完全相同。 例如,您可能使用其他外壳程序或具有其他主目录路径。 自行设置可保持一致。
现在,我们实际上将在我们的环境中安装`conda`
![](img/4008beb5-2409-4572-ab6d-5b20f50a5fef.png)
Docker 文件代码
这将是我们在这里使用的 Python,并且我们将在其之上安装 TensorFlow 和 Keras,以拥有一个完整的环境。 您会在这里注意到我们同时使用`conda``pip`。 因此,`conda`是 Anaconda Python 随附的软件包管理器,但是您也可以使用常规的`pip`命令添加无法作为`conda`预打包图像使用的软件包。 因此,您可以始终以这种方式混合搭配以获取所需的包装。
在最后几节中,我们将设置`VOLUME`
![](img/ab7f150b-a7e7-4143-9660-336e24bd65e8.png)
Docker 文件代码
这将允许访问计算机上的本地硬盘驱动器,以便在编辑和处理文件时文件不会在容器内丢失。 然后,我们公开了一个共享 IPython Notebook 的端口。 因此,该容器将提供端口`8888`,并在该容器上运行 IPython Notebook,然后您就可以直接从 PC 对其进行访问。
请记住,这些设置是从容器的角度来看的:当我们说`VOLUME src`时,我们真正要说的是在容器上创建一个`/src`,该容器准备从任何主机上接收金额 ,我们将在后面的部分中实际运行容器时进行操作。 然后,我们说`USER keras`:这是我们之前创建的用户。 之后,我们说`WORKDIR`,它表示当我们最终运行命令`jupyter notebook`时,将`/src`目录用作当前工作目录。 这将设置所有内容,以便我们具有一些合理的默认值。 我们正在以期望的用户身份运行,并且将要进入的目录位于我们期望运行的目录中,该命令将从 Docker 的容器中显示在网络端口上。
现在我们已经准备好 Docker 文件,让我们看一下一些安全设置以及如何与容器共享数据。
# 共享资料
在本节中,我们将研究在 Docker 容器和桌面之间共享数据。 我们将介绍一些必要的安全设置以允许访问。 然后,我们将运行自检以确保正确设置了这些安全性设置,最后,我们将运行实际的 Docker 文件。
现在,假设您已经安装并运行了 Docker,则需要从 Settings ...菜单中的可爱小鲸鱼进入 Docker 设置。 因此,转到任务栏的右下角,右键单击鲸鱼,然后选择设置...:
![](img/4a9a7551-a774-4382-948a-485731b746d5.png)
Docker 设置
为了使`VOLUME`正常工作,我们需要进行一些安全设置,以便我们的 Docker 容器可以查看我们的本地硬盘驱动器。 我从鲸鱼中弹出了此设置,我们将选择并复制稍后将使用的测试命令,然后单击“应用”:
![](img/d4adca03-e596-4f7b-9271-c4e8b349d9cd.png)
Docker 设置窗口
现在,这将弹出一个新窗口,要求您输入密码,以便我们允许 Docker 将共享驱动器映射回我们的 PC,以便可以从容器内看到我们 PC 的硬盘。 该共享位置是我们将要工作和编辑文件的位置,以便我们可以保存我们的工作。
现在我们有了从对话框中复制的命令,我们将继续将其粘贴到命令提示符中,或者您可以在要运行测试容器的位置键入它,以确保 我们的 Docker 安装程序实际上可以看到本地硬盘驱动器:
```py
C:\11519>docker run --rm -v c:/Users:/data alpine ls /data
```
因此,您可以看到,使用`-v`开关,我们说的是`c:/Users:`(实际上在本地 PC 上),然后是`/data`(实际上在容器上),即体积和[ `alpine`测试机。 您会看到,它正在下载`alpine`测试容器,然后运行`ls`命令,并且我们可以访问:
![](img/d4dc4f68-eb72-4e56-94c9-ad9ab71194cb.png)
输出— ls 命令
请注意,如果您在 Linux 上运行,则无需执行以下任何步骤; 您只需使用`sudo`运行 Docker 命令,具体取决于您实际共享的文件系统。 在这里,我们同时运行`docker``nvidia-docker`以确保我们可以访问主目录:
![](img/552dc1df-c683-4e18-bc80-f205e980d898.png)
运行 docker 和 nvidia-docker
请记住,`nvidia-docker`是 Docker 的专用版本,带有带有很好的便捷包装的插件,可从 Docker 容器中看到 Linux 安装上的本地 GPU 设备。 如果您打算使用 GPU 支持,则需要记住使用`nvidia-docker`运行它。
现在,我们实际上将使用`docker build`命令来构建容器。 我们将使用`-t`为其命名为`keras`,然后继续运行以下命令:
```py
C:\11519>docker build -t keras .
```
实际上,这将相对较快地运行,因为实际上我已经在此计算机上构建了它,并且缓存了许多文件:
![](img/db2fb676-3474-4036-a5c5-f01cdef15e6c.png)
输出-Docker 构建
请注意,但是,第一次运行可能要花费 30 分钟。
方便地,在 Linux 上构建的命令与在 Windows 上使用 Docker 的命令完全相同。 但是,如果要在 Linux 主机上使用 GPU 支持,则可以选择使用`nvidia-docker`进行构建。 那么`docker build`的作用是什么? 好吧,它将获取并执行 Docker 文件,下载软件包,创建文件系统,运行命令,然后将所有这些更改保存到虚拟文件系统中,以便以后可以重用。 每次运行 Docker 容器时,它都从运行构建时的状态开始。 这样,每次运行都是一致的。
既然我们已经运行了 Docker 容器,我们将继续到下一部分,在这里我们将使用 Jupyter Notebook 设置并运行 REST 服务。
# 机器学习 REST 服务
既然我们已经构建了 Docker 文件并使其可读,那么我们将在容器内运行 REST 服务。 在本节中,我们将研究运行 Docker 以及正确的命令行参数,REST 服务中公开的 URL,最后,我们将验证 Keras 是否已完全安装并正常运行。
现在要获得回报:实际上,我们将使用 docker run 命令运行我们的容器。 我们将在这里传递几个开关。 `-p`会告诉我们容器上的端口`8888`是我们 PC 上的端口`8888`,以及`-v`命令(我们实际上将挂载本地工作目录,这是我们克隆的位置) 来自 GitHub 的源代码)将安装到容器的卷中:
```py
C:\11519>docker run -p 8888:8888 -v C:/11519/:/src keras
```
按下*输入*,然后突然您会看到一个令牌,我们将使用该令牌来测试通过 Web 浏览器登录 IPython 容器:
![](img/d1099b20-4335-4b9b-8a07-b16860ec7e1f.png)
输出-docker run
请注意,此令牌在每次运行实例时都是唯一的,并且对于您的 PC 也会有所不同。
现在,如果您在基于 Linux 的计算机上具有 GPU,则`gpu`文件夹中将有一个单独的 Docker 文件,您可以使用该文件来构建 Docker 容器,以获得加速的 GPU 支持。 因此,正如您在此处看到的那样,我们正在构建该 Docker 容器并将其命名为`keras-gpu`
![](img/b4ab5452-f1e9-4f0d-98c8-ff420f9ad39e.png)
构建 Docker 容器
构建容器需要一些时间。 在输出中实际上没有什么需要注意的; 您只需要确保容器实际上在最后成功构建即可:
![](img/d4f08cda-260b-4a40-8115-f2ff0c3b1634.png)
构建 Docker 容器
现在,随着容器的构建,我们将继续运行它。 我们将使用`nvidia-docker`运行它,它将 GPU 设备公开到您的 Docker 容器:
```py
sudo nvidia-docker run -p 8888:8888 -v ~/kerasvideo/:/src keras-gpu
```
否则,命令行开关与实际运行直线 Keras 容器的方式相同,除了它们分别为`nvidia-docker``keras-gpu`。 现在,一旦容器启动并运行,您将获得一个 URL,然后您将使用该 URL 并将其粘贴到浏览器中以访问由该容器提供的 IPython Notebook:
![](img/d5b6f9ac-dc2a-4e2c-b394-821ece73e87f.png)
输出-在 Ubuntu 系统上运行的 docker
现在,我们将继续快速制作一个新的 IPython Notebook。 当它启动时,我们将`import keras`,确保它加载,然后花一秒钟才能出现:
![](img/3a6fd76f-d86e-4e82-ac86-aa574a8609c7.png)
硬载
然后,我们将使用以下使用 TensorFlow 的代码来检测 GPU 支持:
```py
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
```
因此,我们将运行前面的代码,以查看库和设备:
![](img/76f54892-d490-4c83-87cc-d5510f735bb2.png)
检测库和设备
现在,我们可以看到`GPU`
转到我们的 Web 浏览器,继续并粘贴该 URL 并转到:
![](img/3e1688cd-d7ab-40b9-82fe-5e5a59e41d82.png)
浏览器窗口(lacalhost)
糟糕! 由于`0.0.0.0`不是真实的计算机,因此无法达到; 我们将其切换为`localhost`,点击*输入*,然后确定我们有一个 IPython Notebook:
![](img/86137a83-e41c-4ca7-b6a7-d8756db60446.png)
IPython 笔记本
我们将继续创建一个新的 Python 3 Notebook,并通过查看是否可以导入`keras`库并确保一切正常来对其进行快速测试。
看起来我们都准备好了。 我们的 TensorFlow 后端很不错!
这是我们将在本书中运行的环境:充分准备并准备就绪的 Docker 容器,因此您需要做的就是启动它,运行它,然后与内部托管的 Keras 和 IPython Notebooks 一起使用。 这样您每次都可以拥有一个轻松,可重复的环境。
# 概要
在本章中,我们研究了如何安装 Docker,包括从 [https://www.docker.com/](https://www.docker.com/) 获取它,设置机器学习 Docker 文件,与主机共享数据回传。 ,然后最后,运行 REST 服务以提供我们将在本书中使用的环境。
在下一章中,我们将深入研究并开始查看实际数据。 然后,我们将从了解如何获取图像数据并准备将其用于机器学习模型开始。
\ No newline at end of file
# 图片资料
在上一章中,我们准备了机器学习工具包,在其中设置了 Keras 和 Docker,以便允许我们运行 Jupyter Notebooks 处理机器学习。
在本章中,我们将研究准备供机器学习使用的图像数据,以及将其连接到 Keras 中涉及的步骤。 我们将从了解 MNIST 数字开始。 这些是图像形式的手写字符,我们将在机器学习中有效执行**光学字符识别****OCR** )。 然后,我们将讨论张量。 张量听起来像是一个数学词,的确是,但是作为一名程序员,您已经看到了多维数组,因此您实际上已经在使用张量,我将向您展示其等效性。 之后,我们将图像转换为张量。 正如您习惯在计算机上看到图像一样,图像需要一种特殊的编码形式才能与机器学习一起使用。
然后,我们将转向类别; 在这种情况下,我们将使用零到九(这是单个数字的字符),并将它们变成类别标签。 最后,我们将进行回顾,并且我将向您展示一本有关如何为机器学习准备数据时如何思考数据的食谱。
# MNIST 数字
现在,让我们了解 MNIST 数字。 在本节中,我们将介绍为帮助我们了解如何处理图像数据而准备的`ImageData`笔记本; 下载并获取 MNIST 数字; 将图像视为原始数字; 最后,根据此数值数据可视化实际图像。
我们将要使用的代码包含在 IPython Notebook 中。 这是我们设置容器的方式,因此您将像在设置机器学习工具包最后提到的那样运行容器。 我还准备了要使用的`ImageData` IPython Notebook。 我们将首先导入所有必需的软件包,然后打开 Matplotlib 以便自动进行绘图。 这意味着当我们显示图像时,我们不必调用`.plot`; 会自动为我们完成:
![](img/47fe23e8-1eae-4c41-af2d-61c998729f07.png)
导入包
Keras 实际上具有内置的 MNIST 数字作为数据集,因此我们将使用这种便利并继续进行加载。
您需要互联网连接,因为它将要从 Amazon S3 作为文件下载这些文件。
在加载数据时,将有一个 Python 元组,我们将把 iPn 解压缩为两组:**训练集****测试集**
![](img/953f412b-59a2-4a70-80de-26659d048c70.png)
Python 元组
实际上,在机器学习中,将数据分为多个部分是很常见的约定。 您使用它来查看您的模型实际上是在使用训练集进行学习。 然后,您可以使用测试集来确保模型不会过度拟合,这实际上是在考虑模型是存储训练数据还是在实际学习中。
现在,让我们看一下带有 NumPy 格式选项的快速设置。 当我们打印出数组时,我们将图像作为数组的数组循环遍历,然后打印出数据。 如您所见,图像实际上只是从`0``255`的数字:
![](img/213de250-d5a3-4f9d-a422-b174f0023834.png)
灰度图像(数组数组)
这是灰度图像,此处的每个整数都记录特定像素的暗度。
现在,让我们绘制图像并查看这些数字的真实外观。 Matplotlib 有一个简单的`plot`函数,您可以提供一个数组数组,或者基本上是 *XY* 像素的二维数组,并将其绘制为`.image`文件。 接下来,您可以看到看起来非常像零的东西:
![](img/5aa1e337-2e5a-47a5-9607-586dafb2cf46.png)
绘制图像
# 张量–多维数组
现在,我们已经了解了一些 MNIST 数字,我们将花一些时间看一看张量以及张量是什么。 我们将要看一看多维数组的 NumPy。 多维数组也称为**张量**。 数学词汇可能会让人有些不知所措,但我们将向您展示它比您想象的要简单得多。 然后,我们来看看张量形状。 张量形状实际上是维度的数量,或者就数组而言,是用于访问它们的不同索引的数量。 最后,我们将研究数据类型。 张量或多维数组可以容纳各种各样的不同数据类型,我们将解释其中的一些区别。
让我们从基础开始。 您可以想象的最基本的张量是一个张量,在编程语言中该张量仅称为数组。 它只是一个打包在一起的有序数字序列。 接下来是两个张量。 如果查看*灰度图像(阵列的数组)*屏幕截图,则每一行都是一维的,而每一列是另一维的。
因此,一行一行地加起来就是两个张量。 同样,它只是一个数组数组。 您会看到其中的训练图像的括号为零; 我们实际上是在选择图像数组中的第一个图像。 因此,在图像数据之前的三个张量实际上是图像阵列,每个图像阵列都有像素的列和行。 因此,三张量是我们存储黑白图像的基本方法。
为了快速直观地显示图像,您可以在索引 1 处看到 *Xs**Ys* (数字上显示的坐标)仅是 张量
![](img/46dafe66-282c-47a7-90c8-0478b65229a4.png)
张量的尺寸
现在,让我们谈谈形状。 您可以在此处看到我们在 NumPy 多维数组或张量上调用了`.shape`,它随`60000, 28, 28`一起返回:
![](img/abb0ea3a-4467-4f88-91dd-b4f06affe366.png)
呼叫.shape
这是构成我们的三个张量的三个维度。 它只是一个多维数组。 然后,当然是数据类型,即`dtype`,就像您在 NumPy 多维数组上在这里所说的那样。 您可以看到这些图像存储为`uint8`或 8 位整数,以记录`0``255`值。 好吧,我们经常将这种数据类型用于源数据,特别是对于像前一个图像一样的黑白图像。 当我们将其转换为实际的机器学习格式时,我们将使用浮点数。
# 将图像转变为张量
在上一节中,我们了解了张量是什么。 现在,我们将使用这些知识来准备图像数据作为机器学习的张量。 首先,我们会问一个问题:为什么要使用浮点数据? 然后,我们将了解样本与样本末尾数据点之间的差异。 最后,我们将规范化数据以用于机器学习。
那么,为什么要浮点数呢? 好吧,真正的原因是机器学习从根本上讲是一个数学优化问题,当我们使用浮点数时,计算机正在尝试优化一系列数学关系以找到可以预测输出的学习功能。 因此,为机器学习准备数据确实需要将正常的二进制数据(例如图像)重新格式化为一系列浮点数,这不是我们通常在图像处理方面处理图像的方式,但这是必需的 为了让机器学习算法参与其中。
现在,让我们谈谈样本。 按照惯例,样本始终是多维数据数组中的第一维。 在这里,我们有多个样本,因为机器学习从根本上来说是通过查看大量不同样本中的大量不同数据点,然后学习基于此预测结果的函数来进行的。
因此,`train_images`多维数组中的每个图像都是我们要查看的样本之一。 但是,正如您在*灰度图像(阵列数组)*屏幕截图中所看到的那样,我们现在拥有的样本绝对不是浮点数; 这些仍然是 8 位整数。
因此,我们必须想出一种原理性的方法将图像从 8 位转换为浮点。
现在,我们将开始通过查看规范化来研究为机器学习准备数据的实际需求。 这实际上意味着您要获取数据(在这种情况下,它是`0``255`范围内的数字),然后将其除以另一个数字,以便缩小从`0``1`的范围 ]:
![](img/ce356208-79d9-45c5-af02-bc9f77b7cf76.png)
归一化输出
这对于机器学习算法中的数值稳定性是必需的。 当您的数据在`0``1`的范围内进行标准化时,它们只会做得更好,收敛更快,并且变得更加准确。
就是这样! 我们已经看到了如何处理输入数据。 需要记住的两件事:我们将把所有东西都变成浮点数,最好是将`0``1`范围内的数据标准化。
# 将类别转化为张量
在上一节中,我们研究了将图像转换为用于机器学习的张量,在本节中,我们将研究将输出值(类别)转换为用于机器学习的张量。
我们将介绍输​​出类,即进行离散预测的含义,即一键编码的概念; 然后我们将可视化一幅热编码的图像形象化,然后回顾一下数据准备手册,您应该使用它来处理各种图像数据以进行机器学习。
但是现在,让我们谈谈输出。 当我们谈论数字时,从`0``9`,所以有十个不同的类,不是面向对象的类,而是标签的类。 现在,这些标签从`0``9`作为单独的数字,我们要进行的预测需要是离散的。 预测 *1.5* 对我们没有任何好处,因为没有这样的数字字符:
![](img/94d95ea1-3af8-40d5-966e-7b100103a840.png)
o 到 9 个预测
因此,为此,我们将使用数据转换技巧。 这种事情称为“一次热编码”,在这里您可以获取一系列标签可能性,在这种情况下,将数字`0``9`转换为一种位图,其中每个选项都编码为 一列,并且对于每个给定的数据样本,只有一列设置为`1`(因此为一热):
![](img/d8a1f493-a432-4a27-8247-bfd255324106.png)
一键编码
现在,既查看输入数字(此处为`9`),又查看输出位图,您可以看到第四个索引设置了第九个位,您可以看到我们在此处进行数据准备的工作是 将一个图像作为输入,将另一个图像作为输出。 它们只是被编码为张量(浮点数的多维数组):
![](img/4775c1e4-c69e-4b7c-9aca-21dc65a8e371.png)
输出位图
创建机器学习算法时,我们要做的是让计算机学习或发现将一个图像(数字 9)转换为另一图像(在第 9 列上设置一位的位图)的功能, 这就是我们所说的机器学习。 请记住,张量只是多维数组, *x**y* 值只是像素。 我们对这些值进行归一化,这意味着我们将它们从零到一的范围中获取,以便它们在机器学习算法中很有用。 标签或输出类只是我们要映射的值的数组,并且我们将使用单热编码对这些值进行编码,这又意味着只有一个是热的或设置为一个。
# 概要
在本章中,我们了解了 MNIST 数字,以及如何获取它们。 张量实际上只是多维数组; 我们如何将图像数据编码为张量; 我们如何将分类或分类数据编码为张量; 然后我们进行了快速回顾,并采用了食谱的方法来考虑尺寸和张量,以获取用于机器学习的数据。
现在,我们已经学习了如何为机器学习设置输入和输出数据,我们将继续下一章,在该章中,我们将创建一个**经典神经网络****CNN** )。
\ No newline at end of file
此差异已折叠。
# 前言
*使用 Python 进行动手元学习*解释了元学习的基础知识,并帮助您了解学习学习的概念。 您将经历各种一次性学习算法,例如暹罗,原型,关系和内存增强网络,并在 TensorFlow 和 Keras 中实现它们。 您还将了解最新的元学习算法,例如与模型无关的元学习(MAML),爬行动物和通过元学习进行快速上下文适应(CAML)。 然后,您将探索如何使用 meta-SGD 快速学习,并发现如何使用元学习进行无监督学习。
# 这本书是给谁的
本书将帮助希望学习元学习作为训练机器学习模型的高级方法的机器学习爱好者,人工智能研究人员和数据科学家。 本书假定您具备有关机器学习概念的实用知识和对 Python 编程的全面了解。
# 充分利用这本书
本书需要以下软件:
* 蟒蛇
* 水蟒
* TensorFlow
*
# 下载示例代码文件
您可以从 [www.packt.com](http://www.packt.com) 的帐户中下载本书的示例代码文件。 如果您在其他地方购买了此书,则可以访问 [www.packt.com/support](http://www.packt.com/support) 并注册以将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
1. 登录或注册 [www.packt.com](http://www.packt.com)
2. 选择支持选项卡。
3. 单击代码下载和勘误。
4. 在搜索框中输入书籍的名称,然后按照屏幕上的说明进行操作。
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
本书的代码包也托管在 GitHub 上 [https://github.com/PacktPublishing/Hands-On-Meta-Learning-with-Python](https://github.com/PacktPublishing/Hands-On-Meta-Learning-with-Python) 。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
我们还有丰富的书籍和视频目录中的其他代码包,可通过 **[https://github.com/PacktPublishing/](https://github.com/PacktPublishing/)** 获得。 去看一下!
# 使用约定
本书中使用了许多文本约定。
`CodeInText`:指示文本,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,虚拟 URL,用户输入和 Twitter 句柄中的代码字。 这是一个示例:“ `read_image`函数将图像作为输入并返回一个 NumPy 数组。”
代码块设置如下:
```py
import re
import numpy as np
from PIL import Image
```
**粗体**:表示新术语,重要单词或您在屏幕上看到的单词。
警告或重要提示如下所示。
提示和技巧如下所示。
# 保持联系
始终欢迎读者的反馈。
**一般反馈**:如果您对本书的任何方面都有疑问,请在您的信息主题中提及书名,然后通过`customercare@packtpub.com`向我们发送电子邮件。
**勘误表**:尽管我们已尽一切努力确保内容的准确性,但还是会发生错误。 如果您在这本书中发现错误,请向我们报告,我们将不胜感激。 请访问 [www.packt.com/submit-errata](http://www.packt.com/submit-errata) ,选择您的书籍,点击勘误提交表格链接,然后输入详细信息。
**盗版**:如果您在互联网上以任何形式看到我们的作品的任何非法副本,请向我们提供位置地址或网站名称,我们将不胜感激。 请通过`copyright@packt.com`与我们联系,并提供材料链接。
**如果您有兴趣成为作家**:如果您有一个专业的话题并且对写作或撰写书籍感兴趣,请访问 [authors.packtpub.com](http://authors.packtpub.com/) ]。
# 评论
请留下评论。 阅读和使用本书后,为什么不在您购买本书的网站上留下评论? 然后,潜在的读者可以查看并使用您的公正意见做出购买决定,Packt 的我们可以了解您对我们产品的看法,我们的作者可以在书中看到您的反馈。 谢谢!
有关 Packt 的更多信息,请访问 [packt.com](http://www.packt.com/)
\ No newline at end of file
# 元学习导论
元学习是当前人工智能领域最有前途和趋势的研究领域之一。 它被认为是获得**人工智能****AGI** )的垫脚石。 在本章中,我们将了解什么是元学习以及为什么元学习是当前人工智能中最令人振奋的研究。 我们将了解什么是少拍,单拍和零拍学习,以及如何在元学习中使用它。 我们还将学习不同类型的元学习技术。 然后,我们将探索学习通过梯度下降学习梯度下降的概念,其中我们了解如何使用元学习器来学习梯度下降优化。 继续进行,我们还将学习优化作为几次学习的模型,我们将了解如何在几次学习设置中将元学习器用作优化算法。
在本章中,您将了解以下内容:
* 元学习
* 元学习和少拍
* 元学习的类型
* 学习通过梯度下降学习梯度下降
* 优化作为快速学习的模型
# 元学习
目前,元学习是 AI 领域中令人振奋的研究领域。 凭借大量的研究论文和进步,元学习显然在 AI 领域取得了重大突破。 在进行元学习之前,让我们看看我们当前的 AI 模型是如何工作的。
近年来,借助强大的算法(如生成对抗网络和胶囊网络),深度学习取得了飞速的发展。 但是深度神经网络的问题在于,我们需要拥有大量的训练集来训练我们的模型,而当我们只有很少的数据点时,它将突然失败。 假设我们训练了一个深度学习模型来执行任务 *A* 。 现在,当我们有一个新任务 *B,**A* 密切相关时,我们不能使用相同的模型。 我们需要从头开始为任务 *B* 训练模型。 因此,对于每项任务,我们都需要从头开始训练模型,尽管它们可能是相关的。
深度学习真的是真正的 AI 吗? 好吧,不是。 人类如何学习? 我们将学习概括为多个概念并从中学习。 但是当前的学习算法仅能完成一项任务。 这就是元学习的用武之地。元学习产生了一个通用的 AI 模型,该模型可以学习执行各种任务,而无需从头开始进行培训。 我们使用很少的数据点在各种相关任务上训练我们的元学习模型,因此对于新的相关任务,它可以利用从先前任务中获得的学习知识,而不必从头开始进行训练。 许多研究人员和科学家认为,元学习可以使我们更接近实现 AGI。 在接下来的部分中,我们将确切学习元学习模型如何学习学习过程。
# 元学习和少拍
从较少的数据点中学习称为**少镜头学习****k** **-镜头学习**,其中 *k* 表示每个数据点的数量 数据集中的类。 假设我们正在对猫和狗进行图像分类。 如果我们正好有一只狗和一只猫的图像,那么它被称为**单次学习**,也就是说,我们每个班级仅从一个数据点开始学习。 如果我们有 10 张狗的图像和 10 张猫的图像,则称为 10 次学习。 因此, *k-* 镜头学习中的 *k* 意味着每个班级都有许多数据点。 还有**零击学习**,每个班级没有任何数据点。 等待。 什么? 根本没有数据点时,我们如何学习? 在这种情况下,我们将没有数据点,但是将获得有关每个类的元信息,并且将从元信息中学习。 由于我们的数据集中有两个类别,即狗和猫,因此可以将其称为双向学习 *k* -shot learning; 因此 *n* -way 表示我们在数据集中拥有的类的数量。
为了使我们的模型从一些数据点中学习,我们将以相同的方式对其进行训练。 因此,当我们有一个数据集 *D* 时,我们从数据集中存在的每个类中采样一些数据点,并将其称为**支持集。** 同样,我们从每个类中采样一些不同的数据点,并将其称为**查询集。** 因此,我们使用支持集训练模型,并使用查询集进行测试。 我们以**情节形式**训练模型-也就是说,在每个情节中,我们从数据集中 *D* 中采样一些数据点,准备支持集和查询集,然后进行训练 在支持集上并在查询集上进行测试。 因此,在一系列情节中,我们的模型将学习如何从较小的数据集中学习。 我们将在接下来的章节中对此进行更详细的探讨。
# 元学习的类型
从找到最佳权重集到学习优化器,可以通过多种方式对元学习进行分类。 我们将元学习分为以下三类:
* 学习度量空间
* 学习初始化
* 学习优化器
# 学习度量空间
在基于度量的元学习设置中,我们将学习适当的度量空间。 假设我们要学习两个图像之间的相似性。 在基于度量的设置中,我们使用一个简单的神经网络从两个图像中提取特征,并通过计算这两个图像的特征之间的距离来找到相似性。 这种方法广泛用于我们没有很多数据点的几次学习设置中。 在接下来的章节中,我们将学习基于度量的学习算法,例如暹罗网络,原型网络和关系网络。
# 学习初始化
在这种方法中,我们尝试学习最佳的初始参数值。 那是什么意思? 假设我们正在建立一个神经网络来对图像进行分类。 首先,我们初始化随机权重,计算损失,并通过梯度下降使损失最小化。 因此,我们将通过梯度下降找到最佳权重,并将损失降到最低。 代替随机初始化权重,如果我们可以使用最佳值或接近最佳值来初始化权重,那么我们可以更快地达到收敛,并且可以很快学习。 在接下来的章节中,我们将看到如何使用 MAML,Reptile 和 Meta-SGD 等算法精确找到这些最佳初始权重。
# 学习优化器
在这种方法中,我们尝试学习优化器。 我们通常如何优化神经网络? 我们通过在大型数据集上进行训练来优化神经网络,并使用梯度下降来最大程度地减少损失。 但是在少数学习设置中,梯度下降失败了,因为我们将拥有较小的数据集。 因此,在这种情况下,我们将学习优化器本身。 我们将有两个网络:一个实际尝试学习的基础网络和一个优化该基础网络的元网络。 在接下来的部分中,我们将探讨其工作原理。
# 学习通过梯度下降学习梯度下降
现在,我们将看到一种有趣的元学习算法,称为学习通过梯度下降学习梯度下降。 这个名字不是很令人生畏吗? 好吧,事实上,它是最简单的元学习算法之一。 我们知道,在元学习中,我们的目标是学习学习过程。 通常,我们如何训练神经网络? 我们通过计算损耗并通过梯度下降使损耗最小化来训练我们的网络。 因此,我们使用梯度下降来优化模型。 除了使用梯度下降,我们还能自动学习此优化过程吗?
但是我们如何学习呢? 我们用**递归神经网络****RNN** )取代了传统的优化器(梯度下降)。 但这如何工作? 如何用 RNN 代替梯度下降? 如果您仔细研究,我们在梯度下降中到底在做什么? 这基本上是从输出层到输入层的一系列更新,我们将这些更新存储在一个状态中。 因此,我们可以使用 RNN 并将更新存储在 RNN 单元中。
因此,该算法的主要思想是用 RNN 代替梯度下降。 但是问题是 RNN 如何学习? 我们如何优化 RNN? 为了优化 RNN,我们使用梯度下降。 **因此,简而言之,我们正在学习通过 RNN 执行梯度下降,并且 RNN 通过梯度下降进行了优化,这就是所谓的通过梯度下降学习梯度下降的名称。**
我们称我们的 RNN 为优化器,而将我们的基础网络称为优化器。 假设我们有一个由某些参数![](img/d977197b-bc6b-4c10-89f4-54c623c725a1.png)参数化的模型![](img/0c517098-647d-4ca0-ac3d-7fa4d8a24960.png)。 我们需要找到最佳参数![](img/d977197b-bc6b-4c10-89f4-54c623c725a1.png),以使损失最小化。 通常,我们通过梯度下降找到最佳参数,但是现在我们使用 RNN 来找到最佳参数。 因此,RNN(优化器)找到最佳参数,并将其发送到最优化(基础网络); 优化器使用此参数,计算损耗,然后将损耗发送到 RNN。 基于损失,RNN 通过梯度下降进行优化,并更新模型参数![](img/d977197b-bc6b-4c10-89f4-54c623c725a1.png)
令人困惑? 查看下图:通过优化器(RNN)优化了我们的 Optimize(基础网络)。 优化器将更新后的参数(即权重)发送给优化器,优化器使用这些权重,计算损失,然后将损失发送给优化器。 基于损失,优化器通过梯度下降改进自身:
![](img/9f81568a-aa91-42da-9445-355a7279ccbe.png)
假设我们的基础网络(优化器)由![](img/885a1299-c4f7-4f28-8b13-22b3d7961f2e.png)参数化,而我们的 RNN(优化器)由![](img/a4d86187-9c2d-4292-bda6-f3945a84fb8a.png)参数化。 优化器的损失函数是什么? 我们知道优化器的作用(RNN)是减少优化器(基础网络)的损失。 因此,优化器的损失是优化器的平均损失,可以表示为:
![](img/25b67e65-f3f2-410c-b94a-b636df9c41d3.png)
我们如何最小化这种损失? 通过找到正确的![](img/80a2e944-a5c1-41ff-9496-8f480a4c56fd.png),我们可以通过梯度下降使这种损失最小化。 好的,RNN 作为输入是什么,它将返回什么输出? 我们的优化器,即我们的 RNN,将优化器![](img/4f8608fc-f668-47f7-9e97-2117abf2ea0b.png)的梯度及其先前状态![](img/ac5f4c12-536b-4664-933d-3722833fe8a3.png)作为输入,并返回输出,即更新![](img/8bd6976c-1694-407c-be6f-fb374967fd10.png),该更新可将优化器的损失降到最低。 让我们用函数![](img/7ed63f5f-fabf-417c-b75d-966cfe502087.png)表示我们的 RNN:
![](img/7a5aea0c-8589-449e-aff9-3de1ef89f109.png)
在前面的公式中,适用以下条件:
* ![](img/4f8608fc-f668-47f7-9e97-2117abf2ea0b.png)是我们模型(优化程序)![](img/378cfd1c-d7d4-4069-b25b-2e7503226f6e.png)的梯度,即![](img/cd134edf-738b-4ee1-b907-7a1eaff6a4cf.png)
* ![](img/ac5f4c12-536b-4664-933d-3722833fe8a3.png)是 RNN 的隐藏状态
* ![](img/284d068b-ee06-4e80-814a-8bdd6b082ffe.png)是 RNN 的参数
* 输出![](img/8bd6976c-1694-407c-be6f-fb374967fd10.png)和![](img/355e3caa-20f9-4743-b7a4-e7577a7c3392.png)分别是 RNN 的更新和下一个状态
因此,我们使用![](img/87eef6f8-65e0-47ea-ae13-ab5c09919322.png)更新了模型参数值。
如下图所示,我们的优化器![](img/03b25ae6-ed75-49ff-9ed3-b03f6c6111ce.png)每次 *t* 处于隐藏状态![](img/9c3e7306-ddd7-46e6-884e-fc2f610ae3d2.png),并且梯度![](img/451f86c5-2616-486f-95ee-bd434c6db4b3.png)作为![](img/55357743-14b7-478c-962b-ff8d1cec3e78.png)作为输入,计算![](img/c870b0b2-dbf7-46f8-b8f1-22a19f18c7a5.png)并将其发送到我们的优化器,然后在其中添加![](img/8cd0cc05-b03f-444a-8fff-faf4386945d7.png),并在接下来的时间步骤中成为![](img/7fe07d7c-0ce0-4e6a-b591-38154d096708.png)进行更新:
![](img/b450d276-d3ef-408a-9a7d-aa3177d40e9c.png)
因此,通过这种方式,我们通过梯度下降学习梯度下降优化。
# 优化作为快速学习的模型
我们知道,在几次射击学习中,我们从较少的数据点中学习,但是如何在几次射击学习环境中应用梯度下降呢? 在几次学习设置中,由于数据点很少,梯度下降突然失败。 梯度下降优化需要更多的数据点才能达到收敛并最大程度地减少损失。 因此,我们需要在少数情况下获得更好的优化技术。 假设我们有一个由某些参数![](img/364e3568-1fbb-41f8-8d8c-999265c2f89e.png)参数化的![](img/cea75dd3-1019-4c21-825e-a86df721232e.png)模型。 我们使用一些随机值初始化此参数![](img/01bd32d9-bc52-4499-960a-27c4002365cf.png),并尝试使用梯度下降法找到最佳值。 让我们回想一下梯度下降的更新方程:
![](img/deada297-d555-46fb-b0c7-97c407cb09cb.png)
在前面的公式中,适用以下条件:
* ![](img/bcf5dedb-c2a9-4a46-bd8e-f53ec19a38b1.png)是更新的参数
* ![](img/c3188ea2-a560-4a2f-b1d6-2e284f34f371.png)是上一个时间步的参数值
* ![](img/8f90888c-ac0a-43e6-9142-e8c6d23f1f3e.png)是学习率
* ![](img/765c42de-ae58-49ad-a369-41bbc31dd759.png)是损失函数相对于![](img/8bb4ef33-679c-4959-8c0c-fd81684142d2.png)的梯度
梯度下降的更新方程看起来不熟悉吗? 是的,您猜对了:它类似于 LSTM 的单元状态更新方程式,可以这样写:
![](img/0505be09-05c7-41b6-8169-7e5bd4adc106.png)
我们可以将 LSTM 单元更新方程与梯度下降完全相关,例如![](img/47591f1c-ae9c-4da5-ad57-d2c65619eb28.png) = 1,则适用以下条件:
![](img/84ce23d1-91dd-4b99-ade2-f6702fb55e1c.png)
![](img/d29f498d-094a-4516-939f-09af6c9e9287.png)
![](img/24750401-81a6-4f3f-9b3e-60ef2017b393.png)
因此,我们可以使用 LSTM 作为优化器,而不是在少数学习机制中使用梯度下降作为优化器。 我们的元学习者是 LSTM,它学习用于训练模型的更新规则。 因此,我们使用两个网络:一个是我们的基础学习者,它学习执行任务,另一个是元学习者,它试图找到最佳参数。 但这如何工作?
我们知道,在 LSTM 中,我们使用了一个“忘记门”来丢弃内存中不需要的信息,它可以表示为:
![](img/884773a0-e60d-4404-9177-6fe069a63c92.png)
这个忘记门在我们的优化设置中如何发挥作用? 假设我们处于损耗高的位置,并且梯度接近零。 我们如何摆脱这个位置? 在这种情况下,我们可以缩小模型的参数,而忽略其先前值的某些部分。 因此,我们可以使用我们的忘记门做到这一点,它将当前参数值![](img/b61b56ff-e745-4c19-9920-8ad592f932a8.png),电流损耗![](img/fcd508aa-be72-4b3b-8679-f334163f75d2.png),电流梯度![](img/d93f071a-baca-4701-a998-b518ee5f39d1.png)和先前的忘记门作为输入; 它可以表示如下:
![](img/38abac4c-e8fb-4232-95c4-7ae6be154f71.png)
现在让我们进入输入门。 我们知道,LSTM 中的输入门用于确定要更新的值,它可以表示为:
![](img/f0af6369-c82e-453e-9c76-c72c259525d3.png)
在几次学习设置中,我们可以使用此输入门来调整学习速度,以快速学习,同时防止出现差异:
![](img/60110071-3fb1-471e-9b9c-8fc73797e836.png)
因此,我们的元学习者经过几次更新后即可学习![](img/e58f947b-d9ce-46b7-8704-0923b21e27f7.png)和![](img/d766f53c-e3b3-42ac-9852-4174a782fd96.png)的最佳值。
但是,这如何工作?
假设我们有一个由![](img/46fb0ba6-818f-4315-926b-6c5502f897fa.png)参数化的基础网络![](img/96e5a664-2281-469b-bc8c-3a93da8a4d8a.png)和由![](img/6b477c6b-dca3-4a40-8c43-bf844d4acf51.png)参数化的 LSTM 元学习器![](img/781fbd22-771e-4aab-ae43-36cb517b8b74.png)。 假设我们有一个数据集![](img/3a868eff-e1e0-4800-b315-c3d89407a051.png)。 我们将数据集分为![](img/8ea53b48-98b0-4abc-ab06-ee1020fbbb7c.png)和![](img/7a42e349-bf47-41c9-a4e6-7295534d7473.png)分别进行训练和测试。 首先,我们随机初始化元学习器参数![](img/7f6407d1-42b8-4442-80e9-f09b2e884040.png)
对于某些 *T* 迭代次数,我们从![](img/8ea53b48-98b0-4abc-ab06-ee1020fbbb7c.png)中随机采样数据点,计算损失,然后相对于模型参数![](img/e3edc475-656e-4d41-bf0b-1a51a6078d03.png)计算损失的梯度。 现在,我们将此梯度,损失和元学习器参数![](img/4593a096-0a79-40bf-9e2a-2116c6d24062.png)输入到我们的元学习器。 我们的元学习器![](img/2a1edc09-a4d0-4fe1-8ec8-ecc85fc2356a.png)将返回单元状态![](img/28a759a2-3729-4b33-871c-d3be31207596.png),然后我们将 *t* 的基础网络![](img/96e5a664-2281-469b-bc8c-3a93da8a4d8a.png)参数![](img/f17b6173-5f5b-467f-b3ed-5255f61ba7d4.png)更新为![](img/ade55668-74fb-4aaa-b834-8f66ee022488.png)。 我们重复 *N* 次,如下图所示:
![](img/c85a3a23-876b-46aa-a6c1-6a2b664e0c2a.png)
因此,在 *T* 次迭代之后,我们将获得一个最佳参数![](img/a864b10a-01ce-4acf-aa4a-2fbc72a0441e.png)。 但是,我们如何检查![](img/1e7893f9-7981-46e3-aac3-625c5d712452.png)的性能以及如何更新元学习器参数? 我们采用测试集,并使用参数![](img/0b771654-d8fb-4b8f-8363-29c51d27d162.png)计算测试集的损耗。 然后,我们根据元学习器参数![](img/6b477c6b-dca3-4a40-8c43-bf844d4acf51.png)计算损耗的梯度,然后更新![](img/6b477c6b-dca3-4a40-8c43-bf844d4acf51.png),如下所示:
![](img/7e4c2e2a-1fe8-47fe-ba23-096cf093cdc4.png)
我们对 n 个迭代进行此操作,并更新了元学习器。 总体算法如下所示:
![](img/d1c6ebed-3fa7-4963-b40f-d5c562899c7c.png)
# 概要
我们首先了解了元学习是什么,以及元学习中如何使用单发,少发和零发学习。 我们了解到,支持集和查询集更像是火车集和测试集,但每个类中都有 *k* 个数据点。 我们还看到了 *n* -方式 k 射击的含义。 后来,我们了解了不同类型的元学习技术。 然后,我们探索了通过梯度下降学习梯度下降的学习方法,其中我们看到了 RNN 如何用作优化器来优化基础网络。 后来,我们将优化视为快速学习的模型,其中我们使用 LSTM 作为元学习器,以在快速学习环境中进行优化。
在下一章中,我们将学习称为 Siamese 网络的基于度量的元学习算法,并且将了解如何使用 Siamese 网络执行面部和音频识别。
# 问题
1. 什么是元学习?
2. 什么是少拍学习?
3. 什么是支持集?
4. 什么是查询集?
5. 基于度量的学习称为什么?
6. 我们如何进行元学习培训?
# 进一步阅读
* 学习通过梯度下降学习梯度下降: [https://arxiv.org/pdf/1606.04474.pdf](https://arxiv.org/pdf/1606.04474.pdf)
* 优化作为少量学习设置的模型: [https://openreview.net/pdf?id=rJY0-Kcll](https://openreview.net/pdf?id=rJY0-Kcll)
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册