许多人会认为机器永远无法达到人类的智能水平,因为用来学习或执行智能任务的 AI 逻辑是由人类编程的,并且它们缺乏人类所拥有的意识和自我意识。 但是,一些研究人员提出了另一种想法,即人类意识和自我意识就像无限循环程序,可以通过反馈从周围的环境中学习。 因此,也有可能将意识和自我意识编程到机器中。 但是,就目前而言,我们将把 AI 的这一哲学方面再留一天,并简单地讨论我们所知道的 AI。
简而言之,AI 可以定义为机器(通常是计算机或机器人)以类人的智力执行任务的能力,例如具有推理,学习经验,归纳,破译含义和拥有的能力等属性。 视觉感知。 我们将坚持这个更实际的定义,而不是关注 AI 效应所带来的哲学内涵以及 AI 奇异性的前景。 尽管可能存在关于 AI 可以实现和不能实现的争论,但基于 AI 的系统的最新成功故事却令人 over 目。 下图描述了 AI 的一些较新的主流应用程序:
简而言之,AI 可以定义为机器(通常是计算机或机器人)以类人的智力执行任务的能力,例如具有推理,学习经验,归纳,破译含义和拥有的能力等属性。 视觉感知。 我们将坚持这个更实际的定义,而不是关注 AI 效应所带来的哲学内涵以及 AI 奇异性的前景。 尽管可能存在关于 AI 可以实现和不能实现的争论,但基于 AI 的系统的最新成功故事却令人瞩目。 下图描述了 AI 的一些较新的主流应用程序:
![](img/623d9065-122c-4066-bfed-634f7ac3cd75.png)
...
...
@@ -82,7 +82,7 @@
# 神经激活单位
取决于架构和当前的问题,在神经网络中使用了几种神经激活单元。 我们将讨论最常用的激活函数,因为它们在确定网络架构和性能方面起着重要作用。 线性和 S 形单位激活函数主要用于人工神经网络,直到 Hinton 等人发明的**整流线性单元**(**ReLUs**)彻底改变了神经网络的性能。
通常,卷积层之后是池化层,池化层基本上总结了由池化的接收场确定的邻域中的输出特征映射激活。 例如,一个 2 x 2 的接收场将收集四个相邻的输出特征映射激活的本地信息。 对于最大池操作,将选择四个激活的最大值作为输出,而对于平均池化,将选择四个激活的平均值。 合并降低了特征映射的空间分辨率。 例如,对于具有 2 x 2 接收场的 224 x 224 尺寸的特征映射池化操作,特征映射的空间尺寸将减小为 112 x 112。
通常,卷积层之后是池化层,池化层基本上总结了由池化的接收场确定的邻域中的输出特征映射激活。 例如,一个`2 x 2`的接收场将收集四个相邻的输出特征映射激活的本地信息。 对于最大池操作,将选择四个激活的最大值作为输出,而对于平均池化,将选择四个激活的平均值。 合并降低了特征映射的空间分辨率。 例如,对于具有`2 x 2`接收场的`224 x 224`尺寸的特征映射池化操作,特征映射的空间尺寸将减小为`112 x 112`。
要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为 224 x 224 的输入图像,而下一层的期望输出为尺寸为 224 x 224 的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数 是 224 x 224 x 224 x 224.对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用 3 x 3 过滤器内核,我们只需要学习 9 个权重即可,而不是 224 x 224 x 224 x 224 权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。
要注意的一件事是,卷积运算减少了每层要学习的权重数。 例如,如果我们有一个空间尺寸为`224 x 224`的输入图像,而下一层的期望输出为尺寸为` 224 x 224 `的尺寸,那么对于具有完整连接的传统神经网络来说,要学习的权重数是`224 x 224 x 224 x 224`。对于具有相同输入和输出尺寸的卷积层,我们需要学习的只是滤波器内核的权重。 因此,如果我们使用`3 x 3`过滤器内核,我们只需要学习 9 个权重即可,而不是`224 x 224 x 224 x 224`权重。 这种简化是有效的,因为局部空间邻域中的图像和音频之类的结构之间具有高度相关性。
Keras 具有一个名为`keras.utils.sequence()`的优秀批量生成器,可帮助您以极大的灵活性自定义批量创建。 实际上,使用`keras.utils.sequence()`可以设计整个周期流水线。 我们将在此回归问题中使用此实用程序以习惯该实用程序。 对于迁移学习问题,我们可以使用`keras.utils.sequence()`设计生成器类,如下所示:
域 B 中生成的图像在样式和样式上都类似于域 A 中的图像。 无需在训练过程中显式配对来自两个域的图像就可以学习这种关系。 鉴于项目的配对是一项耗时的任务,因此这是一项非常强大的功能。 在较高的水平上,它尝试学习神经网络`G[AB]`和`G[BA]`形式的两个生成器函数。 图像`x[A]`,当通过发生器馈入时`G[AB]`,产生图像`x[AB]`,在域`B`中看起来很真实。此外,当此图像`x[AB]`通过其他生成器网络`G[BA]`馈送时,它应产生图像`x[ABA]`,理想情况下应与原始图像`x[A]`相同。 关于生成器功能,以下关系应成立:
仅使前面的损失最小化是不够的。 我们必须确保在域 B 中创建的图像`x[B]`看起来逼真。例如,如果我们将域`A`中的衣服映射到域`B`中的鞋子,我们将 确保`x[B]`类似于鞋子。 如果图像不够真实,则在域 B 侧的鉴别符`D[B]`将检测为`x[B]`为假。 鞋子,因此也要考虑与此有关的损失。 通常,在训练过程中,向鉴别器提供生成的域`B`图像`x[AB] = G[AB](X[A])`,我们选择在这里用`y[B]`表示,以便它学习从假图像中对真实图像进行分类。 您可能还记得,在 GAN 中,生成器和判别器相互进行*零和最小最大值游戏*,以便不断变得更好,直到达到平衡为止。 如果伪造的图像看起来不够逼真,则鉴别器将对其进行惩罚,这意味着生成器必须学习产生更好的图像`x[AB]`,如果输入图像`x[A]`。 考虑到所有这些因素,我们可以将我们希望最小化的生成器损耗公式化为重建损耗,以及鉴别器将`x[AB]`识别为假冒的损耗。 第二种损失将试图使生成器在域 B 中生成逼真的图像。将域 A 中的图像`x[A]`映射到域 B 中的图像的生成器损失可以表示为 如下:
最大的问题是,我们可以在这里停下来吗? 由于我们有来自两个域的图像,因此要获得更好的映射,我们也可以从域 B 拍摄图像,并通过生成器`G[BA]`将它们映射到域 A。 如果我们在域 B 中拍摄`x[B]`图像,并通过生成器`G[BA]`将其转换为图像`x[BA]`,而域 A 上的标识符由`D[A]`给出,则与这种转换相关的成本函数由以下给出:
在本章中,我们将使用草绘的轮廓生成手袋,而无需使用 DiscoGAN 进行显式配对。 我们将草图图像表示为属于域 A,而将自然手袋图像表示为属于域 B。将有两种生成器:一种生成器,用于获取域 A 的图像并将其映射到在域 B 下看起来逼真的图像,以及 另一个与此相反:将域 B 中的手袋图像映射到在域 A 下看起来很逼真的图像。鉴别者将尝试从每个域中真实图像的生成器中识别生成器生成的虚假图像。 生成器和判别器将相互进行 minimax 零和游戏。
`edges2handbags`数据集文件夹中的每个图像在同一图像中包含`bag`的图片和`bag edges`的图片。 为了训练网络,我们需要将它们分离为属于我们在 DiscoGAN 架构中讨论过的两个域 A 和 B 的图像。 通过使用以下代码(`image_split.py`),可以将图像分为域 A 和域 B 图像:
`edges2handbags`数据集文件夹中的每个图像在同一图像中包含`bag`的图片和`bag edges`的图片。 为了训练网络,我们需要将它们分离为属于我们在 DiscoGAN 架构中讨论过的两个域`A`和 B 的图像。 通过使用以下代码(`image_split.py`),可以将图像分为域`A`和域`B`图像:
```py
# -*- coding: utf-8 -*-
...
...
@@ -187,7 +187,7 @@ the number of input images processed : 30000
一旦定义了操作,我们就可以使用它们来计算损失函数,同时考虑图像的重建损失和归因于鉴别器的损失。 请注意,我们使用了相同的生成器函数来定义域 A 到 B 的生成器,也定义了从 B 到 A 的生成器。唯一不同的是为这两个网络提供了不同的名称:`generator_AB`和 `generator_BA`。 由于变量作用域定义为`name`,所以这两个生成器都将具有不同的权重集,并以提供的名称为前缀。
| `self.D_B_loss_real` | 在对域 B 中的真实图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[B]`) |
| `self.D_B_loss_fake` | 在对域 B 中的伪造图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[B]`) |
| `self.D_A_loss_real` | 在对域 A 中的真实图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[A]`) |
| `self.D_A_loss_fake` | 在对域 A 中的伪造图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[A]`) |
| `self.loss_GABA` | 通过两个生成器`G[AB]`和`G[BA]`将域 A 中的图像映射到 B,然后再映射回 A 的重建损失 )加上假图片`G[AB](x[A])`的二进制交叉熵,并由域 B 中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators `G[AB]` and `G[BA]`) |
| `self.loss_GBAB` | 通过两个生成器`G[BA]`和`G[AB]`将域 B 中的图像映射到 A,然后再映射回 B 的重建损失 加上伪图片`G[BA](x[B])`的二元交叉熵,由域 A 中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators `G[AB]` and `G[BA]`) |
| `self.D_B_loss_real` | 在对域`B`中的真实图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[B]`) |
| `self.D_B_loss_fake` | 在对域`B`中的伪造图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[B]`) |
| `self.D_A_loss_real` | 在对域`A`中的真实图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[A]`) |
| `self.D_A_loss_fake` | 在对域`A`中的伪造图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator `D[A]`) |
| `self.loss_GABA` | 通过两个生成器`G[AB]`和`G[BA]`将域`A`中的图像映射到`B`,然后再映射回`A`的重建损失 )加上假图片`G[AB](x[A])`的二进制交叉熵,并由域`B`中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators `G[AB]` and `G[BA]`) |
| `self.loss_GBAB` | 通过两个生成器`G[BA]`和`G[AB]`将域`B`中的图像映射到`A`,然后再映射回`B`的重建损失 加上伪图片`G[BA](x[B])`的二元交叉熵,由域`A`中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators `G[AB]` and `G[BA]`) |
在此`sample_model`函数中,从域 A 随机选择的图像被拍摄并馈送到生成器`G[AB]`,以在域 B 中生成图像。类似地,从域 B 随机选择的图像是 馈送到生成器`G[BA]`中,以在域 A 中生成图像。这些输出图像由两个生成器在不同时期生成,并将批次保存在样本文件夹中以查看是否 生成器在训练过程中随着时间的推移而不断改进,以产生更好的图像质量。
从前面的屏幕截图中,我们可以看到不同批次中域 A 中鉴别器的损失。 `da_loss`是`da_loss_real`和`da_loss_fake`损失的总和。 `da_loss_real`稳步下降,这是因为鉴别器易于学会识别域 A 中的真实图像,而虚假图像的损失则稳定在 0.69 左右,这是二进制分类器输出时您可以期望的`logloss` 具有 1/2 概率的类。 发生这种情况是因为生成器也在同时学习以使伪图像看起来逼真,因此使鉴别人员很难轻松地将生成器图像分类为伪图像。 域 B 上的鉴别器的损耗曲线看起来与域 A 的上一幅屏幕快照所示的相似。
`g_loss_a2b` 是从域 A 到域 B 以及从域 B 反向重构图像的组合生成器损耗,也是与使变换后的图像在 B 域中看起来逼真相关的二进制交叉熵损耗。 `g_loss_b2a`是从域 B 到域 A 以及从域 A 重建图像的组合生成器损耗,也是与使变换后的图像在 A 域中看起来逼真相关的二进制交叉熵损耗。这两种损耗曲线及其总和 (HTG2)随着批次的进行,损失不断减少,正如我们从上一个屏幕快照中的 TensorBoard 视觉图中看到的那样。
在已定义的`get_data`函数中,我们从`video_corpus.csv`文件中删除了所有非英语的字幕。 完成后,我们首先通过构建视频名称(作为`VideoID`,`Start`和`End`功能的串联)并在功能目录名称前添加前缀来形成视频功能的链接。 然后,我们删除所有未指向 features 目录中任何实际视频特征向量或具有无效非文本描述的视频语料库文件记录。
现在我们拥有所有必需的功能,我们将创建 TensorFlow 操作,以在给定可见输入的情况下对隐藏状态`self.h`进行采样,并在给定采样状态下对可见单位`self.x`进行采样。 我们还使用对比散度从 v 和 h 的联合概率分布(即`P(v,h/model)`)中抽取`(self.x_s,self.h_s)`作为代表性样本,以计算梯度中的不同期望项。