人工智能对抗生成网络之基于CycleGan图像合成源码解读

devtools/2025/2/20 17:21:56/

先外网下载与安装visdom,配置好visdom可视化工具,然后训练时才不报错。

(1)CycleGan网络所需数据

CycleGan例如可以把马变成斑马,把某个名星图像变成另外一个人的图像。

CycleGan只需二个数据集,不需一一对应关系,不需配对的数据集,让网络自己去学习与配对。例如一个是航拍拍出来的结果;另一个是地图数据,这时看能不能把航拍拍出来的数据集转成地图数据集。

(2)cycleGan整体网络架构

1)对抗网络如何进行学习呢?

<1>需要2对G(生成网络)和2个D(判别网络)网络

1>原始做法是:第一G是把输入图像(例如斑马)预测出一个结果(例如马),然后从这个结果放入另一个D网络中,这时也把某一类马放入到D网络中进行判别,看是否一样,这种做完根本没有与原始斑马进行比较判别,只是生成的马与放入的某类马进行比较。

cycleGan是由原来的一个G和D升级为2对G和1个D网络。这里有4个损失函数(2G加上2D各1个损失函数,还一个整体L2 Loss<输入图像与还原出来的图像间的损失>和一个Identity损失函数<原始图像输入到G网络生成新图像,那算新图像输入到G网络中后得到的图像间的损失>)。如下图:

对上面的2对G和2个D网络分解出二部分(两个数据集),例如一部分是以马为输入的(马得到斑马再还原成马),另一部分是以斑马为输入的(斑马得到马再还原成斑马),这样一共就是有四个网络,其中生长网络中有二个(例马变成斑马和斑马变成马),其中判别网络也有二个。

(3)PatchGAN判别网络原理

1)cycleGan中的PatchGAN作用

以前判别器一般是经过卷积后传入sigmoid激活函数,直接得到0----1之间的数值。但这里判别器要多做一些事情了,这里判别器一般是经过卷积后不会连sigmoid激活函数或全连接层,而是经过卷积后得到特征图(例N*N*1的矩阵),卷积后(例3*3)的感受野到原图像的某个区域(例3*3)的预测结果与标签(也是N*N)之间计算损失<即对每个Patch(即基于特征图某个点通过感受野见到原始图像中的某个区域预测结果)都要与输入进行判断(如果都是1就说明都是为真,很完美),不是整张图判别>。

(4)数据读取与预处理操作

下载pytorch-CycleGAN-and-pix2pix代码下来

1)下载数据源。打开下图中的文件,把下载的url复制到游览器中,

下载后放到这目录下:

也可以下载.pth结尾的人家训练好的模型,在测试时直接拿来用:

首先把原代码与数据集下载下来,这里要从外网下载一个visdom可视化工具并配置,若没下载就要注释掉一些代码,就不会影响训练与测试,因为visdom只是一个可视化工具来的。

现在进入代码层面的解读:

打开test.py文件配置一些环境:

打开train.py文件配置一些环境:

(5)生成网络模型构造

网络模型不算复杂,这里主要是损失函数比较复杂,只要把损失函数搞明白这个项目就明白了

下面开始构建生成器:

进入残差网络中,如下图:

上图中是画出生成网络的总体结构,纠正一下"加上反卷积"改成"加上卷积"。

反卷积后特征图个数会变少,特征图大小会变大,这与卷积是刚好相反的。

至此生成网络模型就构建好了。

(6)判别网络模块构造

下面看判别器代码:

至此判别网络也构建好了

(7)损失函数:identity loss计算方法

进入到optimize_parameters中计算损失,马上进入它的前向传播方法forward中:

这个反向传播计算的就是identity  loss,它的计算思路是一个图像B经生成器生成C,然后直接拿C与B进行计算差异:

(8)生成与判别损失函数指定

1)生成器损失函数计算

MSE思想:原始图像经生成器生成A,然后A拿到判别器中去,想骗过判别器,判别器是构建出N*N的标签(target),这时特征图上对应点的预测结果与这标签进行计算得到的值就是MSE损失值。

cycle损失计算:

这六个值加起来就是生成器的损失值了。

2)判别器损失函数计算

最后反向传播更新梯度,到此生成与送别器的损失都计算。

(9)visdom可视化工具配置


http://www.ppmy.cn/devtools/160107.html

相关文章

Effective Objective-C 2.0 读书笔记——大中枢派发

Effective Objective-C 2.0 读书笔记——大中枢派发 多用派发队列&#xff0c;少用同步锁 说到同步锁&#xff0c;我们不难想起我们前面在学习线程之中的内容时学习到的关键字synchronized&#xff0c;使用这个同步块可以让我们这段程序实现加锁的操作&#xff0c;即在不同线…

MySQL数据库(3)—— 表操作

目录 一&#xff0c;创建表 1.1 创建表的SQL 1.2 演示 二&#xff0c;查看表 三&#xff0c;修改表 四&#xff0c;删除表 常用的表操作会涉及到两种SWL语句 DDL&#xff08;Data Definition Language&#xff09;数据定义语言&#xff1a;建表、改表、删表等&#xff0…

机器学习_14 随机森林知识点总结

随机森林&#xff08;Random Forest&#xff09;是一种强大的集成学习算法&#xff0c;广泛应用于分类和回归任务。它通过构建多棵决策树并综合它们的预测结果&#xff0c;显著提高了模型的稳定性和准确性。今天&#xff0c;我们就来深入探讨随机森林的原理、实现和应用。 一、…

数据分析--数据清洗

一、数据清洗的重要性&#xff1a;数据质量决定分析成败 1.1 真实案例警示 电商平台事故&#xff1a;2019年某电商大促期间&#xff0c;因价格数据未清洗导致错误标价&#xff0c;产生3000万元损失医疗数据分析&#xff1a;未清洗的异常血压值&#xff08;如300mmHg&#xff…

一些网络编程的补充知识

1.INADDR_ANY 由于云服务器的IP地址是由对应的云厂商提供的&#xff0c;这个IP地址并不一定是真正的公网IP&#xff0c;这个IP地址是不能直接被绑定的&#xff0c;如果需要让外网访问&#xff0c;此时我们需要bind 0。系统当当中提供的一个INADDR_ANY&#xff0c;这是一个宏值…

工控网络安全介绍 工控网络安全知识题目

31.PDR模型与访问控制的主要区别(A) A、PDR把对象看作一个整体 B、PDR作为系统保护的第一道防线 C、PDR采用定性评估与定量评估相结合 D、PDR的关键因素是人 32.信息安全中PDR模型的关键因素是(A) A、人 B、技术 C、模型 D、客体 33.计算机网络最早出现在哪个年代(B) A、20世…

【RK3588嵌入式图形编程】-SDL2-构建模块化UI

构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…

JavaScript(JS)

介绍 JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互 JavaScript 和Java 是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似 JS引入方式 内部脚本:将JS代码定义在HTML页面中 JavaScript代码…