顺达动态 NEWS真实、正向、传递价值

当前位置: 首页 > 顺达动态 > 公司新闻

PyTorch深度学习实战(37)——CycleGAN详解与实现

日期:2024-05-26 09:03:08 / 人气:

PyTorch深度学习实战(37)——CycleGAN详解与实现

是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配对数据的情况下将一种风格的图像转换成另一种风格,而无需为每一对输入-输出图像配对训练数据。 的核心思想是利用两个生成器和两个判别器,它们共同学习两个域之间的映射关系。例如,将马的图像转换成斑马的图像,或者将夏天的风景转换成冬天的风景。在本节中,我们将学习 的基本原理,并实现该模型用于将苹果图像转换为橙子图像,或反之将橙子图像转换为苹果图像。

是一种无需配对的图像转换技术,它可以将一个图像域中的图像转换为另一个图像域中的图像,而不需要匹配这两个域中的图像。它使用两个生成器和两个判别器,其中一个生成器将一个域中的图像转换为另一个域中的图像,而第二个生成器将其转换回来。这个过程被称为循环一致性,转换过程是可逆的。
可以用于执行从一个类别到另一个类别的图像转换,而无需提供相匹配的输入-输出图像对来训练模型,只需要在两个不同的文件夹中提供这两个类别的图像。在本节中,我们将学习如何训练 将苹果图像转换为橙子图像,或反之将橙子图像转换为苹果图像, 中的 是指将图像从一个类别转换到另一个类别,然后再转换回原始类别的过程。
在 中,需要使用三种不同的损失值:

  • 鉴别器损失:用于区分真实图像和伪造图像
  • 循环一致性损失:由于 使用了两个生成器,因此需要确保转换是可逆的,循环一致性损失通过将转换过的图像再次传递到原始的生成器中,并将生成的图像与原始图像进行比较来实现
  • 恒等损失 ():确保生成器在不进行转换的情况下仍然能够生成与原始图像相似的图像,通过将原始图像传递到生成器中,并计算生成图像与原始图像之间的差异

模型构建策略如下:

  1. 导入数据集并进行预处理
  2. 定义 架构用于构建生成器和判别器网络
  3. 定义两个生成器:
    • :将类别 图像转换为类别 图像的生成器
    • :将类别 图像转换为类别 图像的生成器
  4. 定义恒等损失:
    • 如果将一张橘子的图像输入到橙子生成器,理想情况下,如果生成器完全理解橙子的所有信息,它不应该改变图像,而应该“生成”完全相同的图像,据此,我们可以创建一个恒等变换
    • 当类别 () 的图像通过 并与 进行比较时,恒等损失应该是最小的
    • 当类别 () 的图像通过 并与 进行比较时,恒等损失应该是最小的
  5. 定义GAN损失:
    • 和 的判别器和生成器损失(当 图像通过 时得到 )
    • 和 的判别器和生成器损失(当 图像通过 时得到 )
  6. 定义循环一致性损失:
    • 一张苹果图像需要通过橙子生成网络进行转换,生成伪造的橘子图像,然后再通过苹果生成网络将伪造的橙子图像转换回苹果图像
    • 是 通过 时的输出,当 通过 时应该重新生成
    • 是 通过 时的输出,当 通过 时应该重新生成
  7. 优化三个损失函数的加权和

接下来,我们使用 实现 模型,用以将苹果图像转换为橙子图像,或反之将橙子图像转换为苹果图像。

(1) 导入相关数据集和库。

首先下载并解压数据集,可以自行构建数据集,也可以下载本文所用数据集,下载地址:https://pan.baidu.com/s/1iTOt2NsUQ1a3taUHjvkjfA,提取码:。

可视化示例图像如下:
数据集

Pix2Pix 训练数据集不同,苹果和橙色图像之间不存在一一对应的关系。

导入所需的库:

 

(2) 定义图像转换管道 :

 

(3) 定义数据集类 ,以苹果图像 和橙子图像 文件夹为输入,提供批数据:

 

(4) 定义训练、验证数据集和数据加载器:

 

(5) 定义网络的权重初始化方法 :

 

(6) 定义残差块 :

 

(7) 定义生成器 :

 

(8) 定义判别器 :

 

(9) 定义图像样本生成函数 :

 

(10) 定义生成器训练函数 。

该函数将两个生成器( 和 )、优化器和两个类别的真实图像( 和 )作为输入:

 

指定生成器:

 

将优化器的梯度设置为零:

 

计算类别 (苹果)和类别 (橙子)图像的恒等损失 ():

 

计算图像通过生成器时的 损失,此时生成的图像应尽可能接近另一类别,使用 作为训练生成器的判别网络目标输出,因为我们将生成的伪造图像传递给相同类别的判别器:

 

计算循环一致性损失。假设,一张苹果图像被橙子生成器转换为一张伪造橙子图像,然后伪造橙子图像通过苹果生成器转换回一张苹果图像,理想情况下,经过该过程后应该返回原始图像,即循环一致性损失应该为零:

 

计算总损失并执行反向传播:

 

(11) 定义判别器训练函数 :

 

(12) 定义生成器、判别器对象、优化器和损失函数:

 

(13) 训练网络:

 

(14) 训练模型后,测试模型生成图像:

 

模型生成结果
从上图可以看出, 可以成功地将苹果转换为橙子(前两行),将橙子转换为苹果(后两行)。

是一种用于无监督图像转换的深度学习模型,它通过两个生成器和两个判别器的组合来学习两个不同域之间的映射关系。生成器负责将一个域的图像转换成另一个域的图像,而判别器则用于区分生成的图像和真实的图像。 引入循环一致性损失,确保图像转换是可逆的,从而提高生成图像的质量。通过对抗训练和循环一致性损失, 可以实现在没有配对标签的情况下进行图像域转换。

PyTorch深度学习实战(1)——神经网络与模型训练过程详解
PyTorch深度学习实战(2)——PyTorch基础
PyTorch深度学习实战(3)——使用PyTorch构建神经网络
PyTorch深度学习实战(4)——常用激活函数和损失函数详解
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(6)——神经网络性能优化技术
PyTorch深度学习实战(7)——批大小对神经网络训练的影响
PyTorch深度学习实战(8)——批归一化
PyTorch深度学习实战(9)——学习率优化
PyTorch深度学习实战(10)——过拟合及其解决方法
PyTorch深度学习实战(11)——卷积神经网络
PyTorch深度学习实战(12)——数据增强
PyTorch深度学习实战(13)——可视化神经网络中间层输出
PyTorch深度学习实战(14)——类激活图
PyTorch深度学习实战(15)——迁移学习
PyTorch深度学习实战(16)——面部关键点检测
PyTorch深度学习实战(17)——多任务学习
PyTorch深度学习实战(18)——目标检测基础
PyTorch深度学习实战(19)——从零开始实现R-CNN目标检测
PyTorch深度学习实战(20)——从零开始实现Fast R-CNN目标检测
PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测
PyTorch深度学习实战(22)——从零开始实现YOLO目标检测
PyTorch深度学习实战(23)——从零开始实现SSD目标检测
PyTorch深度学习实战(24)——使用U-Net架构进行图像分割
PyTorch深度学习实战(25)——从零开始实现Mask R-CNN实例分割
PyTorch深度学习实战(26)——多对象实例分割
PyTorch深度学习实战(27)——自编码器(Autoencoder)
PyTorch深度学习实战(28)——卷积自编码器(Convolutional Autoencoder)
PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)
PyTorch深度学习实战(30)——对抗攻击(Adversarial Attack)
PyTorch深度学习实战(31)——神经风格迁移
PyTorch深度学习实战(32)——Deepfakes
PyTorch深度学习实战(33)——生成对抗网络(Generative Adversarial Network, GAN)
PyTorch深度学习实战(34)——DCGAN详解与实现
PyTorch深度学习实战(35)——条件生成对抗网络(Conditional Generative Adversarial Network, CGAN)
PyTorch深度学习实战(36)——Pix2Pix详解与实现


平台注册入口