提交 a415ca8d 编写于 作者: W wizardforcel

2021-01-04 22:39:55

上级 5d5eb576
......@@ -89,7 +89,7 @@ GAN 的基本概念很简单。 但是,我们将发现的一件事是,最具
![](img/B14853_04_014.png) (Equation 4.1.4)
有时,我们会假装合成数据是带有标签 1.0 的真实数据,以此来欺骗鉴别符。 通过最大化![](img/B14853_04_015.png),优化器将梯度更新发送到判别器参数,以将该合成数据视为真实数据。 同时,通过将![](img/B14853_04_016.png)的相关性减至最小,优化器将在上训练生成器的参数,从而欺骗识别器。 但是,实际上,判别器对将合成数据分类为伪造的预测很有信心,并且不会更新 GAN 参数。 此外,梯度更新很小,并且在传播到生成器层时已大大减小。 结果,生成器无法收敛。
有时,我们会假装合成数据是带有标签 1.0 的真实数据,以此来欺骗判别器。 通过最大化![](img/B14853_04_015.png),优化器将梯度更新发送到判别器参数,以将该合成数据视为真实数据。 同时,通过将![](img/B14853_04_016.png)的相关性减至最小,优化器将在上训练生成器的参数,从而欺骗识别器。 但是,实际上,判别器对将合成数据分类为伪造的预测很有信心,并且不会更新 GAN 参数。 此外,梯度更新很小,并且在传播到生成器层时已大大减小。 结果,生成器无法收敛。
![](img/B14853_04_04.png)
......@@ -192,7 +192,7 @@ def build_generator(inputs, image_size):
return generator
```
鉴别符与相似,是许多基于 CNN 的分类器。 输入是 28 x 28 x 1 MNIST 图像,分类为真实(1.0)或伪(0.0)。 有四个 CNN 层。 除了最后的卷积,每个`Conv2D`都使用`strides = 2`将特征图下采样两个。 然后每个`Conv2D`之前都有一个泄漏的 ReLU 层。 最终的过滤器大小为 256,而初始的过滤器大小为 32,并使每个卷积层加倍。 最终的过滤器大小 128 也适用。 但是,我们会发现生成的图像在 256 的情况下看起来更好。最终输出层被展平,并且在通过 S 型激活层缩放后,单个单元`Dense`层在 0.0 到 1.0 之间生成预测。 输出被建模为伯努利分布。 因此,使用了二进制交叉熵损失函数。
判别器与相似,是许多基于 CNN 的分类器。 输入是 28 x 28 x 1 MNIST 图像,分类为真实(1.0)或伪(0.0)。 有四个 CNN 层。 除了最后的卷积,每个`Conv2D`都使用`strides = 2`将特征图下采样两个。 然后每个`Conv2D`之前都有一个泄漏的 ReLU 层。 最终的过滤器大小为 256,而初始的过滤器大小为 32,并使每个卷积层加倍。 最终的过滤器大小 128 也适用。 但是,我们会发现生成的图像在 256 的情况下看起来更好。最终输出层被展平,并且在通过 S 型激活层缩放后,单个单元`Dense`层在 0.0 到 1.0 之间生成预测。 输出被建模为伯努利分布。 因此,使用了二进制交叉熵损失函数。
建立生成器和判别器模型后,通过将生成器和判别器网络连接起来,建立对抗模型。 鉴别网络和对抗网络都使用 RMSprop 优化器。 判别器的学习率是 2e-4,而对抗网络的学习率是 1e-4。 判别器的 RMSprop 衰减率为 6e-8,对抗网络的 RMSprop 衰减率为 3e-8。
......@@ -456,7 +456,7 @@ def train(models, x_train, params):
使用与上一节相同的 GAN ,会对生成器和判别器输入都施加一个条件。 条件是数字的一键向量形式。 这与要生成的图像(生成器)或分类为真实或伪造的图像(判别器)相关。 CGAN 模型显示在“图 4.3.1”中。
CGAN 与 DCGAN 相似,除了附加的一键式矢量输入。 对于生成器,单热标签在`Dense`层之前与潜矢量连接在一起。 对于鉴别符,添加了新的`Dense`层。 新层用于处理一个热向量并对其进行整形,以使其适合于与后续 CNN 层的另一个输入串联。
CGAN 与 DCGAN 相似,除了附加的一键式矢量输入。 对于生成器,单热标签在`Dense`层之前与潜矢量连接在一起。 对于判别器,添加了新的`Dense`层。 新层用于处理一个热向量并对其进行整形,以使其适合于与后续 CNN 层的另一个输入串联。
![](img/B14853_04_07.png)
......
......@@ -21,7 +21,7 @@
# 1\. Wasserstein GAN
如前所述,众所周知,GAN 很难训练。 判别器和生成器这两个网络的相反目标很容易导致训练不稳定。 判别器尝试从真实数据中正确分类伪造数据。 同时,生成器将尽最大努力欺骗判别器。 如果鉴别符的学习速度比生成器快,则生成器参数将无法优化。 另一方面,如果判别器学习较慢,则梯度可能会在到达生成器之前消失。 在最坏的情况下,如果判别器无法收敛,则生成器将无法获得任何有用的反馈。
如前所述,众所周知,GAN 很难训练。 判别器和生成器这两个网络的相反目标很容易导致训练不稳定。 判别器尝试从真实数据中正确分类伪造数据。 同时,生成器将尽最大努力欺骗判别器。 如果判别器的学习速度比生成器快,则生成器参数将无法优化。 另一方面,如果判别器学习较慢,则梯度可能会在到达生成器之前消失。 在最坏的情况下,如果判别器无法收敛,则生成器将无法获得任何有用的反馈。
WGAN 认为 GAN 固有的不稳定性是由于它的损失函数引起的,该函数基于 **Jensen-Shannon****JS**)距离。 在 GAN 中,生成器的目的是学习如何将一种源分布(例如噪声)从转换为估计的目标分布(例如 MNIST 数字)。 使用 GAN 的原始公式,损失函数实际上是使目标分布与其估计值之间的距离最小。 问题是,对于某些分布对,没有平滑的路径可以最小化此 JS 距离。 因此,训练将无法收敛。
......@@ -156,7 +156,7 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14
![](img/B14853_05_061.png) (Equation 5.1.19)
我们使用粗体字母突出显示多维样本的一般性。 最后一个问题是如何找到功能族![](img/B14853_05_062.png)。 所提出的解决方案是在每次梯度更新时进行的。 鉴别符`w`的权重被限制在上下限之间(例如,-0.01 和 0.01):
我们使用粗体字母突出显示多维样本的一般性。 最后一个问题是如何找到功能族![](img/B14853_05_062.png)。 所提出的解决方案是在每次梯度更新时进行的。 判别器`w`的权重被限制在上下限之间(例如,-0.01 和 0.01):
![](img/B14853_05_063.png) (Equation 5.1.20)
......@@ -207,7 +207,7 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14
4. 从均匀的噪声分布中采样一批![](img/B14853_05_084.png)
5. ![](img/B14853_05_085.png),计算判别器梯度
6. ![](img/B14853_05_086.png),更新判别器参数
7. ![](img/B14853_05_087.png),剪辑鉴别符权重
7. ![](img/B14853_05_087.png),剪辑判别器权重
8. `end for`
9. 从均匀的噪声分布中采样一批![](img/B14853_05_088.png)
10. ![](img/B14853_05_089.png),计算生成器梯度
......@@ -558,7 +558,7 @@ LSGAN 提出最小二乘损失。“图 5.2.1”演示了为什么在 GAN 中使
表 5.2.1:GAN,WGAN 和 LSGAN 损失函数之间的比较
最小化“公式 5.2.1”或鉴别符损失函数意味着实际数据分类与真实标签 1.0 之间的 MSE 应该接近零。 此外,假数据分类和真实标签 0.0 之间的 MSE 应该接近零。
最小化“公式 5.2.1”或判别器损失函数意味着实际数据分类与真实标签 1.0 之间的 MSE 应该接近零。 此外,假数据分类和真实标签 0.0 之间的 MSE 应该接近零。
与其他 GAN 相似,对 LSGAN 判别器进行了训练,可以从假数据样本中对真实数据进行分类。 最小化公式 5.2.2 意味着在标签 1.0 的帮助下,使判别器认为生成的假样本数据是真实的。
......@@ -781,7 +781,7 @@ def discriminator(inputs,
return Model(inputs, outputs, name='discriminator')
```
然后通过调用以下命令来构建鉴别符
然后通过调用以下命令来构建判别器
```py
discriminator = gan.discriminator(inputs, num_labels=num_labels)
......
......@@ -320,7 +320,7 @@ def discriminator(inputs,
图 6.1.4:InfoGAN Hard 模型
建立判别器和对抗模型还需要进行许多更改。 更改取决于所使用的损失函数。 原始的鉴别符损失函数`binary_crossentropy`,用于离散码的`categorical_crossentropy`和每个连续码的`mi_loss`函数构成了整体损失函数。 除`mi_loss`函数的权重为 0.5(对应于连续代码的![](img/B14853_06_029.png))外,每个损失函数的权重均为 1.0。
建立判别器和对抗模型还需要进行许多更改。 更改取决于所使用的损失函数。 原始的判别器损失函数`binary_crossentropy`,用于离散码的`categorical_crossentropy`和每个连续码的`mi_loss`函数构成了整体损失函数。 除`mi_loss`函数的权重为 0.5(对应于连续代码的![](img/B14853_06_029.png))外,每个损失函数的权重均为 1.0。
“列表 6.1.3”突出显示了所做的更改。 但是,我们应该注意,通过使用 builder 函数,判别器被实例化为:
......@@ -772,7 +772,7 @@ def build_encoder(inputs, num_labels=10, feature1_dim=256):
| **网络** | **损失函数** | **编号** |
| GAN | ![](img/B14853_06_030.png)![](img/B14853_06_031.png) | 4.1.14.1.5 |
| 堆叠式 | ![](img/B14853_06_032.png)![](img/B14853_06_033.png)![](img/B14853_06_034.png)![](img/B14853_06_035.png)![](img/B14853_06_036.png)其中![](img/B14853_06_037.png)是权重,`i`是编码器和 GAN ID | 6.2.16.2.26.2.36.2.46.2.5 |
| 式 | ![](img/B14853_06_032.png)![](img/B14853_06_033.png)![](img/B14853_06_034.png)![](img/B14853_06_035.png)![](img/B14853_06_036.png)其中![](img/B14853_06_037.png)是权重,`i`是编码器和 GAN ID | 6.2.16.2.26.2.36.2.46.2.5 |
表 6.2.1:GAN 和 StackedGAN 的损失函数之间的比较。 `~p_data`表示从相应的编码器数据(输入,特征或输出)采样
......
......@@ -146,10 +146,10 @@ CycleGAN 建议使用以下权重值![](img/B14853_07_023.png)和![](img/B14853_
`n`训练步骤重复上述步骤:
1. 通过使用真实的源数据和目标数据训练前向循环鉴别符,将![](img/B14853_07_025.png)降至最低。 实际目标数据的小批量`y`标记为 1.0。 伪造的目标数据![](img/B14853_07_026.png)的小批量标记为 0.0。
2. 通过使用真实的源数据和目标数据训练反向循环鉴别符,将![](img/B14853_07_027.png)最小化。 实际源数据的小批量`x`标记为 1.0。 一小部分伪造的源数据![](img/B14853_07_028.png)被标记为 0.0。
1. 通过使用真实的源数据和目标数据训练前向循环判别器,将![](img/B14853_07_025.png)降至最低。 实际目标数据的小批量`y`标记为 1.0。 伪造的目标数据![](img/B14853_07_026.png)的小批量标记为 0.0。
2. 通过使用真实的源数据和目标数据训练反向循环判别器,将![](img/B14853_07_027.png)最小化。 实际源数据的小批量`x`标记为 1.0。 一小部分伪造的源数据![](img/B14853_07_028.png)被标记为 0.0。
1. 通过训练对抗网络中的前向周期和后向周期生成器,将![](img/B14853_07_029.png)和![](img/B14853_07_030.png)最小化。 伪造目标数据的一个小批量![](img/B14853_07_026.png)被标记为 1.0。 一小部分伪造的源数据![](img/B14853_07_028.png)被标记为 1.0。 鉴别符的权重被冻结。
1. 通过训练对抗网络中的前向周期和后向周期生成器,将![](img/B14853_07_029.png)和![](img/B14853_07_030.png)最小化。 伪造目标数据的一个小批量![](img/B14853_07_026.png)被标记为 1.0。 一小部分伪造的源数据![](img/B14853_07_028.png)被标记为 1.0。 判别器的权重被冻结。
在神经样式转移问题中,颜色组合可能无法成功地从源图像转移到伪造目标图像。 此问题显示在“图 7.1.8”中:
......
......@@ -310,7 +310,7 @@ Training dataset shape: (70000, 784)
... display_images(gen_samples)
```
注意,在每个时期,生成器更新两次,而判别器仅更新一次。 这是因为优化判别器比生成器容易得多,这很直观。 任意图像只是毫不费力地被认为是伪造的。 如果鉴别符在早期出现收敛,则不完整的生成器将产生垃圾。 您还可以为两个网络指定不同的学习率,例如,生成器的学习率稍高一些,0.001,判别器的学习率则为 0.0002。
注意,在每个时期,生成器更新两次,而判别器仅更新一次。 这是因为优化判别器比生成器容易得多,这很直观。 任意图像只是毫不费力地被认为是伪造的。 如果判别器在早期出现收敛,则不完整的生成器将产生垃圾。 您还可以为两个网络指定不同的学习率,例如,生成器的学习率稍高一些,0.001,判别器的学习率则为 0.0002。
请参阅以下屏幕截图以获取第 25 阶段的最终结果:
......@@ -711,7 +711,7 @@ TensorBoard 中显示的学习图如下所示:
**InfoGANs****最大化生成对抗网络**信息的缩写)在某种意义上类似于 CGAN,因为两个生成器网络都接受一个附加参数,并且条件变量`c`,例如标签信息。 他们都试图学习相同的条件分布`P(X | z, c`。 InfoGAN 与 CGAN 的区别在于它们处理条件变量的方式。
CGAN 认为条件变量是已知的。 因此,在训练期间将条件变量显式馈送到判别器。 相反,InfoGAN 假设条件变量是未知的且是潜在的,我们需要根据训练数据来推断条件变量。 InfoGAN 中的鉴别符负责推导后验`P(c | X)`。 下图显示了 InfoGAN 的架构:
CGAN 认为条件变量是已知的。 因此,在训练期间将条件变量显式馈送到判别器。 相反,InfoGAN 假设条件变量是未知的且是潜在的,我们需要根据训练数据来推断条件变量。 InfoGAN 中的判别器负责推导后验`P(c | X)`。 下图显示了 InfoGAN 的架构:
![](img/d14dc2c1-cad3-4641-91ff-4870147970e1.png)
......
......@@ -555,6 +555,6 @@ PoseNet 网站说明了如何调整模型参数。 可以使用以下屏幕快
# 概要
在本章中,我们了解并实现了三种不同的姿势估计方法-OpenPose,堆叠式沙漏和 PostNet。 我们学习了如何使用 OpenCV 和 TensorFlow 预测人类关键点。 然后,我们了解了堆叠沙漏方法的详细理论和 TensorFlow 实现。 我们向您展示了如何在浏览器中评估人体姿势,以及如何使用网络摄像头实时估计关键点。 然后将人体姿势估计与动作识别模型链接,以演示如何使用两者来提高准确率。 基于加速的代码展示了如何使用 TensorFlow 2.0 加载数据,训练模型和预测动作。
在本章中,我们了解并实现了三种不同的姿势估计方法-OpenPose,式沙漏和 PostNet。 我们学习了如何使用 OpenCV 和 TensorFlow 预测人类关键点。 然后,我们了解了堆叠沙漏方法的详细理论和 TensorFlow 实现。 我们向您展示了如何在浏览器中评估人体姿势,以及如何使用网络摄像头实时估计关键点。 然后将人体姿势估计与动作识别模型链接,以演示如何使用两者来提高准确率。 基于加速的代码展示了如何使用 TensorFlow 2.0 加载数据,训练模型和预测动作。
在下一章中,我们将学习如何实现 R-CNN 并将其与其他 CNN 模型(如 ResNet,Inception 和 SSD)结合使用,以提高对象检测的预测,准确率和速度。
\ No newline at end of file
......@@ -137,7 +137,7 @@ Socratic 是一个导师应用程序,它允许用户拍摄数学问题,并
# 了解深度学习
我们已经很长时间听到了**学习**一词,并且在某些情况下通常意味着获得执行任务的经验。 但是,以[learning]为前缀的**深**是什么意思?
我们已经很长时间听到了**学习**一词,并且在某些情况下通常意味着获得执行任务的经验。 但是,以学习为前缀的**深度**是什么意思?
在计算机科学中,深度学习是指一种机器学习模型,其中涉及多个学习层。 这意味着计算机程序由多种算法组成,数据通过这些算法逐一传递,最终产生所需的输出。
......@@ -157,7 +157,7 @@ Socratic 是一个导师应用程序,它允许用户拍摄数学问题,并
输入层和输出层之间的任何中间层都称为隐藏层。 生产环境中使用的典型神经网络可能包含数百个输入层。 通常,隐藏层比输入或输出层包含更多的神经元。 但是,在某些特殊情况下,这可能不成立。 通常会在隐藏层中包含大量神经元,以处理输入以外的维度中的数据。 这使程序可以以用户将其馈入网络时所呈现的格式,以数据的形式获得洞察力或模式,这些数据可能不可见。
神经网络的复杂性直接取决于网络中神经元的层数。 尽管神经网络可以通过添加更多层来发现数据中更深的模式,但它也增加了网络的计算成本。 网络也有可能进入称为**过拟合**的错误状态。 相反,如果网络太简单,或者说网络不够深,它将到达另一个错误状态,称为**,不适合**
神经网络的复杂性直接取决于网络中神经元的层数。 尽管神经网络可以通过添加更多层来发现数据中更深的模式,但它也增加了网络的计算成本。 网络也有可能进入称为**过拟合**的错误状态。 相反,如果网络太简单,或者说网络不够深,它将到达另一个错误状态,称为**欠拟合**
您可以在[这个页面](https://towardsdatascience.com/overfitting-vs-underfitting-a-conceptual-explanation-d94ee20ca7f9)上了解有关过拟合和不足的更多信息。
......@@ -217,7 +217,7 @@ Socratic 是一个导师应用程序,它允许用户拍摄数学问题,并
![](img/c5a789dd-0758-491b-993d-a3955c85432c.png)
用最简单的术语来说,合并是将多个图像像素合并为单个像素的方法。 前面的屏幕快照中使用的合并方法称为 **max pooling** ,其中只有来自所选滑动窗口内核的最大值保留在所得矩阵中。 这极大地简化了图像,并有助于训练通用且不是单个图像专用的滤镜。
用最简单的术语来说,合并是将多个图像像素合并为单个像素的方法。 前面的屏幕快照中使用的合并方法称为**最大池化**,其中只有来自所选滑动窗口内核的最大值保留在所得矩阵中。 这极大地简化了图像,并有助于训练通用且不是单个图像专用的滤镜。
# 生成对抗网络
......@@ -243,7 +243,7 @@ Socratic 是一个导师应用程序,它允许用户拍摄数学问题,并
![](img/e8e96307-09f5-4d42-a3bf-b5fcd8b52a07.png)
与简单的 ANN 相比,RNN 使用一种称为**通过时间****BPTT**)的反向传播的方法,而不是 ANN 中的经典反向传播。 BPTT 通过在与网络中必须重复出现的输入有关的函数中定义时间,从而确保在错误的反向传播中很好地表示时间。
与简单的 ANN 相比,RNN 使用一种称为**时间上的反向传播****BPTT**的方法,而不是 ANN 中的经典反向传播。 BPTT 通过在与网络中必须重复出现的输入有关的函数中定义时间,从而确保在错误的反向传播中很好地表示时间。
# 长期记忆
......@@ -293,7 +293,7 @@ Core ML 是 Apple 在 iOS 11 中发布的一种机器学习框架,用于使在
# Caffe2
Caffe2 建立在由加州大学伯克利分校开发的用于快速嵌入(**Caffe**)的原始**卷积架构上,是一种轻量级,模块化,可扩展的深度学习框架,由 脸书 它可以帮助开发人员和研究人员部署机器学习模型,并在 Android,iOS 和 Raspberry Pi 上提供 AI 驱动的性能。 此外,它支持在 Android Studio,Microsoft Visual Studio 和 Xcode 中进行集成。 Caffe2 带有可互换使用的本机 Python 和 C ++ API,从而简化了原型设计和优化过程。 它足够有效地处理大量数据,并且有助于自动化,图像处理以及统计和数学运算。 Caffe2 是开源的,托管在 GitHub 上,它利用社区的贡献来开发新模型和算法。**
Caffe2 建立在由加州大学伯克利分校开发的**用于快速嵌入的原始卷积架构****Caffe**上,是一种轻量级,模块化,可扩展的深度学习框架,由 脸书 它可以帮助开发人员和研究人员部署机器学习模型,并在 Android,iOS 和 Raspberry Pi 上提供 AI 驱动的性能。 此外,它支持在 Android Studio,Microsoft Visual Studio 和 Xcode 中进行集成。 Caffe2 带有可互换使用的本机 Python 和 C ++ API,从而简化了原型设计和优化过程。 它足够有效地处理大量数据,并且有助于自动化,图像处理以及统计和数学运算。 Caffe2 是开源的,托管在 GitHub 上,它利用社区的贡献来开发新模型和算法。**
# TensorFlow
......
......@@ -192,7 +192,7 @@ Widget buildRowTitle(BuildContext context, String title) {
该方法用于使用`title`字符串中传递的值作为参数来创建带有标题的窗口小部件。 使用`Center()`将文本水平对齐到中心,并使用`EdgeInsets.symmetric(horizontal: 8.0, vertical: 16.0)`将文本水平`8.0``16.0`垂直填充。 它包含一个子级,用于创建带有标题的`Text`。 文本的印刷样式被修改为`textTheme.headline`,以更改文本的默认大小,粗细和间距。
Flutter 使用**逻辑像素**作为度量单位,与**与设备无关的像素****dp**)相同。 此外,每个逻辑像素中的设备像素的数量可以根据 **devicePixelRatio** 来表示。 为了简单起见,我们将仅使用数字术语来谈论宽度,高度和其他可测量的属性。
Flutter 使用**逻辑像素**作为度量单位,与**与设备无关的像素****dp**)相同。 此外,每个逻辑像素中的设备像素的数量可以根据`devicePixelRatio`来表示。 为了简单起见,我们将仅使用数字术语来谈论宽度,高度和其他可测量的属性。
# 使用按钮小部件构建行
......@@ -275,7 +275,7 @@ void onPickImageSelected(String source) async {
![](img/54845f13-a133-4eab-945b-c89dfcd830b3.png)
在成功选择图像并且`file`变量具有所需的`uri`之后,用户将迁移到下一个屏幕`FaceDetectorDetail`,这在“创建第二个屏幕”部分中进行了介绍,并使用`Navigator.push()`将当前上下文和所选文件传递到构造函数中。 在`FaceDetectorDetail`屏幕上,我们用所选图像填充图像支架并显示有关检测到的面部的详细信息。
在成功选择图像并且`file`变量具有所需的`uri`之后,用户将迁移到下一个屏幕`FaceDetectorDetail`,这在“创建第二个屏幕”部分中进行了介绍,并使用`Navigator.push()`将当前上下文和所选文件传递到构造中。 在`FaceDetectorDetail`屏幕上,我们用所选图像填充图像支架并显示有关检测到的面部的详细信息。
# 创建整个用户界面
......@@ -314,11 +314,11 @@ Widget build(BuildContext context) {
# 获取图像文件
首先,需要将所选图像传递到第二个屏幕进行分析。 我们使用`FaceDetection()`构造函数执行此操作。
首先,需要将所选图像传递到第二个屏幕进行分析。 我们使用`FaceDetection()`构造执行此操作。
**构造函数**是用于初始化类变量的特殊方法。 它们与类具有相同的名称。 构造函数没有返回类型,并且在创建类的对象时会自动调用它们。
**构造器**是用于初始化类变量的特殊方法。 它们与类具有相同的名称。 构造器没有返回类型,并且在创建类的对象时会自动调用它们。
我们声明一个`file`变量,并使用参数化的构造函数对其进行初始化,如下所示:
我们声明一个`file`变量,并使用参数化的构造对其进行初始化,如下所示:
```py
File file;
......@@ -419,7 +419,7 @@ class FacePainter extends CustomPainter {
}
```
我们首先定义三个全局变量`image``faces``rects`。 类型为`Image``image`用于获取图像文件的字节格式。 `faces`是检测到的`Face`对象的`List``image``faces`都在`FacePainter`构造函数中初始化。 现在我们遍历这些面,并使用`faces[i].boundingBox`获得每个面的边界矩形,并将其存储在`rects`列表中。
我们首先定义三个全局变量`image``faces``rects`。 类型为`Image``image`用于获取图像文件的字节格式。 `faces`是检测到的`Face`对象的`List``image``faces`都在`FacePainter`构造中初始化。 现在我们遍历这些面,并使用`faces[i].boundingBox`获得每个面的边界矩形,并将其存储在`rects`列表中。
3. 接下来,我们覆盖`paint()`,以用矩形绘制`Canvas`,如下所示:
......
......@@ -68,8 +68,8 @@ Dialogflow 项目在 Google Cloud 上运行,并且能够从与构建会话相
让我们讨论上图中引入的术语:
* **用户**:用户是使用聊天机器人/应用程序的人,并且负责发出**用户请求****用户请求**只是由用户发出的口语或句子,必须由聊天机器人进行解释。 需要针对它生成适当的响应。
* **集成**:集成是一个软件组件,负责将用户请求传递给聊天机器人逻辑,并将**代理响应**传递给用户。 这种集成可以是您创建的应用程序或网站,也可以是现有服务(例如 Slack,Facebook Messenger),也可以是调用 Dialogflow 聊天机器人的脚本。
* **代理**:我们使用 Dialogflow 工具开发的聊天机器人称为代理。 聊天机器人生成的响应称为**代理响应**
* **集成**:集成是一个软件组件,负责将用户请求传递给聊天机器人逻辑,并将**智能体响应**传递给用户。 这种集成可以是您创建的应用程序或网站,也可以是现有服务(例如 Slack,Facebook Messenger),也可以是调用 Dialogflow 聊天机器人的脚本。
* **智能体**:我们使用 Dialogflow 工具开发的聊天机器人称为代理。 聊天机器人生成的响应称为**智能体响应**
* **意图**:这表示用户在其用户请求中尝试执行的操作。 用户输入的自然语言必须与意图相匹配,以确定针对任何特定请求要生成的响应类型。
* **实体**:在用户请求中,用户有时可能会使用处理响应所需的单词或短语。 这些以实体的形式从用户请求中提取,然后按需使用。 例如,如果用户说“我在哪里可以买到芒果?” 聊天机器人应该提取**芒果**一词,以便搜索其可用的数据库或互联网以提出适当的响应。
* **上下文**:要了解 Dialogflow 中的**上下文**,请考虑以下情形,在这种情况下,您无法与聊天机器人交谈来维护上下文:
......@@ -130,7 +130,7 @@ Dialogflow 控制台提示您创建一个新的 Intent。 让我们创建一个
![](img/0676c8eb-7bb9-4b8a-8059-9e9f4c5e6970.png)
4. 向下滚动到“操作和参数”部分,并添加 **userName** 参数,如以下屏幕快照所示:
4. 向下滚动到“操作和参数”部分,并添加`userName`参数,如以下屏幕快照所示:
![](img/cc535d0f-79fc-43f9-8788-6db34aa44b6a.png)
......@@ -323,7 +323,7 @@ exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
# 创建文本控制器
首先,让我们在名为`chat_screen.dart`的新 dart 文件中创建一个名为 **ChatScreen** 的 StatefulWidget。 现在,请按照下列步骤操作:
首先,让我们在名为`chat_screen.dart`的新 dart 文件中创建一个名为`ChatScreen`的 StatefulWidget。 现在,请按照下列步骤操作:
1. 创建一个文本框-用 Flutter 术语`TextField`-允许用户输入输入文本。 要创建`TextField`,我们需要定义`createTextField()`
......@@ -521,7 +521,7 @@ void _handleSubmitted(String query) {
方法的字符串参数包含用户输入的查询字符串的值。 该查询字符串以及一个硬编码的响应字符串用于创建`ChatMessage`的实例,并插入到`_messages`列表中。
7.`ChatMessage`中定义一个构造函数,以便正确传递和初始化参数值,查询和响应:
7.`ChatMessage`中定义一个构造,以便正确传递和初始化参数值,查询和响应:
```py
final String query, response;
......
......@@ -34,7 +34,7 @@
深度学习中用于图像处理的一种非常常见的方法是部署 CNN,我们已经在前面的章节中进行了介绍。 要查看其概念和基本工作,请参阅“第 2 章”,“移动视觉–使用设备上模型的人脸检测”。 在这个项目中,我们将介绍如何将这些模型转换为可以在移动设备上高效运行的压缩模型。
您可能想知道我们将如何构建这些模型。 为了简化语法,对 TensorFlow API 的强大支持以及广泛的技术支持社区,我们将使用 Python 构建这些模型。 很明显,您的开发计算机上将需要 Python 运行时,但对于该项目,我们将选择一种更快,更强大的选项-Google 的 Colaboratory 环境。 Colaboratory(或简称为 Colab)为即时可用的运行时提供了几个重要的**机器学习****ML**)以及与运行时预装的数据科学相关的模块。 另外,Colaboratory 还为启用**图形处理器****GPU**)和 **Tensor Processing Unit****TPU**)的运行时提供支持。 训练深度学习模型可谓小菜一碟。 然后,我们将直接在设备上部署 TensorFlow Lite 模型,这是一种适合快速运行且不需要定期更新的模型的良好做法。
您可能想知道我们将如何构建这些模型。 为了简化语法,对 TensorFlow API 的强大支持以及广泛的技术支持社区,我们将使用 Python 构建这些模型。 很明显,您的开发计算机上将需要 Python 运行时,但对于该项目,我们将选择一种更快,更强大的选项-Google 的 Colaboratory 环境。 Colaboratory(或简称为 Colab)为即时可用的运行时提供了几个重要的**机器学习****ML**)以及与运行时预装的数据科学相关的模块。 另外,Colaboratory 还为启用**图形处理器****GPU**)和**张量处理单元****TPU**)的运行时提供支持。 训练深度学习模型可谓小菜一碟。 然后,我们将直接在设备上部署 TensorFlow Lite 模型,这是一种适合快速运行且不需要定期更新的模型的良好做法。
让我们开始了解项目架构。
......@@ -50,7 +50,7 @@
![](img/3605fe2e-c86c-438b-aa36-2aef8854ff9b.png)
首先,我们将在包含数百张图像的数据集上训练分类模型。 为此,我们将使用 Python 构建 TensorFlow 模型。 然后,必须以的格式保存模型。 **tflite** ,是 TensorFlow Lite 模型的扩展。 后端到此结束,我们切换到前端。
首先,我们将在包含数百张图像的数据集上训练分类模型。 为此,我们将使用 Python 构建 TensorFlow 模型。 然后,必须以的格式保存模型。 **tflite**,是 TensorFlow Lite 模型的扩展。 后端到此结束,我们切换到前端。
在前端,我们首先使用 Flutter 构建一个应用程序,该应用程序可以从设备上存在的图库中加载图像。 Firebase 上的预测模型已下载并缓存到设备上。 从图库中选择的图像将传递到模型,该模型将预测包含图像中显示的植物物种名称的标签。 模型存储在移动设备上,即使离线也可以使用模型。
......@@ -122,7 +122,7 @@ Cloud Vision API 是 GCP 套件中流行的 API。 它已成为使用计算机
API 密钥方法仅适用于 GCP 的部分选定 API 和服务,并非十分安全。 如果要完全访问所有 API 和服务以及细粒度的安全性,则需要对服务帐户使用该方法。 为此,[您可以阅读 GCP 官方文档中的以下文章](https://cloud.google.com/docs/authentication/)
有了 API 密钥,您现在就可以通过 Flutter 应用程序进行 API 调用了。 在下一部分中,我们将在**合作**上开发预测模型,并将其保存为`.tflite`模型。
有了 API 密钥,您现在就可以通过 Flutter 应用程序进行 API 调用了。 在下一部分中,我们将在 **Colab** 上开发预测模型,并将其保存为`.tflite`模型。
# 使用 SDK /工具构建模型
......@@ -213,7 +213,7 @@ train_generator = datagen.flow_from_directory(
subset='training')
```
`datagen`对象采用两个参数-`rescale``validation_split``rescale`参数告诉对象将所有黑白图像转换为`0``255`的范围,就像**红色,绿色和蓝色****RGB** 的规模,因为 MobileNet 模型已经在 RGB 图像上进行了训练。 `validation_split`参数从数据集中分配 20%(0.2 x 100)的图像作为验证集。 但是,我们也需要为验证集创建一个生成器,就像我们为训练集所做的那样。
`datagen`对象采用两个参数-`rescale``validation_split``rescale`参数告诉对象将所有黑白图像转换为`0``255`的范围,就像**红色,绿色和蓝色****RGB**的规模,因为 MobileNet 模型已经在 RGB 图像上进行了训练。 `validation_split`参数从数据集中分配 20%(0.2 x 100)的图像作为验证集。 但是,我们也需要为验证集创建一个生成器,就像我们为训练集所做的那样。
训练集生成器`train_generator`接受`target_size``batch_size`参数以及其他参数。 `target_size`参数设置要生成的图像的尺寸。 这样做是为了与 MobileNet 模型中的图像尺寸匹配。 `batch_size`参数指示单个批次应生成多少个图像。
......@@ -460,7 +460,7 @@ return Scaffold(
在前面的代码片段中,`AppBar`将包含`Plant Species Recognition`文本。 这将作为应用程序的标题显示在屏幕顶部的应用程序栏上。
在 Flutter 中,`const`关键字有助于冻结对象的状态。 描述为`const`的对象的完整状态是在应用程序本身的编译期间确定的,并且保持不变。 同样,当与`Text()`之类的构造函数一起使用时,该关键字对于小型内存优化也很有用。 在代码中添加第二个`Text()`构造函数会重用为第一个`Text()`构造函数分配的内存,从而重用内存空间并使应用程序更快。
在 Flutter 中,`const`关键字有助于冻结对象的状态。 描述为`const`的对象的完整状态是在应用程序本身的编译期间确定的,并且保持不变。 同样,当与`Text()`之类的构造器一起使用时,该关键字对于小型内存优化也很有用。 在代码中添加第二个`Text()`构造器会重用为第一个`Text()`构造器分配的内存,从而重用内存空间并使应用程序更快。
接下来,我们通过指定`FloatingActionButton`类并传递所需的参数来添加`floatingActionButton`属性。
......@@ -594,7 +594,7 @@ List<int> imageBytes = _image.readAsBytesSync();
String base64Image = base64Encode(imageBytes);
```
为了能够将图像文件与 HTTP 发布请求一起发送进行分析,我们需要将`png`文件转换为 Base64 格式,即,转换为仅包含**美国信息交换标准码的字符串****ASCII**值。 首先,我们使用`readAsByteSync()`读取`_image`的内容作为字节列表并将其存储在`imageBytes`中。 然后,通过将`imageBytes`列表作为`base64Encode`的参数传递给我们,以 Base64 格式对该列表进行编码。
为了能够将图像文件与 HTTP 发布请求一起发送进行分析,我们需要将`png`文件转换为 Base64 格式,即,转换为仅包含**美国信息交换标准码****ASCII**)的字符串值。 首先,我们使用`readAsByteSync()`读取`_image`的内容作为字节列表并将其存储在`imageBytes`中。 然后,通过将`imageBytes`列表作为`base64Encode`的参数传递给我们,以 Base64 格式对该列表进行编码。
4. 接下来,我们创建请求字符串,其格式如下:
......@@ -702,7 +702,7 @@ aaptOptions {
}
```
前面的代码段确保`tflite`文件未以压缩形式存储在 **Android 软件包工具包****APK**)中。
前面的代码段确保`tflite`文件未以压缩形式存储在 **Android 应用包****APK**)中。
3. 接下来,我们需要将已经保存的`model.tflite``labels.txt`文件包括在 assests 文件夹中,如以下屏幕截图所示:
......@@ -771,7 +771,7 @@ Future analyzeTFLite() async {
}
```
在成功选择并存储图像后,取决于用户单击的按钮,这是由`visionAPICall()``analyzeTFLite()`这两个定义的方法从`chooseImageGallery()`调用的,这取决于传递给窗口的值。 `PlantSpeciesRecognition`构造函数:Cloud Vision API 为 0,TensorFlow Lite 为 1。
在成功选择并存储图像后,取决于用户单击的按钮,这是由`visionAPICall()``analyzeTFLite()`这两个定义的方法从`chooseImageGallery()`调用的,这取决于传递给窗口的值。 `PlantSpeciesRecognition`构造:Cloud Vision API 为 0,TensorFlow Lite 为 1。
修改后的`chooseImagGallery()`方法如下所示:
......@@ -848,7 +848,7 @@ child: Column(
`_recognitions`列表中存储的 TensorFlow Lite 模型的结果逐元素进行迭代,并映射到使用`.map()`指定的列表。 列表中的每个元素都将进一步转换为`Text`,并作为与屏幕中心对齐的列子元素添加。
此外,请注意,需要将 Cloud Vision API 的输出或 TensorFlow Lite 模型的输出添加到堆栈中。 为了确保这一点,我们将前面的代码包装在`if-else`块中,这样,如果在构造函数中传递的值(即`modelChosen`)为 0,则添加前者的输出;如果该值是,则添加后者的输出。 是 1。
此外,请注意,需要将 Cloud Vision API 的输出或 TensorFlow Lite 模型的输出添加到堆栈中。 为了确保这一点,我们将前面的代码包装在`if-else`块中,这样,如果在构造中传递的值(即`modelChosen`)为 0,则添加前者的输出;如果该值是,则添加后者的输出。 是 1。
3. 最后,在各种图像集上运行 Cloud Vision API 将提供不同的输出。 以下屏幕快照显示了一些示例:
......
......@@ -51,7 +51,7 @@
2. 玻璃放在桌子上。
3. 汤匙放在桌子上。
因此,如果我们试图在图像周围创建标题,而不是简单地识别图像中的项目,我们还需要在可见项目之间建立一些位置和特征关系。 这将帮助我们获得良好的图像标题,例如**在桌子上一杯咖啡,旁边放着勺子**。 在图像标题生成算法中,我们尝试从图像创建此类标题。
因此,如果我们试图在图像周围创建标题,而不是简单地识别图像中的项目,我们还需要在可见项目之间建立一些位置和特征关系。 这将帮助我们获得良好的图像标题,例如**一杯咖啡在桌子上,旁边放着勺子**。 在图像标题生成算法中,我们尝试从图像创建此类标题。
但是,一个字幕可能并不总是足以描述风景,我们可能必须在两个可能相同的字幕之间进行选择,如以下屏幕截图所示:
......@@ -327,7 +327,7 @@ for imgid in train:
max_caption_len = max(max_caption_len, len(caption.split())+1)
```
3. 我们将使用 Keras 模型资源库中的`ResNet50`预训练模型。 我们将输入形状设置为 224 x 224 x 3,其中 224 x 244 是将传递给模型的每个图像的尺寸,而 3 是颜色通道的数量。 请注意,与**修改后的美国国家标准技术研究院****MNIST**)数据集不同,在该数据集中每个图像的尺寸均相等,而 Flickr8k 数据集则并非如此。 该代码可以在以下代码段中看到:
3. 我们将使用 Keras 模型资源库中的`ResNet50`预训练模型。 我们将输入形状设置为 224 x 224 x 3,其中 224 x 244 是将传递给模型的每个图像的尺寸,而 3 是颜色通道的数量。 请注意,与**美国国家混合标准技术研究院****MNIST**)数据集不同,在该数据集中每个图像的尺寸均相等,而 Flickr8k 数据集则并非如此。 该代码可以在以下代码段中看到:
```py
model = ResNet50(weights="imagenet", input_shape=(224,224,3))
......
......@@ -403,11 +403,11 @@ Future<void> signOut() async {
}
```
在上述方法中,我们首先将`_loading`的值设置为`true`,以便进度条显示在屏幕上,直到登录过程完成。 接下来,我们创建一个`userId`字符串,一旦登录/登录操作完成,该字符串将存储`userId`的值。 现在,我们检查`_formMode`的当前值。 如果等于`FormMode.SIGNIN`,则用户希望登录到现有帐户。 因此,我们使用传递到`SignupSigninScreen`构造函数中的实例来调用`Auth`类内部定义的`signIn()`方法。
在上述方法中,我们首先将`_loading`的值设置为`true`,以便进度条显示在屏幕上,直到登录过程完成。 接下来,我们创建一个`userId`字符串,一旦登录/登录操作完成,该字符串将存储`userId`的值。 现在,我们检查`_formMode`的当前值。 如果等于`FormMode.SIGNIN`,则用户希望登录到现有帐户。 因此,我们使用传递到`SignupSigninScreen`构造中的实例来调用`Auth`类内部定义的`signIn()`方法。
这将在后面的部分中详细讨论。 否则,如果`_formMode`的值等于`FormMode.SIGNUP`,则将调用`Auth`类的`signUp()`方法,并传递用户的邮件和密码以创建新帐户。 一旦成功完成登录/注册,`userId`变量将用于存储用户的 ID。 整个过程完成后,将`_loading`设置为`false`,以从屏幕上删除循环进度指示器。 另外,如果在用户登录到现有帐户时`userId`具有有效值,则将调用`onSignedIn()`,这会将用户定向到应用程序的主屏幕。
此方法也传递给`SignupSigninScreen`的构造函数,并将在后面的部分中进行讨论。 最后,我们将整个主体包裹在`try-catch`块中,以便在登录过程中发生的任何异常都可以捕获而不会导致应用程序崩溃,并可以在屏幕上显示。
此方法也传递给`SignupSigninScreen`的构造,并将在后面的部分中进行讨论。 最后,我们将整个主体包裹在`try-catch`块中,以便在登录过程中发生的任何异常都可以捕获而不会导致应用程序崩溃,并可以在屏幕上显示。
# 创建主屏幕
......@@ -446,7 +446,7 @@ AuthStatus authStatus = AuthStatus.NOT_SIGNED_IN;
}
```
使用在构造函数中传递的类的实例调用`Auth`类的`getCurrentUser()`。 如果该方法返回的值不为 null,则意味着用户已经登录。因此,`_userId`字符串变量的值设置为返回的值。 另外,将`authStatus`设置为`AuthStatus.SIGNED_IN.`,否则,如果返回的值为`null`,则意味着没有用户登录,因此`authStatus`的值设置为`AuthStatus.NOT_SIGNED_IN`
使用在构造中传递的类的实例调用`Auth`类的`getCurrentUser()`。 如果该方法返回的值不为 null,则意味着用户已经登录。因此,`_userId`字符串变量的值设置为返回的值。 另外,将`authStatus`设置为`AuthStatus.SIGNED_IN.`,否则,如果返回的值为`null`,则意味着没有用户登录,因此`authStatus`的值设置为`AuthStatus.NOT_SIGNED_IN`
4. 现在,我们将定义另外两个方法`onSignIn()``onSignOut()`,以确保将身份验证状态正确存储在变量中,并相应地更新用户界面:
......@@ -678,7 +678,7 @@ X_train, X_test = X_processed[0:train_size], X_processed[train_size:len(X_proces
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]
```
7. 接下来,我们基于**长短期记忆****LSTM**)创建基于**循环神经网络** k**RNN**)的学习方法 识别**常规**用户行为。 将单词嵌入添加到层中,以帮助维持单词向量和单词之间的关系:
7. 接下来,我们基于**长短期记忆****LSTM**)创建基于**循环神经网络****RNN**)的学习方法 识别**常规**用户行为。 将单词嵌入添加到层中,以帮助维持单词向量和单词之间的关系:
```py
model = Sequential()
......@@ -747,7 +747,7 @@ from keras.preprocessing.text import Tokenizer
from collections import OrderedDict
```
2. 现在,我们实例化一个 **Flask** 应用程序对象。 我们还将从上一节“构建用于身份验证有效性检查的模型”中加载保存的模型定义和模型权重。然后,我们重新编译模型,并使用`_make_predict_function( )`方法创建其预测方法,如以下步骤所示:
2. 现在,我们实例化一个`Flask`应用程序对象。 我们还将从上一节“构建用于身份验证有效性检查的模型”中加载保存的模型定义和模型权重。然后,我们重新编译模型,并使用`_make_predict_function( )`方法创建其预测方法,如以下步骤所示:
```py
app = Flask(__name__)
......@@ -901,7 +901,7 @@ RecaptchaV2Controller recaptchaV2Controller = RecaptchaV2Controller();
}
```
在上述方法中,我们仅使用`RecaptchaV2()`构造函数,即可为特定属性指定值。 添加您先前在`apiKey``apiSecret`属性中注册时保存的站点密钥和秘密密钥。 我们使用先前为属性控制器创建的`recaptcha`控制器`recaptchaV2Controller`的实例。 如果成功验证了用户,则将调用`_signinSignup()`方法以使用户登录。如果在验证期间发生错误,我们将打印错误。
在上述方法中,我们仅使用`RecaptchaV2()`构造,即可为特定属性指定值。 添加您先前在`apiKey``apiSecret`属性中注册时保存的站点密钥和秘密密钥。 我们使用先前为属性控制器创建的`recaptcha`控制器`recaptchaV2Controller`的实例。 如果成功验证了用户,则将调用`_signinSignup()`方法以使用户登录。如果在验证期间发生错误,我们将打印错误。
4. 现在,由于在用户尝试登录时应显示`reCaptcha`,因此我们将`createSigninButton()`中的登录凸起按钮的`onPressed`属性修改为`recaptchaV2Controller`
......
......@@ -78,7 +78,7 @@ def showim(image):
plt.show()
```
请注意,我们将图像的配色方案从 **Bl** **ue 绿色红色****BGR**)转换为 **RGB****红色绿色 蓝色**)。 这是由于默认情况下 OpenCV 使用 BGR 配色方案。 但是,matplotlib 在显示图片时会使用 RGB 方案,并且如果不进行这种转换,我们的图像就会显得奇怪。
请注意,我们将图像的配色方案从**蓝色绿色红色****BGR**)转换为**红色绿色蓝色****RGB**)。 这是由于默认情况下 OpenCV 使用 BGR 配色方案。 但是,matplotlib 在显示图片时会使用 RGB 方案,并且如果不进行这种转换,我们的图像就会显得奇怪。
4. 现在,让我们将图像读取到 Jupyter 笔记本中。 完成后,我们将能够看到加载的图像:
......
......@@ -21,11 +21,11 @@
# 强化学习导论
在过去的几年中,强化学习已成为机器学习研究人员中一个重要的研究领域。 人们越来越多地使用它来构建能够在任何给定环境中表现更好的代理商,以寻求对他们所执行行为的更好回报。 简而言之,这为我们提供了强化学习的定义–在人工智能领域,这是一种算法旨在创建可在任何给定条件下执行**动作**的虚拟**代理**的时候 在执行一系列动作后,在**环境**中将**状态**取得最佳的**奖励**
在过去的几年中,强化学习已成为机器学习研究人员中一个重要的研究领域。 人们越来越多地使用它来构建能够在任何给定环境中表现更好的代理商,以寻求对他们所执行行为的更好回报。 简而言之,这为我们提供了强化学习的定义–在人工智能领域,这是一种算法旨在创建可在任何给定条件下执行**动作**的虚拟**智能体**的时候 在执行一系列动作后,在**环境**中将**状态**取得最佳的**奖励**
让我们尝试通过定义与通用强化学习算法关联的变量来赋予此定义更多的结构:
* **代理**:执行动作的虚拟实体。 是替换游戏/软件的指定用户的实体。
* **智能体**:执行动作的虚拟实体。 是替换游戏/软件的指定用户的实体。
* **操作**`a`):代理可以执行的可能操作。
* **环境**`e`):在软件/游戏中可用的一组场景。
* **状态**`S`):所有方案的集合,以及其中可用的配置。
......@@ -196,7 +196,7 @@ Connect 4 的规则可能会有所不同,因此让我们为 AI 将学习的规
但是,这种形式有点冗长并且在计算上不是很友好。
* **计算有效形式**:在此形式中,我们将板存储为 2D NumPy 数组:
* **计算有效形式**:在此形式中,我们将板存储为 2D NumPy 数组:
```py
array([[1, 1, 0, 0, 0, 0, 0],
......@@ -356,7 +356,7 @@ def __init__(self, prototype = None):
self.winner = prototype.winner
```
在这里,您可以看到该类可以使用游戏的现有状态启动,并作为参数传递给该类的构造函数; 否则,该类将创建一个新的游戏状态。
在这里,您可以看到该类可以使用游戏的现有状态启动,并作为参数传递给该类的构造; 否则,该类将创建一个新的游戏状态。
3. `getRepresentativeString(self)`:此函数返回可以由人类玩家读取的游戏状态的格式正确的字符串表示形式。 其定义如下:
......@@ -608,9 +608,9 @@ GCP 上托管的模型将放置在 EC2 VM 实例中,并将包装在基于 Flas
还记得我们在讨论 Connect 4 AI 时制定的步骤吗? 让我们看看国际象棋项目是否也遵循相同的步骤:
1. 创建董事会的虚拟代表。 这是在`src/chess_zero/env/chess_env.py`文件中完成的。
1. 创建棋盘的虚拟代表。 这是在`src/chess_zero/env/chess_env.py`文件中完成的。
2. 创建允许根据游戏规则进行移动的功能。 这也可以在`src/chess_zero/env/chess_env.py`文件中完成。
3. **到位的状态管理系统**:此功能在许多文件上维护,例如`src/chess_zero/agent/player_chess.py``src/chess_zero/env/chess_env.py`
3. **原地的状态管理系统**:此功能在许多文件上维护,例如`src/chess_zero/agent/player_chess.py``src/chess_zero/env/chess_env.py`
4. **简化游戏**:这是通过`src/chess_zero/play_game/uci.py`文件完成的。
5. 创建一个可以生成示例游戏玩法的脚本,以供系统学习。 尽管此系统未将生成的游戏玩法明确地存储为磁盘上的文件,但该任务由`src/chess_zero/worker/self_play.py`执行。
6. 创建训练功能来训练系统。 这些训练功能位于`src/chess_zero/worker/sl.py``src/chess_zero/worker/self.py`处。
......
......@@ -47,7 +47,7 @@ Ian Goodfellow,Yoshua Bengio 和其他人在 NeurIPS 2014 中引入的 GAN 席
前面面孔中呈现的大量真实感证明了 GAN 的力量–在为他们提供良好的训练样本量之后,他们几乎可以学习生成任何类型的模式。
GAN 的核心概念围绕两个玩家玩游戏的想法。 在这个游戏中,一个人说出一个随机句子,另一个人仅仅考虑第一人称使用的单词就指出它是事实还是假。 第二个人唯一可以使用的知识是假句子和实句中常用的单词(以及如何使用)。 这可以描述为由 minimax 算法玩的两人游戏,其中每个玩家都试图以其最大能力抵消另一位玩家所做的移动。 在 GAN 中,第一个玩家是**生成器**`G`),第二个玩家是**鉴别符**`D`)。 G 和 D 都是常规 GAN 中的神经网络。 生成器从训练数据集中给出的样本中学习,并基于其认为当观察者查看时可以作为真实样本传播的样本来生成新样本。
GAN 的核心概念围绕两个玩家玩游戏的想法。 在这个游戏中,一个人说出一个随机句子,另一个人仅仅考虑第一人称使用的单词就指出它是事实还是假。 第二个人唯一可以使用的知识是假句子和实句中常用的单词(以及如何使用)。 这可以描述为由 minimax 算法玩的两人游戏,其中每个玩家都试图以其最大能力抵消另一位玩家所做的移动。 在 GAN 中,第一个玩家是**生成器**`G`),第二个玩家是**判别器**`D`)。 G 和 D 都是常规 GAN 中的神经网络。 生成器从训练数据集中给出的样本中学习,并基于其认为当观察者查看时可以作为真实样本传播的样本来生成新样本。
判别器从训练样本(正样本)和生成器生成的样本(负样本)中学习,并尝试对哪些图像存在于数据集中以及哪些图像进行分类。 它从 G 获取生成的图像,并尝试将其分类为真实图像(存在于训练样本中)或生成图像(不存在于数据库中)。
......@@ -67,8 +67,8 @@ GAN 的核心概念围绕两个玩家玩游戏的想法。 在这个游戏中,
GAN 具有许多不同的变体,所有变体都取决于它们正在执行的任务。 其中一些如下:
* **渐进式 GAN**:在 ICLR 2018 上的一篇论文中介绍,渐进式 GAN 的生成器和判别器均以低分辨率图像开始,并随着图像层的增加而逐渐受到训练,从而使系统能够生成 高分辨率图像。 例如,在第一次迭代中生成的图像为 10x10 像素,在第二代中它变为 20x20,依此类推,直到获得非常高分辨率的图像为止。 生成器和判别器都在深度上一起增长。
* **有条件的 GAN**:假设您有一个 GAN 可以生成 10 个不同类别的样本,但是在某个时候,您希望它在给定类别或一组类别内生成样本。 这是有条件 GAN 起作用的时候。有条件 GAN 使我们可以生成 GAN 中经过训练可以生成的所有标签中任何给定标签的样本。 在图像到图像的翻译领域中,已经完成了条件 GAN 的一种非常流行的应用,其中将一个图像生成为相似或相同域的另一个更逼真的图像。 您可以通过[这个页面](https://affinelayer.com/pixsrv/)上的演示来尝试涂鸦一些猫,并获得涂鸦的真实感版本。
* **堆叠式 GAN**:堆叠式 GAN 的最流行的应用是基于文本描述生成图像。 在第一阶段,GAN 生成描述项的概述,在第二阶段,根据描述添加颜色。 然后,后续层中的 GAN 将更多细节添加到图像中,以生成图像的真实感版本,如描述中所述。 通过观察堆叠 GAN 的第一次迭代中的图像已经处于将要生成最终输出的尺寸,可以将堆叠式 GAN 与渐进式 GAN 区别开来。但是,与渐进式 GAN 相似,在第一次迭代中, 图像是最小的,并且需要进一步的层才能将其馈送到判别器。
* **条件 GAN**:假设您有一个 GAN 可以生成 10 个不同类别的样本,但是在某个时候,您希望它在给定类别或一组类别内生成样本。 这是有条件 GAN 起作用的时候。有条件 GAN 使我们可以生成 GAN 中经过训练可以生成的所有标签中任何给定标签的样本。 在图像到图像的翻译领域中,已经完成了条件 GAN 的一种非常流行的应用,其中将一个图像生成为相似或相同域的另一个更逼真的图像。 您可以通过[这个页面](https://affinelayer.com/pixsrv/)上的演示来尝试涂鸦一些猫,并获得涂鸦的真实感版本。
* **栈式 GAN**:栈式 GAN 的最流行的应用是基于文本描述生成图像。 在第一阶段,GAN 生成描述项的概述,在第二阶段,根据描述添加颜色。 然后,后续层中的 GAN 将更多细节添加到图像中,以生成图像的真实感版本,如描述中所述。 通过观察堆叠 GAN 的第一次迭代中的图像已经处于将要生成最终输出的尺寸,可以将栈式 GAN 与渐进式 GAN 区别开来。但是,与渐进式 GAN 相似,在第一次迭代中, 图像是最小的,并且需要进一步的层才能将其馈送到判别器。
在此项目中,我们将讨论 GAN 的另一种形式,称为**超分辨率 GAN****SRGAN**)。 我们将在下一部分中了解有关此变体的更多信息。
......@@ -200,7 +200,7 @@ train_ds = div2k_train.dataset(batch_size=16, random_transform=True)
valid_ds = div2k_valid.dataset(batch_size=16, random_transform=True, repeat_count=1)
```
5. 现在,回想一下我们在“了解 GAN”部分中提供的 GAN 的定义。 为了使生成器开始产生判别器可以评估的伪造品,它需要学习创建基本的伪造品。 为此,我们将快速训练神经网络,以便它可以生成基本的超分辨率图像。 我们将其命名为**预训练**。 然后,我们将**预训练器**的权重转移到实际的 SRGAN,以便它可以通过使用判别器来学习更多。 让我们构建并运行**预训练器**
5. 现在,回想一下我们在“了解 GAN”部分中提供的 GAN 的定义。 为了使生成器开始产生判别器可以评估的伪造品,它需要学习创建基本的伪造品。 为此,我们将快速训练神经网络,以便它可以生成基本的超分辨率图像。 我们将其命名为**预训练**。 然后,我们将**预训练器**的权重转移到实际的 SRGAN,以便它可以通过使用判别器来学习更多。 让我们构建并运行**预训练器**
```py
pre_trainer = SrganGeneratorTrainer(model=generator(), checkpoint_dir=f'.ckpt/pre_generator')
......
......@@ -60,9 +60,9 @@ Google 的 MobileNet 于 2017 年推出。它是基于 TensorFlow 的一组移
阿里巴巴**移动神经网络****MNN**)是开源的轻量级 DL 推理引擎。 阿里巴巴工程副总裁贾阳清说:“与 TensorFlow 和 Caffe2 等通用框架相比,它既涵盖训练又包括推理,MNN 专注于推理的加速和优化,并解决了模型部署过程中的效率问题。 因此可以在移动端更高效地实现模型背后的服务,这实际上与 TensorRT 等服务器端推理引擎中的思想相符在大型机器学习应用中,推理的计算量通常是 10 倍以上 因此,进行推理的优化尤为重要。”
MNN 的主要关注领域是**深度神经网络****DNN**)模型的运行和推断。 它专注于模型的优化,转换和推断。 MNN 已被成功用于阿里巴巴公司的许多移动应用程序中,例如 Mobile Tmall,Mobile Taobao,Fliggy,UC,Qianuu 和 Juhuasuan。 它涵盖了搜索推荐,短视频捕获,直播,资产分配,安全风险控制,交互式营销,按图像搜索产品以及许多其他实际场景。 [菜鸟]呼叫机柜等**物联网****IoT**)设备也越来越多地使用技术。 MNN 具有很高的稳定性,每天可以运行超过 1 亿次。
MNN 的主要关注领域是**深度神经网络****DNN**)模型的运行和推断。 它专注于模型的优化,转换和推断。 MNN 已被成功用于阿里巴巴公司的许多移动应用程序中,例如 Mobile Tmall,Mobile Taobao,Fliggy,UC,Qianuu 和 Juhuasuan。 它涵盖了搜索推荐,短视频捕获,直播,资产分配,安全风险控制,交互式营销,按图像搜索产品以及许多其他实际场景。 菜鸟呼叫机柜等**物联网****IoT**)设备也越来越多地使用技术。 MNN 具有很高的稳定性,每天可以运行超过 1 亿次。
MNN 具有高度的通用性,并为市场上大多数流行的框架提供支持,例如 TensorFlow,Caffe 和**开放式神经网络交换****ONNX**)。 它与**卷积神经网络****CNN**)和**关系神经网络****RNN**)等通用神经网络兼容。 MNN 轻巧且针对移动设备进行了高度优化,并且没有依赖关系。 它可以轻松部署到移动设备和各种嵌入式设备。 它还通过**便携式操作系统接口****POSIX**)支持主要的 Android 和 iOS 移动操作系统以及嵌入式设备。 MNN 不受任何外部库的影响,可提供非常高的性能。 它的核心操作通过大量的手写汇编代码来实现,以充分利用 **Advanced RISC Machine****ARM**)CPU 的优势。 借助高效的**图像处理模块****IPM**),无需 libyuv 或 OpenCV 即可加速仿射变换和色彩空间变换,MNN 易于使用。
MNN 具有高度的通用性,并为市场上大多数流行的框架提供支持,例如 TensorFlow,Caffe 和**开放式神经网络交换****ONNX**)。 它与**卷积神经网络****CNN**)和**循环神经网络****RNN**)等通用神经网络兼容。 MNN 轻巧且针对移动设备进行了高度优化,并且没有依赖关系。 它可以轻松部署到移动设备和各种嵌入式设备。 它还通过**便携式操作系统接口****POSIX**)支持主要的 Android 和 iOS 移动操作系统以及嵌入式设备。 MNN 不受任何外部库的影响,可提供非常高的性能。 它的核心操作通过大量的手写汇编代码来实现,以充分利用**高级 RISC 机器****ARM**)CPU 的优势。 借助高效的**图像处理模块****IPM**),无需 libyuv 或 OpenCV 即可加速仿射变换和色彩空间变换,MNN 易于使用。
在积极开发和研究这些产品的同时,现在让我们看一下将来有望变得越来越重要的一些领域。
......@@ -88,7 +88,7 @@ Jason Antic 的 DeOldify 项目是使用 SAGANs 完成的工作的衍生产品
![](img/48375cc3-f5a9-403a-b715-6aa4d5b0b24d.png)
**Dorothea Lange(1936)的《移民母亲**。 图像取自 [DeOldify GitHub 存储库](https://github.com/jantic/DeOldify)。 该项目可通过[这里](https://deoldify.ai/)进行测试和演示。 您可以在[这个页面](https://arxiv.org/abs/1805.08318)上了解有关 SAGAN 的更多信息。
**Dorothea Lange(1936)的《移民母亲》**。 图像取自 [DeOldify GitHub 存储库](https://github.com/jantic/DeOldify)。 该项目可通过[这里](https://deoldify.ai/)进行测试和演示。 您可以在[这个页面](https://arxiv.org/abs/1805.08318)上了解有关 SAGAN 的更多信息。
# 图片动画
......@@ -118,7 +118,7 @@ Facebook 是一个流行的社交媒体平台,具有用于多个平台的专
# 在 Cloud VM 上设置深度学习环境
在本节中,我们将提供有关如何在 **Google Cloud Platform****GCP**)计算引擎**虚拟机**[HTG6 VM )实例以执行深度学习。 您也可以轻松地将此处描述的方法扩展到其他云平台。
在本节中,我们将提供有关如何在 **Google Cloud Platform****GCP**)计算引擎**虚拟机**VM)实例以执行深度学习。 您也可以轻松地将此处描述的方法扩展到其他云平台。
我们将以快速指南开始,介绍如何创建您的 GCP 帐户并为其启用结算功能。
......@@ -370,7 +370,7 @@ Flutter 是 Google 的一个工具包,用于使用单个代码库构建本地
3. 在[开始]搜索栏中输入`env`,然后选择[编辑环境变量]。
4. 使用`;`作为分隔符,将`flutter/bin`的完整路径附加到**用户变量**下的**路径**。
如果缺少 **Path** 条目,只需创建一个新的 Path 变量并将`path`设置为`flutter/bin`作为其值。
如果缺少`Path`条目,只需创建一个新的 Path 变量并将`path`设置为`flutter/bin`作为其值。
5. 在终端中运行`flutter doctor`。
......@@ -655,9 +655,9 @@ Flutter 安装可以通过以下方式验证:
* 您也可以尝试设置用于调试的真实设备。
3. 单击**设置**按钮-位于右上角的齿轮图标齿轮(现已标记为红色或橙色指示器),位于 DEBUG 文本框旁边,显示为 **No Configuration**。 选择 Flutter,然后选择调试配置以创建仿真器(如果已关闭)或运行仿真器或已连接的设备。
3. 单击**设置**按钮-位于右上角的齿轮图标齿轮(现已标记为红色或橙色指示器),位于 DEBUG 文本框旁边,显示为`No Configuration`。 选择 Flutter,然后选择调试配置以创建仿真器(如果已关闭)或运行仿真器或已连接的设备。
4. 导航到调试| 开始调试或按`F5`。
5. 等待应用启动,进度会显示在 **DEBUG CONSOLE** 视图中:
5. 等待应用启动,进度会显示在`DEBUG CONSOLE`视图中:
![](img/677a90f4-1891-4074-a3ea-09221863fb64.png)
......@@ -676,4 +676,4 @@ Flutter 提供的快速开发周期使其适合于时间优化的开发。 它
1. 打开`lib/main.dart`。
2. 将`You have pushed the button this many times:`字符串更改为`You have clicked the button this many times:`。 不要停止您的应用。 让您的应用程序运行。
3. 保存更改:调用**全部保存**,或单击 **Hot Reload**
\ No newline at end of file
3. 保存更改:调用**全部保存**,或单击`Hot Reload`
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册