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

2020-12-23 21:36:55

上级 16819c2d
......@@ -44,9 +44,9 @@ TensorFlow 是 Google 流行的机器学习和深度学习产品。 它已迅速
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
* 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)。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
......
......@@ -25,7 +25,7 @@ Docker 安装程序窗口
![](img/2b2fea71-0d0d-4dd8-b2a1-befc8d3d89b0.png)
输出— docker --help 命令
`docker --help`命令的输出
现在,为了获得 GPU 支持,这将使您的 Keras 和 TensorFlow 模型运行得更快,有一个名为`nvidia-docker`的特殊版本,该版本将 Ubuntu 上的设备暴露给 Docker 容器以允许 GPU 加速。 也有一个安装脚本(`install-nvidia-docker.sh`)。 现在,假设您确实有一个真正的 NVIDIA 图形卡,则可以使用 NVIDIA Docker 代替 Docker。
......@@ -87,7 +87,7 @@ Docker 文件代码
Docker 文件代码
这将允许访问计算机上的本地硬盘驱动器,以便在编辑和处理文件时文件不会在容器内丢失。 然后,我们公开了一个共享 IPython Notebook 的端口。 因此,该容器将提供端口`8888`,并在该容器上运行 IPython Notebook,然后您就可以直接从 PC 对其进行访问。
这将允许访问计算机上的本地硬盘驱动器,以便在编辑和处理文件时文件不会在容器内丢失。 然后,我们公开了一个共享 IPython 笔记本的端口。 因此,该容器将提供端口`8888`,并在该容器上运行 IPython 笔记本,然后您就可以直接从 PC 对其进行访问。
请记住,这些设置是从容器的角度来看的:当我们说`VOLUME src`时,我们真正要说的是在容器上创建一个`/src`,该容器准备从任何主机上接收金额 ,我们将在后面的部分中实际运行容器时进行操作。 然后,我们说`USER keras`:这是我们之前创建的用户。 之后,我们说`WORKDIR`,它表示当我们最终运行命令`jupyter notebook`时,将`/src`目录用作当前工作目录。 这将设置所有内容,以便我们具有一些合理的默认值。 我们正在以期望的用户身份运行,并且将要进入的目录位于我们期望运行的目录中,该命令将从 Docker 的容器中显示在网络端口上。
......@@ -97,7 +97,7 @@ Docker 文件代码
在本节中,我们将研究在 Docker 容器和桌面之间共享数据。 我们将介绍一些必要的安全设置以允许访问。 然后,我们将运行自检以确保正确设置了这些安全性设置,最后,我们将运行实际的 Docker 文件。
现在,假设您已经安装并运行了 Docker,则需要从 Settings ...菜单中的可爱小鲸鱼进入 Docker 设置。 因此,转到任务栏的右下角,右键单击鲸鱼,然后选择设置...
现在,假设您已经安装并运行了 Docker,则需要从“设置...”菜单中的可爱小鲸鱼进入 Docker 设置。 因此,转到任务栏的右下角,右键单击鲸鱼,然后选择“设置...”
![](img/4a9a7551-a774-4382-948a-485731b746d5.png)
......@@ -121,13 +121,13 @@ C:\11519>docker run --rm -v c:/Users:/data alpine ls /data
![](img/d4dc4f68-eb72-4e56-94c9-ad9ab71194cb.png)
输出— ls 命令
`ls`命令的输出
请注意,如果您在 Linux 上运行,则无需执行以下任何步骤; 您只需使用`sudo`运行 Docker 命令,具体取决于您实际共享的文件系统。 在这里,我们同时运行`docker``nvidia-docker`以确保我们可以访问主目录:
![](img/552dc1df-c683-4e18-bc80-f205e980d898.png)
运行 docker 和 nvidia-docker
运行 docker 和`nvidia-docker`
请记住,`nvidia-docker`是 Docker 的专用版本,带有带有很好的便捷包装的插件,可从 Docker 容器中看到 Linux 安装上的本地 GPU 设备。 如果您打算使用 GPU 支持,则需要记住使用`nvidia-docker`运行它。
......@@ -141,7 +141,7 @@ C:\11519>docker build -t keras .
![](img/db2fb676-3474-4036-a5c5-f01cdef15e6c.png)
输出-Docker 构建
Docker 构建输出
请注意,但是,第一次运行可能要花费 30 分钟。
......@@ -153,7 +153,7 @@ C:\11519>docker build -t keras .
既然我们已经构建了 Docker 文件并使其可读,那么我们将在容器内运行 REST 服务。 在本节中,我们将研究运行 Docker 以及正确的命令行参数,REST 服务中公开的 URL,最后,我们将验证 Keras 是否已完全安装并正常运行。
现在要获得回报:实际上,我们将使用 docker run 命令运行我们的容器。 我们将在这里传递几个开关。 `-p`会告诉我们容器上的端口`8888`是我们 PC 上的端口`8888`,以及`-v`命令(我们实际上将挂载本地工作目录,这是我们克隆的位置) 来自 GitHub 的源代码)将安装到容器的卷中:
现在要获得回报:实际上,我们将使用`docker run`命令运行我们的容器。 我们将在这里传递几个开关。 `-p`会告诉我们容器上的端口`8888`是我们 PC 上的端口`8888`,以及`-v`命令(我们实际上将挂载本地工作目录,这是我们克隆的位置) 来自 GitHub 的源代码)将安装到容器的卷中:
```py
C:\11519>docker run -p 8888:8888 -v C:/11519/:/src keras
......@@ -185,13 +185,13 @@ C:\11519>docker run -p 8888:8888 -v C:/11519/:/src keras
sudo nvidia-docker run -p 8888:8888 -v ~/kerasvideo/:/src keras-gpu
```
否则,命令行开关与实际运行直线 Keras 容器的方式相同,除了它们分别为`nvidia-docker``keras-gpu`。 现在,一旦容器启动并运行,您将获得一个 URL,然后您将使用该 URL 并将其粘贴到浏览器中以访问由该容器提供的 IPython Notebook
否则,命令行开关与实际运行直线 Keras 容器的方式相同,除了它们分别为`nvidia-docker``keras-gpu`。 现在,一旦容器启动并运行,您将获得一个 URL,然后您将使用该 URL 并将其粘贴到浏览器中以访问由该容器提供的 IPython 笔记本
![](img/d5b6f9ac-dc2a-4e2c-b394-821ece73e87f.png)
输出-在 Ubuntu 系统上运行的 docker
现在,我们将继续快速制作一个新的 IPython Notebook。 当它启动时,我们将`import keras`,确保它加载,然后花一秒钟才能出现:
现在,我们将继续快速制作一个新的 IPython 笔记本。 当它启动时,我们将`import keras`,确保它加载,然后花一秒钟才能出现:
![](img/3a6fd76f-d86e-4e82-ac86-aa574a8609c7.png)
......@@ -216,7 +216,7 @@ print(device_lib.list_local_devices())
![](img/3e1688cd-d7ab-40b9-82fe-5e5a59e41d82.png)
浏览器窗口(lacalhost
浏览器窗口(`localhost`
糟糕! 由于`0.0.0.0`不是真实的计算机,因此无法达到; 我们将其切换为`localhost`,点击“输入”,然后确定我们有一个 IPython 笔记本:
......@@ -224,11 +224,11 @@ print(device_lib.list_local_devices())
IPython 笔记本
我们将继续创建一个新的 Python 3 Notebook,并通过查看是否可以导入`keras`库并确保一切正常来对其进行快速测试。
我们将继续创建一个新的 Python 3 笔记本,并通过查看是否可以导入`keras`库并确保一切正常来对其进行快速测试。
看起来我们都准备好了。 我们的 TensorFlow 后端很不错!
这是我们将在本书中运行的环境:充分准备并准备就绪的 Docker 容器,因此您需要做的就是启动它,运行它,然后与内部托管的 Keras 和 IPython Notebooks 一起使用。 这样您每次都可以拥有一个轻松,可重复的环境。
这是我们将在本书中运行的环境:充分准备并准备就绪的 Docker 容器,因此您需要做的就是启动它,运行它,然后与内部托管的 Keras 和 IPython 笔记本一起使用。 这样您每次都可以拥有一个轻松,可重复的环境。
# 概要
......
......@@ -10,7 +10,7 @@
现在,让我们了解 MNIST 数字。 在本节中,我们将介绍为帮助我们了解如何处理图像数据而准备的`ImageData`笔记本; 下载并获取 MNIST 数字; 将图像视为原始数字; 最后,根据此数值数据可视化实际图像。
我们将要使用的代码包含在 IPython Notebook 中。 这是我们设置容器的方式,因此您将像在设置机器学习工具包最后提到的那样运行容器。 我还准备了要使用的`ImageData` IPython Notebook。 我们将首先导入所有必需的软件包,然后打开 Matplotlib 以便自动进行绘图。 这意味着当我们显示图像时,我们不必调用`.plot`; 会自动为我们完成:
我们将要使用的代码包含在 IPython 笔记本中。 这是我们设置容器的方式,因此您将像在设置机器学习工具包最后提到的那样运行容器。 我还准备了要使用的`ImageData` IPython 笔记本。 我们将首先导入所有必需的软件包,然后打开 Matplotlib 以便自动进行绘图。 这意味着当我们显示图像时,我们不必调用`.plot`; 会自动为我们完成:
![](img/47fe23e8-1eae-4c41-af2d-61c998729f07.png)
......@@ -20,7 +20,7 @@ Keras 实际上具有内置的 MNIST 数字作为数据集,因此我们将使
您需要互联网连接,因为它将要从 Amazon S3 作为文件下载这些文件。
在加载数据时,将有一个 Python 元组,我们将把 iPn 解压缩为两组:**训练集****测试集**
在加载数据时,将有一个 Python 元组,我们将把解压缩为两组:**训练集****测试集**
![](img/953f412b-59a2-4a70-80de-26659d048c70.png)
......@@ -96,7 +96,7 @@ Python 元组
![](img/94d95ea1-3af8-40d5-966e-7b100103a840.png)
o 到 9 个预测
0 到 9 的预测
因此,为此,我们将使用数据转换技巧。 这种事情称为“一次热编码”,在这里您可以获取一系列标签可能性,在这种情况下,将数字`0``9`转换为一种位图,其中每个选项都编码为 一列,并且对于每个给定的数据样本,只有一列设置为`1`(因此为一热):
......
......@@ -23,7 +23,7 @@
这就是中间的这两个循环。 他们在每个输入和每个激活之间,然后在每个激活和每个输出之间都处于优势地位。 这就是定义密集神经网络的原因:所有输入和所有激活之间以及所有激活和所有输出之间的完全连接。 如您所见,它生成的图片连接紧密,因此得名!
现在,让我们使用 28 x 28 像素的网格(即输入网络)将其扩展到二维,然后再进行学习的 28 x 28 像素的激活网络。 最终,我们将进入`10`位置分类网络,在该网络中我们将预测输出数字。 从以下屏幕快照中的黑色互连线中,您可以看到这是一个非常密集的结构:
现在,让我们使用`28 x 28`像素的网格(即输入网络)将其扩展到二维,然后再进行学习的`28 x 28`像素的激活网络。 最终,我们将进入`10`位置分类网络,在该网络中我们将预测输出数字。 从以下屏幕快照中的黑色互连线中,您可以看到这是一个非常密集的结构:
![](img/06a89c6e-c757-454e-af07-43488b7bb4a6.png)
......@@ -41,7 +41,7 @@
![](img/cc268de7-1528-421d-8da7-1f54973a0fde.png)
Sigmoid功能
Sigmoid 函数
这是一种 S 曲线,范围从零到一。 它实际上是由 e 构成的一个指数和一个比率。 现在,好消息是您实际上不必编写在这里看到的数学代码,因为当我们想在 Keras 中使用`sigmoid`时,我们只需使用名称`sigmoid`来引用它即可。
......@@ -75,7 +75,7 @@ ReLu 非线性函数-大于零。
数字叠
这很重要,这样您才能知道哪个答案最有可能。 因此,作为我们可以用来理解`softmax`的示例,让我们看一下我们的值数组。 我们可以看到有三个值。 假设神经网络输出为`1``2``5`。 我们正在尝试将它们分为红色,绿色和蓝色类别。 现在,我们通过`softmax`运行它,我们可以看到概率分数。 如您在此处可以清楚看到的那样,它应该是蓝色,并表示为概率。 读出`softmax`的方法是使用`argmax`。 您查看具有最高值的单元格,并将该索引提取为您的预测类。 但是,如果您查看实际数字-`1``2``5`-您会发现它们总计为八,但是`5`的输出概率为`0.93`。 这是因为`softmax`使用指数函数。 这不仅仅是数字的线性组合,例如将五除以八,然后说 5/8 是该类别中的概率。 我们在这里所说的是,最强的信号将主导较弱的信号,并且该指数实际上将超过具有较高值的​​类的概率,因此当事物相对接近时,您的神经网络在分类方面会更有效。 记住,使用实际的神经网络,您将不会输出漂亮的`1``2``5`数字-您将输出相对较小的十进制数字,例如`0.00007`, 小的浮点数,然后我们需要将它们分成几类。
这很重要,这样您才能知道哪个答案最有可能。 因此,作为我们可以用来理解`softmax`的示例,让我们看一下我们的值数组。 我们可以看到有三个值。 假设神经网络输出为`1``2``5`。 我们正在尝试将它们分为红色,绿色和蓝色类别。 现在,我们通过`softmax`运行它,我们可以看到概率分数。 如您在此处可以清楚看到的那样,它应该是蓝色,并表示为概率。 读出`softmax`的方法是使用`argmax`。 您查看具有最高值的单元格,并将该索引提取为您的预测类。 但是,如果您查看实际数字-`1``2``5`-您会发现它们总计为八,但是`5`的输出概率为`0.93`。 这是因为`softmax`使用指数函数。 这不仅仅是数字的线性组合,例如将五除以八,然后说`5/8`是该类别中的概率。 我们在这里所说的是,最强的信号将主导较弱的信号,并且该指数实际上将超过具有较高值的​​类的概率,因此当事物相对接近时,您的神经网络在分类方面会更有效。 记住,使用实际的神经网络,您将不会输出漂亮的`1``2``5`数字-您将输出相对较小的十进制数字,例如`0.00007`, 小的浮点数,然后我们需要将它们分成几类。
现在您可能想知道为什么我们应该考虑这一点,因为您可以轻松地从数字`1``2``5`看出`5`是最大的值。 好吧,这个想法是,如果您将事情表示为概率,则可以模拟信心。 从某种意义上讲,您可以在模型之间共享分数,并且知道您的模型实际的自信程度。 另外,不同的型号将在不同的范围内输出不同的数字。 仅仅因为您在尝试的第一个模型中放入了`1``2``5`,这并不意味着它们在另一个模型中具有相同的相对值。 因此,将它们粉碎成概率可以进行比较。 现在,有了这些数学知识,我们就可以开始研究构建实际的神经网络了。 好消息是您实际上不需要记住或知道我们刚才列出的数学。 您只需要记住数学部分的名称,因为在 Keras 中,您使用简单的名称引用了激活函数。
......@@ -93,7 +93,7 @@ ReLu 非线性函数-大于零。
![](img/7b333062-bed5-400c-9745-34d7cdc2d593.png)
加载.shape(训练)
加载`.shape`(训练)
在这两种情况下,第一维均为`60000`,但请查看第二维和第三维(`28``28`)(即输入图像的大小)和`10`图。 好吧,这些并不一定要匹配,因为通过模型运行此模型时,我们正在做的是将数据从`28``28`维度转换为`10`维度。
......@@ -101,7 +101,7 @@ ReLu 非线性函数-大于零。
![](img/ea5329a4-d888-4df8-99f8-980ca7330c32.png)
加载.shape(测试)
加载`.shape`(测试)
这些尺寸以适当的方式匹配非常重要。 因此,对于训练集,第一个维度必须与您的`x``y`值(您的输入和输出)匹配,并且在您的测试集上,同样必须正确。 但也请注意,训练和测试数据的第二和第三个维度`28``28`相同,而测试和训练数据的`10`(输出维度)相同。 准备信息时,最常见的错误之一就是不对这些数据集进行排序。 但为什么?! 一言以蔽之:**过拟合**
......@@ -121,15 +121,15 @@ ReLu 非线性函数-大于零。
Keras 功能模型
我们从一个输入层开始,该输入层的形状与我们的一个输入样本相同。 在我们的案例中,我们选择了一张训练图像,从上一课中我们知道它的尺寸为 28x28 像素。 现在,我们将其传递给堆栈。 紧随其后的是`dropout_1`,紧接着是`dropout_2`,然后我们最终变成`softmax`激活,将其切换到输出层。 然后,我们将这些作为输入和输出组合到模型中。 然后,我们打印`summary`,如下所示:
我们从一个输入层开始,该输入层的形状与我们的一个输入样本相同。 在我们的案例中,我们选择了一张训练图像,从上一课中我们知道它的尺寸为`28x28`像素。 现在,我们将其传递给堆栈。 紧随其后的是`dropout_1`,紧接着是`dropout_2`,然后我们最终变成`softmax`激活,将其切换到输出层。 然后,我们将这些作为输入和输出组合到模型中。 然后,我们打印`summary`,如下所示:
![](img/d4a8fa97-4247-4cd4-9752-beaa163ae9df.png)
模型摘要输出
因此,您可以从中看到,首先将参数传递给图层,然后将图层本身传递以形成链。 那么,这些`Dropout``Flatten`层又如何呢? `Dropout`参数本质上是一个技巧。 当我们设置`Dropout`参数(这里是`0.1`)时,我们告诉神经网络要做的是在每个训练周期中随机断开 10% 的激活。 这是使神经网络学习概括。 这是真正的学习,而不是简单地记住输入数据。 `Flatten`层处理尺寸。 因为我们有一个二维的 28x28 像素输入图像,所以我们使用`Flatten`将其转换为`784`的长的一维数字字符串。 这被馈送到输出`softmax`层。
因此,您可以从中看到,首先将参数传递给图层,然后将图层本身传递以形成链。 那么,这些`Dropout``Flatten`层又如何呢? `Dropout`参数本质上是一个技巧。 当我们设置`Dropout`参数(这里是`0.1`)时,我们告诉神经网络要做的是在每个训练周期中随机断开 10% 的激活。 这是使神经网络学习概括。 这是真正的学习,而不是简单地记住输入数据。 `Flatten`层处理尺寸。 因为我们有一个二维的`28x28`像素输入图像,所以我们使用`Flatten`将其转换为`784`的长的一维数字字符串。 这被馈送到输出`softmax`层。
打印出模型摘要是弄清参数大小和尺寸的好方法。 这最终成为使用 Keras 的棘手部分之一,例如当您有一组输入样本(在我们的示例中为 28x28 图像),并且您需要到那时将它们转换成包含十个可能输出值的单个数组 您进入`softmax`。 您可以看到形状在我们穿过每一层时如何变化。 最后,`Flatten`将每个样本的维数降低为一个维,然后将其转换为具有十个可能的输出值的维。
打印出模型摘要是弄清参数大小和尺寸的好方法。 这最终成为使用 Keras 的棘手部分之一,例如当您有一组输入样本(在我们的示例中为`28x28`图像),并且您需要到那时将它们转换成包含十个可能输出值的单个数组 您进入`softmax`。 您可以看到形状在我们穿过每一层时如何变化。 最后,`Flatten`将每个样本的维数降低为一个维,然后将其转换为具有十个可能的输出值的维。
好的,现在该运行模型了。 现在,我们了解了如何将包括`Dropout``Flatten`层在内的模型放到一起,我们将继续使用求解器,这是我们实际执行机器学习模型所使用的。
......@@ -159,7 +159,7 @@ Keras 功能模型
在本节中,我们将探讨超参数或无法完全通过机器学习的参数。
我们还将介绍可训练的参数(这些是求解器学习的参数),不可训练的参数(模型中不需要训练的其他参数),最后,超参数(a 不能学习的参数) 传统的求解器)。
我们还将介绍可训练的参数(这些是求解器学习的参数),不可训练的参数(模型中不需要训练的其他参数),最后,超参数(传统的求解器不能学习的参数)。
在我们的“模型摘要输出”的屏幕截图中,请注意屏幕截图底部代码中突出显示的部分中可训练参数的数量。 这就是我们的模型`adam`优化器与我们的分类交叉熵`loss`函数一起将在模型内部包含的单个浮点数的数目,以便找到可能的最佳参数值。 因此,此可训练的参数编号是我们的`optimizer`函数学习的唯一编号集合。 但是,此代码和前面的屏幕快照中还有许多其他数字。 这些不可训练的参数呢? 在我们当前的模型中,有零个不可训练参数。 但是,Keras 中不同种类的图层可能具有恒定值,因此它们将显示为不可训练的。 再次,这只是意味着不需要对其进行培训,并且我们的`optimizer`函数将不会尝试更改其值。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册