提交 d857931e 编写于 作者: W wizardforcel

2021-01-23 22:15:35

上级 2af7c240
......@@ -548,7 +548,7 @@ False
我们可以看到,Autograd 可以跟踪操作。 当我们从`x``y=2*x+3`创建张量`y`时,我们会看到一个梯度函数`grad_fn`被附加到张量上。
我们首先创建一种新的张量,将`require_grad`设置为`True`,然后创建一个张量`y`,使得`y = 2x^2 + 3`并发现`y`具有一个 附加了不同的梯度函数。 我们还研究了使用`requires_grad_()`,最后使用了`no_grad()`
我们首先创建一种新的张量,将`require_grad`设置为`True`,然后创建一个张量`y`,使得`y = 2x^2 + 3`并发现`y`具有一个附加到它的不同的梯度函数。 我们还研究了使用`requires_grad_()`,最后使用了`no_grad()`
PyTorch 有一个名为`autograd`的软件包,可以对张量上的所有操作执行所有跟踪和自动微分。 这是一个按运行定义的框架,这意味着您的反向传播是由代码的运行方式定义的,并且每次迭代都可以不同。 我们利用`torch.Tensor`类的`require_grad`属性来确定梯度计算的状态,并在调用`.backward()`方法后自动计算其`.grad`属性中的所有梯度和张量的梯度。
......
......@@ -232,7 +232,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
当传递输入时,将引用模型对象的名称自动调用 forward 方法。 `nn.Module`自动创建将在正向方法中使用的权重和偏差张量。 线性单元本身定义了线性函数,例如`xW + B`; 要具有非线性功能,我们需要插入非线性激活函数,在这里我们使用最流行的激活函数之一 ReLU,尽管您可以在 PyTorch 中使用其他可用的激活函数。
我们的输入层有 784 个单位(从`28 x 28`像素开始),第一层具有 ReLU 激活的 256 个单位,然后具有 ReLU 激活的 128 个单位,最后有 softmax 激活的 10 个单位。 我们通过 softmax 压缩最终层输出的原因是因为我们希望有 1 个输出类的概率高于所有其他类,并且输出概率之和应等于 1。softmax 函数的参数`dim=1`确保在输出的各列中采用 softmax。 然后,我们使用模型类创建一个对象,并使用`print(model)`打印该类的详细信息。
我们的输入层有 784 个单位(从`28 x 28`像素开始),第一层具有 ReLU 激活的 256 个单位,然后具有 ReLU 激活的 128 个单位,最后有 softmax 激活的 10 个单位。 我们通过 softmax 压缩最终层输出的原因是因为我们希望有 1 个输出类的概率高于所有其他类,并且输出概率之和应等于 1。softmax 函数的参数`dim=1`是为了确保在输出的各列中采用 softmax。 然后,我们使用模型类创建一个对象,并使用`print(model)`打印该类的详细信息。
# 更多
......@@ -461,9 +461,9 @@ Training loss: 0.2596
在本秘籍中,我们首先使用`Adam`优化器定义优化器,然后为优化器设置学习率,并查看默认参数。 我们设置一个时期`10`,并为每个时期开始迭代,在每次迭代中将`running_loss`设置为 0,并在该时期内对每个图像进行迭代(模型看到数据集的次数)。 我们首先使用`.zero_grad()`方法清除梯度。 PyTorch 在每次反向传播时都会累积梯度,这在某些情况下很有用,因此将其导入以将梯度归零,以正确更新模型参数。
接下来,我们通过将每批 64 幅图像(每幅图像由`28 x 28`像素组成)展平到 784 来重塑图像,从而将张量形状从`64 x 28 x 28`更改为`64 x 784`,因为我们的模型期望这种形状 输入。 接下来,我们将此输入发送到模型,并从模型中获得该批量的输出预测,然后将其传递给损失函数,也称为`criterion`; 在那里,它评估了预测班级与实际班级之间的差异。
接下来,我们通过将每批 64 幅图像(每幅图像由`28 x 28`像素组成)展平到 784 来重塑图像,从而将张量形状从`64 x 28 x 28`更改为`64 x 784`,因为我们的模型期望这种输入形状。 接下来,我们将此输入发送到模型,并从模型中获得该批量的输出预测,然后将其传递给损失函数,也称为`criterion`; 在那里,它评估了预测班级与实际班级之间的差异。
`loss.backward()`函数计算了梯度(即,误差相对于权重的偏导数),我们调用了`optimizer.step()`函数来更新模型的权重,以适应评估的误差。 `.item()`方法从单个元素张量中拉出标量,因此使用`loss.item()`从批量中获得`error`的标量值,将其累加到所有批量的损失中,最后将损失打印在 时代的结束
`loss.backward()`函数计算了梯度(即,误差相对于权重的偏导数),我们调用了`optimizer.step()`函数来更新模型的权重,以适应评估的误差。 `.item()`方法从单个元素张量中拉出标量,因此使用`loss.item()`从批量中获得`error`的标量值,将其累加到所有批量的损失中,最后在周期末尾打印损失
# 更多
......
......@@ -37,7 +37,7 @@ CNN 使用过滤器从输入图像中拾取特征; 具有足够数量的滤镜
我们需要了解 CNN 的另外两个关键元素,如下所示:
* **跨步**:这是在图像的下一个小块上使用滤镜应用卷积网络之前,我们水平和垂直移动的像素数。
* **填充**:这是我们在卷积时应用于图像边缘的策略,具体取决于我们是在卷积后要保持张量的尺寸不变还是仅在滤镜适合的情况下应用卷积 与输入图像。 如果要保持尺寸不变,则需要对边缘进行零填充,以使原始尺寸在卷积后与输出匹配。 这称为**相同填充**。 但是,如果我们不想保留原始尺寸,则会将过滤器无法完全容纳的位置截断,这称为**有效填充**
* **填充**:这是我们在卷积时应用于图像边缘的策略,具体取决于我们是在卷积后要保持张量的尺寸不变还是仅在滤镜适合的情况下对输入图像应用卷积。 如果要保持尺寸不变,则需要对边缘进行零填充,以使原始尺寸在卷积后与输出匹配。 这称为**相同填充**。 但是,如果我们不想保留原始尺寸,则会将过滤器无法完全容纳的位置截断,这称为**有效填充**
这是这两个填充的示意图:
......@@ -138,7 +138,7 @@ Conv2d(3, 16, kernel_size=(3, 4), stride=(3, 3), padding=(1, 2))
# 探索池化
现在,我们进入 CNN 的下一个关键层-池化层。 到目前为止,我们一直在处理图像而不改变帧的空间尺寸(考虑相同的填充); 相反,我们一直在增加通道/过滤器的数量。 池化层用于减小输入的空间尺寸,并保留其深度。 当我们从 CNN 的初始层移到后面的层时,我们希望在图像中识别出比实际逐个像素信息更多的概念意义,因此我们想从输入和抛出中识别并保留关键信息 剩下的。 池化层可以帮助我们做到这一点。
现在,我们进入 CNN 的下一个关键层-池化层。 到目前为止,我们一直在处理图像而不改变帧的空间尺寸(考虑相同的填充); 相反,我们一直在增加通道/过滤器的数量。 池化层用于减小输入的空间尺寸,并保留其深度。 当我们从 CNN 的初始层移到后面的层时,我们希望在图像中识别出比实际逐个像素信息更多的概念意义,因此我们想从输入和抛出中识别并保留剩下的关键信息。 池化层可以帮助我们做到这一点。
这是最大池化的示意图:
......@@ -346,7 +346,7 @@ PyTorch 无法直接处理图像像素,需要将其内容作为张量。 为
在前面的代码段中,我们研究了`torchvision`中可用的各种转换。 这些使我们可以获取输入图像并将其格式化为所需尺寸和属性的张量,然后将其输入到割炬模型中。 我们研究的第一种方法是`toTensor()`方法,该方法将给定的输入图像转换为张量。 然后我们可以使用`Normalize()`方法对该输入图像张量进行归一化。 `Normalize()`方法采用两个元组,其中第一个元组是输入图像中每个通道的均值序列,第二个元组是每个通道的标准差序列。
此外,我们可以使用`Resize()`方法将给定图像的大小调整为所需尺寸,如果给定整数,则将其与较小边缘的长度匹配,如果给定元组,则将其与图像的高度和宽度匹配 图片。 在某些情况下,有关图像的关键信息位于其中心,在这种情况下,可以裁剪并仅考虑给定图像的中心; 为此,您可以使用`CenterCrop()`方法。 然后,我们传入一个整数以从中心裁剪一个正方形,或将与高度和宽度匹配的序列传递给`CenterCrop()`
此外,我们可以使用`Resize()`方法将给定图像的大小调整为所需尺寸,如果给定整数,则将其与较小边缘的长度匹配,如果给定元组,则将其与图像的高度和宽度匹配。 在某些情况下,有关图像的关键信息位于其中心,在这种情况下,可以裁剪并仅考虑给定图像的中心; 为此,您可以使用`CenterCrop()`方法。 然后,我们传入一个整数以从中心裁剪一个正方形,或将与高度和宽度匹配的序列传递给`CenterCrop()`
另一个重要任务是填充图像以匹配特定尺寸。 为此,我们使用`Pad()`方法。 我们将填充大小作为整数表示,用于在所有面上进行均等大小的填充,或者将序列作为由两个元素组成的序列,用于填充大小分别对应于左/右和上/下。 此外,我们可以将左侧,顶部,右侧和底部的填充大小作为由四个元素组成的序列传递。 然后,我们将填充值作为整数提供,如果它是三个元素的元组,则分别用作 R,G 和 B 通道的填充值。 除此之外,`Pad()`方法还具有`padding_mode`参数,该参数具有以下可能性:
......@@ -680,7 +680,7 @@ CNN(
对于第一个全连接层,我们有 1,024 个输入(通过将最大池后的`64 x 4 x 4`张量展平而获得)和 512 个输出。 对于最后一个全连接层,我们有 512 个输入和 10 个输出,代表输出类别的数量。 我们还为全连接层定义了一个丢弃层,概率为 0.3。
接下来,我们定义`forward()`方法,将`__init__()`方法中定义的组件连接在一起。 因此,输入批量的 16 个张量(每个张量为`32 x 32 x 3`)经过第一个卷积层,然后经过 ReLU,然后是最大合并层,以形成尺寸为`16 x 16 x 16`的输出张量,然后通过第二个卷积层,然后是 ReLU 和最大池化层,输出的尺寸为`8 x 8 x 32`,然后是第三个卷积层,然后是 ReLU 和最大池 层,尺寸为`4 x 4 x 64`。此后,我们将图像展平为 1,024 个元素的向量,并将其通过丢弃层传递到第一个全连接层,提供 512 个输出,然后是 ReLU 和 在最后一个全连接层中删除,以提供所需的输出数量,本例中为 10。
接下来,我们定义`forward()`方法,将`__init__()`方法中定义的组件连接在一起。 因此,输入批量的 16 个张量(每个张量为`32 x 32 x 3`)经过第一个卷积层,然后经过 ReLU,然后是最大合并层,以形成尺寸为`16 x 16 x 16`的输出张量,然后通过第二个卷积层,然后是 ReLU 和最大池化层,输出的尺寸为`8 x 8 x 32`,然后是第三个卷积层,然后是 ReLU 和最大池化层,尺寸为`4 x 4 x 64`。此后,我们将图像展平为 1,024 个元素的向量,并将其通过丢弃层传递到第一个全连接层,提供 512 个输出,然后是 ReLU 和丢弃,在最后一个全连接层中,以提供所需的输出数量,本例中为 10。
然后,我们从 CNN 类实例化该模型并打印该模型。
......@@ -869,7 +869,7 @@ valid_loss = valid_loss/len(valid_loader.sampler)
# 更多
我们已经运行了训练过的模型,我们需要根据保持数据或测试数据(即该模型尚未看到的数据)评估模型。 通过这样做,我们可以评估模型的真实性能。 为此,您将必须进入模型测试批量,并且对于每个批量,必须执行`_, prediction = torch.max(output, 1)`将 softmax 概率转换为实际预测,并使用`prediction.eq(target.data.view_as(prediction))`将预测与真实输出标签进行比较,其中 我们确保预测张量和输出张量的尺寸相同。 这将返回一个张量,其中匹配的张量为 1,不匹配的张量为 0。 我们可以使用它来计算每个批量中模型的准确率,并将其汇总到整个测试数据集中。
我们已经运行了训练过的模型,我们需要根据保持数据或测试数据(即该模型尚未看到的数据)评估模型。 通过这样做,我们可以评估模型的真实性能。 为此,您将必须进入模型测试批量,并且对于每个批量,必须执行`_, prediction = torch.max(output, 1)`将 softmax 概率转换为实际预测,并使用`prediction.eq(target.data.view_as(prediction))`将预测与真实输出标签进行比较,其中我们确保预测张量和输出张量的尺寸相同。 这将返回一个张量,其中匹配的张量为 1,不匹配的张量为 0。 我们可以使用它来计算每个批量中模型的准确率,并将其汇总到整个测试数据集中。
# 另见
......
......@@ -170,7 +170,7 @@ pip install torchtext
对于数字字段,我们将`use_vocab`设置为`False`,这是我们为审阅标签所做的,因为我们假设标签的负数值为`0`,正数的值为`1`。 我们从分词部分传递了`tokenizer`函数作为`tokenize`参数; 我们甚至可以通过设置`tokenize="spacy"`使用`spacy`的标记器。 对于某些任务,例如,使用`Sequence`对模型进行排序,我们可能需要特殊的标记来指示序列的开始和结束。 可以通过设置`init_token``eos_token`参数轻松完成。 这对于序列到序列的模型是正确的,并且如果在模型评估期间用于训练模型的词汇表中不存在标记(词汇表外),则可以使用自定义标记来替换这些标记, 设置`unk_token`参数。
然后,将`batch_first`设置为`True`,以使输出张量的第一维为批量维,如果`fix_length`参数设置为整​​数值,则将对输入设置固定长度 使用此字段
然后,将`batch_first`设置为`True`,以使输出张量的第一维为批量维,如果`fix_length`参数设置为整​​数值,则使用此字段将对输入设置固定长度
# 更多
......@@ -464,11 +464,11 @@ return self.fc(hidden)
# 工作原理
我们使用`torch.nn`模块创建了从`torch.nn.Module`继承的模型类`LSTMClassifier`,并初始化了基类构造器。 然后,我们定义嵌入层,其中输入维与词汇量大小相同,输出为嵌入维,然后将嵌入层输出传递到 LSTM 层,其中输入维为嵌入维,然后 定义隐藏状态维度。
我们使用`torch.nn`模块创建了从`torch.nn.Module`继承的模型类`LSTMClassifier`,并初始化了基类构造器。 然后,我们定义嵌入层,其中输入维与词汇量大小相同,输出为嵌入维,然后将嵌入层输出传递到 LSTM 层,其中输入维为嵌入维,然后定义隐藏状态维度。
然后,我们定义了全连接层和丢弃层。 接下来,我们定义`forward()`方法,该方法接受输入序列,并将其传递给嵌入层,从而产生尺寸为`embedding_dim`的输出,该输出是输入序列的嵌入向量。 然后将这个字向量传递到 LSTM 层,该层输出三个状态-输出状态,隐藏状态和单元状态。
隐藏状态张量保存了到目前为止 LSTM 所见过的所有序列的信息,因此我们采用了隐藏状态,应用了`dropout`,并将其通过全连接层传递给最终输出向量,其大小等于 类数。 例如,对于有毒评论数据集,输出类别的数量为六; 但是,对于具有两个状态(正向和负向)的情感分析器,我们甚至可以考虑只具有一个输出,以便`1`代表积极情感,`0`代表消极情感。
隐藏状态张量保存了到目前为止 LSTM 所见过的所有序列的信息,因此我们采用了隐藏状态,应用了`dropout`,并将其通过全连接层传递给最终输出向量,其大小等于类数。 例如,对于有毒评论数据集,输出类别的数量为六; 但是,对于具有两个状态(正向和负向)的情感分析器,我们甚至可以考虑只具有一个输出,以便`1`代表积极情感,`0`代表消极情感。
# 更多
......
# 探索生成对抗网络
**生成对抗网络****GAN**)是一种机器学习技术,其中同时训练两种模型:一种专门用于创建伪造数据,另一种专门用于区分伪造数据和伪造数据。 真实数据。 术语*生成*反映了以下事实:这些神经网络用于创建新数据,而术语*对抗*来自以下事实:两个模型相互竞争,从而提高了质量 生成的数据
**生成对抗网络****GAN**)是一种机器学习技术,其中同时训练两种模型:一种专门用于创建伪造数据,另一种专门用于区分伪造数据和伪造数据。 真实数据。 术语*生成*反映了以下事实:这些神经网络用于创建新数据,而术语*对抗*来自以下事实:两个模型相互竞争,从而提高了生成的数据的质量
GAN 中的两个模型称为生成器和判别器,其中生成器负责创建数据,判别器接收数据并将其分类为真实数据或由生成器生成。 生成器的目标是创建与训练集中的真实数据没有区别的数据样本。
我们可以用一个类比来理解 GAN 的概念,即犯罪分子(产生者)想要伪造金钱,而侦探(鉴别者)则试图抓住他。 假币的外观越真实,侦探在检测到假币时就必须越好,越高效,这意味着伪钞的质量必须提高到足以使侦探无法发现。
生成器从判别器的分类反馈中学习。 判别器的目标是确定其输入是真实的(来自训练数据集)还是伪造的(来自生成器),因此,每当辨别器将虚假图像分类为真实的错误时,生成器都会获得正反馈 一份好工作。 相反,每当判别器正确捕捉到生成器生成的图像为伪造图像时,生成器就会收到需要改进的反馈。
生成器从判别器的分类反馈中学习。 判别器的目标是确定其输入是真实的(来自训练数据集)还是伪造的(来自生成器),因此,每当辨别器将虚假图像分类为真实的错误时,生成器都会获得表现良好的正反馈。 相反,每当判别器正确捕捉到生成器生成的图像为伪造图像时,生成器就会收到需要改进的反馈。
判别器基本上是一个分类器,并且像任何分类器一样,它从真实标签(它在这种情况下是真实的或假的)中了解到其预测有多远。 因此,随着生成器在生成逼真的数据方面变得更好,判别器在从真实标签中辨别伪造品方面也必须变得更好。 这样,两个网络都可以同时改善。
......@@ -16,7 +16,7 @@ GAN 中的两个模型称为生成器和判别器,其中生成器负责创建
![](img/13480561-764e-43be-b39a-07d7656540db.png)
在此图中,有一个数据源,其中包含训练图像`x`,生成器必须捕获其属性并重新创建。 生成器接收随机向量`z`,该向量充当生成器创建伪图像的种子。 生成器获取种子并生成`x*`图像,判别器从真实和虚假图像中获取图像,并输出给定​​输入为真实的概率(假设 图像用 1 表示,伪图像用 0 表示)。 然后,我们获得分类误差,并使用它来迭代训练判别器和生成器。 判别器的目的是使分类误差最小,而发生器的目的是使分类误差最大化。
在此图中,有一个数据源,其中包含训练图像`x`,生成器必须捕获其属性并重新创建。 生成器接收随机向量`z`,该向量充当生成器创建伪图像的种子。 生成器获取种子并生成`x*`图像,判别器从真实和虚假图像中获取图像,并输出给定​​输入为真实的概率(假设真实图像用 1 表示,伪图像用 0 表示)。 然后,我们获得分类误差,并使用它来迭代训练判别器和生成器。 判别器的目的是使分类误差最小,而发生器的目的是使分类误差最大化。
从理论上讲,生成器和判别器达到平衡,其中生成器已捕获了生成的伪图像中真实图像的所有特征,而从进一步的训练中没有任何收获。 类似地,鉴别者只能以 50% 的概率猜测图像是伪造的还是真实的,因为这两个图像就其性质而言完全无法区分。 在那个状态下,GAN 已经收敛。 然而,实际上,这种状态很难实现。 在本章中,我们将探讨 GAN 的概念以及 PyTorch 中各种 GAN 的实现。
......@@ -136,7 +136,7 @@ def forward(self, input):
# 准备好
在本秘籍中,我们将严重依赖第 3 章,“用于计算机视觉的卷积神经网络”的秘籍,因此最好快速浏览 第 3 章,“用于计算机视觉的卷积神经网络”。
在本秘籍中,我们将严重依赖第 3 章,“用于计算机视觉的卷积神经网络”的秘籍,因此最好快速浏览第 3 章,“用于计算机视觉的卷积神经网络”。
# 操作步骤
......@@ -547,7 +547,7 @@ Epoch : | 005 / 050 |
我们还创建了固定噪声,用于可视化 GAN 模型在迭代过程中的改进。 我们使用 ADAM 优化器分别更新了生成器和判别器`goptimizer`和`doptimizer`的权重。 然后,我们进行了准备以存储一些模型指标,以查看模型在迭代过程中的变化,然后开始训练循环。
我们遍历了每个小批量并开始训练判别器。 我们仅从 MNIST 数据集中获取图像,然后使用`real_images = data[0].to(device)`将其移动到设备中; 由于图像全部来自 MNIST 数据集,因此我们知道它们是真实的,因此我们创建了与小批量相同大小的标签向量,并用真实图像标签 1 进行填充。然后,将这些真实图像传递到 预测的判别器,然后使用此预测从准则中得出误差`derror_real`并计算梯度。 然后,我们创建了相等数量的噪声向量,并将它们传递给生成器以生成图像,然后将这些生成的图像传递给判别器以获取预测,然后从准则`derror_fake`中获取误差。 然后,我们再次进行此操作以计算和累积梯度。 然后,我们从真实图像和伪图像中获得了误差之和,以得出总的判别器误差,并更新判别器的权重。
我们遍历了每个小批量并开始训练判别器。 我们仅从 MNIST 数据集中获取图像,然后使用`real_images = data[0].to(device)`将其移动到设备中; 由于图像全部来自 MNIST 数据集,因此我们知道它们是真实的,因此我们创建了与小批量相同大小的标签向量,并用真实图像标签 1 进行填充。然后,将这些真实图像传递到判别器来预测,然后使用此预测从准则中得出误差`derror_real`并计算梯度。 然后,我们创建了相等数量的噪声向量,并将它们传递给生成器以生成图像,然后将这些生成的图像传递给判别器以获取预测,然后从准则`derror_fake`中获取误差。 然后,我们再次进行此操作以计算和累积梯度。 然后,我们从真实图像和伪图像中获得了误差之和,以得出总的判别器误差,并更新判别器的权重。
然后,我们开始训练生成器,并且生成器应该能够欺骗判别器。 生成器必须纠正鉴别者正确预测生成的图像为假的情况。 因此,只要来自判别器的预测将生成的图像标记为伪造,就会增加生成器损失`gerror`。 然后,我们计算梯度并更新发生器权重。
......@@ -733,7 +733,7 @@ Nvidia 最初执行 PGGAN 的过程要花一到两个月的时间。 但是,
# 工作原理
在此秘籍中,我们加载了在`celebAHQ`数据集上训练的 PGGAN 预训练模型; 为此,我们使用了`torch.hub`中的`load()`方法。 然后,我们定义了创建和生成尺寸为`num_images x 512`的噪声向量所需的图像数量,因为此模型使用大小为 512 的噪声向量进行训练,所有噪声向量都由`buildNoiseData()`方法内部处理 在模型对象中可用。
在此秘籍中,我们加载了在`celebAHQ`数据集上训练的 PGGAN 预训练模型; 为此,我们使用了`torch.hub`中的`load()`方法。 然后,我们定义了创建和生成尺寸为`num_images x 512`的噪声向量所需的图像数量,因为此模型使用大小为 512 的噪声向量进行训练,所有噪声向量都由`buildNoiseData()`方法内部处理,它在模型对象中可用。
`model.test()`方法生成了我们用来制作网格的图像。 钳位方法将所有值限制在`min`和`max`定义的范围内。 `.cpu()`方法将生成的图像移至 CPU,我们使用`permute`固定尺寸。 最后,`plt.imshow()`显示了我们创建的网格。
......
......@@ -660,13 +660,13 @@ return total_reward
# 工作原理
在本秘籍中,我们完成了深度遗传算法的一些关键功能。 我们研究了三个不同的功能-第一个功能`eval_agent()`与我们在“训练 DQN”秘籍中看到的功能非常相似,其中我们使用了代理,该代理是一种神经网络模型,可以预测 并执行直`MAX_STEP`(对于`cartpole-v1`为 500)或终端为`True`并返回分数的动作。
在本秘籍中,我们完成了深度遗传算法的一些关键功能。 我们研究了三个不同的功能-第一个功能`eval_agent()`与我们在“训练 DQN”秘籍中看到的功能非常相似,其中我们使用了代理,该代理是一种神经网络模型,它预测要采取的动作,并执行`MAX_STEP`(对于`cartpole-v1`为 500)或终端为`True`并返回分数的动作。
然后,我们使用第二个函数`agent_score()`返回指定数量`runs`之上的平均分数,并返回该平均分数,以确保模型的随机性能不佳。 最后一个函数`all_agent_score()`仅循环遍历一代中的所有代理,并获得一代中所有代理的平均分数。
# 使智能体突变
在本秘籍中,我们将介绍使智能体突变。 在从给定的一代中选择性能最佳的模型之后,然后再创建下一代代理,我们将对这些选定代理的权重进行轻微的随机变化,这使代理可以探索更多区域以获得更好的回报,只是 就像生物进化如何运作
在本秘籍中,我们将介绍使智能体突变。 在从给定的一代中选择性能最佳的模型之后,然后再创建下一代代理,我们将对这些选定代理的权重进行轻微的随机变化,这使代理可以探索更多区域以获得更好的回报,就像生物进化的工作原理一样
# 操作步骤
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册