提交 538cdedc 编写于 作者: W wizardforcel

2020-12-22 14:52:18

上级 325cb511
......@@ -37,7 +37,7 @@
![](img/09ada4ef-4d12-45db-a6b8-19064db767e9.png)
仅使前面的损失最小化是不够的。 我们必须确保在域 B 中创建的图像`x[B]`看起来逼真。例如,如果我们将域 A 中的衣服映射到域 B 中的鞋子,我们将 确保`x[B]`类似于鞋子。 如果图像不够真实,则在域 B 侧的鉴别符`D[B]`将检测为`x[B]`为假。 鞋子,因此也要考虑与此有关的损失。 通常,在训练过程中,向鉴别器提供生成的图像 *x <sub>AB</sub> = G <sub>AB</sub> (x <sub>A</sub> )* 域 B,我们选择在这里用`y[B]`表示,以便它学习从假图像中对真实图像进行分类。 您可能还记得,在 GAN 中,生成器和判别器相互进行*零和最小极大值游戏*,以便不断变得更好,直到达到平衡为止。 如果伪造的图像看起来不够逼真,则鉴别器将对其进行惩罚,这意味着生成器必须学习产生更好的图像`x[AB]`,如果输入图像`x[A]`。 考虑到所有这些因素,我们可以将我们希望最小化的生成器损耗公式化为重建损耗,以及鉴别器将`x[AB]`识别为假冒的损耗。 第二种损失将试图使生成器在域 B 中生成逼真的图像。将域 A 中的图像`x[A]`映射到域 B 中的图像的生成器损失可以表示为 如下:
仅使前面的损失最小化是不够的。 我们必须确保在域 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 中的图像的生成器损失可以表示为 如下:
![](img/f2cdd9c3-d4d4-4c89-a533-e5044ea37592.png)
......@@ -47,7 +47,7 @@ L2 范数下的重建损失可以表示为:
由于我们正在处理图像,因此可以假设`x[A]`是所有像素的扁平向量,以符合 L2 规范术语。 如果我们假设`x[A]`是矩阵,则最好将![](img/6e698b45-8fde-420b-8ada-ee9b7b1f13c9.png)称为 **Frobenius 范数**。 但是,这些只是数学术语,实质上,我们只是将原始图像和重建图像之间的像素值差的平方和求和。
让我们考虑一下生成器在使变换后的图像`x[AB]`追求时要尽量降低成本的做法。 鉴别者将尝试将图像标记为伪图像,因此生成器`G[AB]`应当在这种情况下产生`x[AB]`使其成为假图片的对数丢失的方式尽可能小。 如果域 B 中的鉴别符`D[B]`将真实图像标记为`1`,将伪图像标记为`0`,则图像真实的概率由 *D <sub>B</sub> (。)*,则发生器应使`x[AB]`在鉴别器网络下极有可能出现,从而使 *D <sub>B</sub> (x <sub>B</sub> )= D <sub>B</sub> (G <sub>AB</sub> (x <sub>A</sub> ))*接近`1`)。 就对数损失而言,生成器应使先前概率的负对数最小化,这基本上使我们得到 *C <sub>D(AB)</sub>* ,如下所示:
让我们考虑一下生成器在使变换后的图像`x[AB]`追求时要尽量降低成本的做法。 鉴别者将尝试将图像标记为伪图像,因此生成器`G[AB]`应当在这种情况下产生`x[AB]`使其成为假图片的对数丢失的方式尽可能小。 如果域 B 中的鉴别符`D[B]`将真实图像标记为`1`,将伪图像标记为`0`,则图像真实的概率由`D[B](.)`,则发生器应使`x[AB]`在鉴别器网络下极有可能出现,从而使`D[B](x[B]) = D[B](G[AB](x[A]))`接近`1`)。 就对数损失而言,生成器应使先前概率的负对数最小化,这基本上使我们得到`C[D(AB)]`,如下所示:
![](img/549bd16c-1bd7-4f76-b4c1-6179369f92c7.png)
......@@ -55,11 +55,11 @@ L2 范数下的重建损失可以表示为:
![](img/581b9be4-661a-41e9-a9f3-597d1116c2c7.png) ![](img/7d74f982-9649-4c22-a18e-d20e9b27d51c.png)
最大的问题是,我们可以在这里停下来吗? 由于我们有来自两个域的图像,因此要获得更好的映射,我们也可以从域 B 拍摄图像,并通过生成器`G[BA]`将它们映射到域 A。 如果我们在域 B 中拍摄`x[B]`图像,并通过生成器 *G 将其转换为图像`x[BA]`HTG13] BA* ,而域 A 上的标识符由`D[A]`给出,则与这种转换相关的成本函数由以下给出:
最大的问题是,我们可以在这里停下来吗? 由于我们有来自两个域的图像,因此要获得更好的映射,我们也可以从域 B 拍摄图像,并通过生成器`G[BA]`将它们映射到域 A。 如果我们在域 B 中拍摄`x[B]`图像,并通过生成器`G[BA]`将其转换为图像`x[BA]`,而域 A 上的标识符由`D[A]`给出,则与这种转换相关的成本函数由以下给出:
![](img/e8a983da-5a03-453d-8317-eff82e4164e6.png) ![](img/0812b062-6e92-4e91-b725-747ac4b61f31.png)
如果我们对两个域中的全部图像总数求和,则生成器损耗将由`(5)`*(6),*之和给出,如下所示:
如果我们对两个域中的全部图像总数求和,则生成器损耗将由`(5)``(6)`之和给出,如下所示:
![](img/bd4d5890-a506-4180-b680-4c842cca1286.png) ![](img/bcb0c1db-84a7-44ac-864c-4e7545fb6016.png)
......@@ -189,7 +189,7 @@ the number of input images processed : 30000
# DiscoGAN 的发电机
DiscoGAN 的生成器是前馈卷积神经网络,其中输入和输出是图像。 在网络的第一部分中,图像在空间维度上按比例缩小,而输出要素图的数量随图层的进展而增加。 在网络的第二部分中,图像沿空间维度按比例放大,而输出特征图的数量则逐层减少。 在最终输出层中,将生成具有与输入相同的空间尺寸的图像。 如果生成器将图像`x[A]`转换为`x[AB]`*域 A**域 B* 表示为`G[AB]`,则我们有![](img/6c5507b6-7666-4601-8730-0b89c4a198fc.png)
DiscoGAN 的生成器是前馈卷积神经网络,其中输入和输出是图像。 在网络的第一部分中,图像在空间维度上按比例缩小,而输出要素图的数量随图层的进展而增加。 在网络的第二部分中,图像沿空间维度按比例放大,而输出特征图的数量则逐层减少。 在最终输出层中,将生成具有与输入相同的空间尺寸的图像。 如果生成器将图像`x[A]`转换为`x[AB]``A`到域`B`表示为`G[AB]`,则我们有![](img/6c5507b6-7666-4601-8730-0b89c4a198fc.png)
此处显示的是`build_generator`函数,我们可以使用它来构建 DiscoGAN 网络的生成器:
......@@ -471,12 +471,12 @@ def build_network(self):
下表显示了我们需要跟踪的不同损耗变量。 就发生器或鉴别器的参数而言,所有这些损失都需要最小化:
| **不同损失的变量** | **说明** |
| `self.D_B_loss_real` | 在对域 B 中的真实图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator *D<sub>B.</sub>*) |
| `self.D_B_loss_fake` | 在对域 B 中的伪造图像进行分类时,鉴别符`D[B]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator *D<sub>B.</sub>*) |
| `self.D_A_loss_real` | 在对域 A 中的真实图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator *D<sub>A.</sub>*) |
| `self.D_A_loss_fake` | 在对域 A 中的伪造图像进行分类时,鉴别符`D[A]`的二进制交叉熵损失。(This loss is to be minimized with respect to the parameters of the discriminator *D<sub>A.</sub>*) |
| `self.loss_GABA` | 通过两个生成器`G[AB]``G[BA]`将域 A 中的图像映射到 B,然后再映射回 A 的重建损失 )加上假图片 *G <sub>AB</sub> (x <sub>A</sub> )*的二进制交叉熵,并由域 B 中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators *G<sub>AB</sub>* and *G<sub>BA.</sub>*) |
| `self.loss_GBAB` | 通过两个生成器`G[BA]``G[AB]`将域 B 中的图像映射到 A,然后再映射回 B 的重建损失 加上伪图片 *G <sub>BA</sub> (x <sub>B</sub> )*的二元交叉熵,由域 A 中的鉴别器标记为真实图像。(This loss is to be minimized with respect to the parameters of the generators *G<sub>AB</sub>* and *G<sub>BA.</sub>*) |
| `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]`) |
前四个损耗组成了鉴别器损耗,需要根据鉴别器的参数将其最小化。 ]。 最后两个损耗组成了发电机损耗,需要根据发电机的参数将其最小化。 。
......@@ -713,7 +713,7 @@ Epoch: [ 0] [ 19/ 156] time: 13.7525
图 4.3:域 A 中的鉴别器丢失
从前面的屏幕截图中,我们可以看到不同批次中域 A 中鉴别器的损失。 `da_loss``da_loss_real`**`da_loss_fake`** 损失*的总和。* `da_loss_real`稳步下降,这是因为鉴别器易于学会识别域 A 中的真实图像,而虚假图像的损失则稳定在 0.69 左右,这是二进制分类器输出时您可以期望的`logloss` 具有 1/2 概率的类。 发生这种情况是因为生成器也在同时学习以使伪图像看起来逼真,因此使鉴别人员很难轻松地将生成器图像分类为伪图像。 域 B 上的鉴别器的损耗曲线看起来与域 A 的上一幅屏幕快照所示的相似。
从前面的屏幕截图中,我们可以看到不同批次中域 A 中鉴别器的损失。 `da_loss``da_loss_real``da_loss_fake`损失的总和。 `da_loss_real`稳步下降,这是因为鉴别器易于学会识别域 A 中的真实图像,而虚假图像的损失则稳定在 0.69 左右,这是二进制分类器输出时您可以期望的`logloss` 具有 1/2 概率的类。 发生这种情况是因为生成器也在同时学习以使伪图像看起来逼真,因此使鉴别人员很难轻松地将生成器图像分类为伪图像。 域 B 上的鉴别器的损耗曲线看起来与域 A 的上一幅屏幕快照所示的相似。
现在让我们看一下发电机的损耗曲线,如下所示:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册