GANs-生成对抗网络

news2024/12/28 22:10:31
参考:
https://mp.weixin.qq.com/s?__biz=MjM5ODIwNjEzNQ==&mid=2649887403&idx=3&sn=f61fc0e238ffbc56a7f1249b93c20690&chksm=bfa0f632460e035f00be6cc6eb09637d91614e4c31da9ff47077ca468caad1ee27d08c04ca32&scene=27
https://cloud.tencent.com/developer/article/2351793

一:什么是生成式对抗网络(GAN)?

GANs是由Ian Goodfellow和其他蒙特利尔大学的研究人员,包括Yoshua Bengio,在2014年6月的论文《生成对抗网络》中介绍的一种新型神经网络架构。

GANs最显著的特点是它们能够创建超现实主义的图像、视频、音乐和文本。GANs有能力从训练图像中学习特征,并利用这些学到的模式想象出它们自己的新图像。例如,图1中展示的图像就是使用GANs模型生成的。

二:GANs架构

GANs基于对抗训练的思想。它们基本上由两个相互竞争的神经网络组成。这种竞争性帮助它们模仿任何数据分布。

我们可以将GAN架构想象成两个拳击手的战斗。在他们征服游戏的过程中,双方都在学习对方的移动和技巧。他们开始时对对手了解不多。随着游戏的进行,他们学习并变得越来越好

另一个帮助理解GANs想法的类比:将GANs想象成一个伪造者和一个警察在一场猫捉老鼠的游戏中的对立,其中伪造者正在学习通过假钞,而警察正在学习检测它们。双方都在动态变化。

这意味着,随着伪造者学习完善制造假钞,警察也在训练并变得更好,双方都在不断升级中学习对方的方法。

GAN架构由两个主要网络组成:

1.生成器:试图将随机噪声转换为看起来像是从原始数据集中采样的观测值。

2.鉴别器:试图预测一个观测值是来自原始数据集还是生成器的伪造品。

GAN架构

GAN所采取的步骤如下:

1.生成器接收随机数字并返回一个图像。

2.这个生成的图像与从实际的、真实的数据集中取出的图像一起输入到鉴别器中。

3.鉴别器接收真实和假图像,并返回概率,一个介于0和1之间的数字,1代表预测的真实性,0代表伪造。

如果仔细观察生成器和鉴别器网络,会发现生成器网络是一个倒置的ConvNet,从压平的向量开始,然后图像被放大,直到它们与训练数据集中的图像具有相似的大小。

三:深度卷积GANs(DCGANs)

在2014年的原始GAN论文中,使用多层感知器(MLP)网络构建了生成器和鉴别器网络。然而,从那时起,已经证明卷积层能够增强鉴别器的预测能力,这反过来又提高了生成器和整体模型的准确性。这种类型的GAN被称为DCGAN(深度卷积GAN)。

现在,所有GAN架构都包含卷积层,因此当我们谈论GAN时,“DC”已被暗含在内

四:鉴别器网络

鉴别器的目标是预测图像是真实的还是假的。这是一个典型的监督分类问题,所以我们可以使用传统的分类器网络。

网络由堆叠的卷积层组成,接着是一个带有sigmoid激活函数的密集输出层。我们使用sigmoid激活函数,因为这是一个二元分类问题,网络的目标是输出介于0和1之间的概率预测值。其中0意味着生成器生成的图像是假的,1意味着它是真的。

在图4中,我们可以看到GAN模型的鉴别作用,它接收两组图像。第一个是来自训练集的真实图像,第二个是假的,由生成器模型生成。

图4 运行中的 GAN 模型判别器

图5 鉴别器模型的架构

训练鉴别器相当直接,因为它类似于传统的监督分类问题,我们用标记的图像来喂养鉴别器:假的(或生成的)和真实的图像。真实图像来自训练数据集,假图像是生成器模型的输出。

让我们在Keras中实现鉴别器网络,以了解其工作原理。鉴别器模型中没有什么新东西。它遵循传统的CNN网络的常规模式。

我们将堆叠卷积、批量归一化、激活和dropout层来创建我们的模型。所有这些层都有我们在训练网络时调整的超参数。对于您自己的实现,您可以调整这些超参数,并根据需要添加或删除层。


def discriminator_model():
  
  # 实例化一个顺序模型并将其命名为鉴别器
  discriminator = Sequential()
  
  # 向鉴别器模型添加一个卷积层
  discriminator.add(Conv2D(32, kernel_size=3, strides=2, input_shape=(28,28,1),
                      padding="same"))
  
  # 添加一个leakyRelu激活函数
  discriminator.add(LeakyReLU(alpha=0.2))
  
  # 添加一个dropout层,dropout概率为25%
  discriminator.add(Dropout(0.25))
  
  # 添加第二个卷积层,带有零填充
  discriminator.add(Conv2D(64, kernel_size=3, strides=2, padding="same"))
  discriminator.add(ZeroPadding2D(padding=((0,1),(0,1))))
  
  # 添加一个批量归一化层,以加快学习和提高准确性
  discriminator.add(BatchNormalization(momentum=0.8))
  discriminator.add(LeakyReLU(alpha=0.2))
  discriminator.add(Dropout(0.25))
  
  # 添加第三个卷积层,带有批量归一化、leakyRelu和dropout
  discriminator.add(Conv2D(128, kernel_size=3, strides=2, padding="same"))
  discriminator.add(BatchNormalization(momentum=0.8))
  discriminator.add(LeakyReLU(alpha=0.2))
  discriminator.add(Dropout(0.25))
  
  # 添加第四个卷积层,带有批量归一化、leakyRelu和dropout
  discriminator.add(Conv2D(256, kernel_size=3, strides=1, padding="same"))
  discriminator.add(BatchNormalization(momentum=0.8))
  discriminator.add(LeakyReLU(alpha=0.2))
  discriminator.add(Dropout(0.25))
  
  # 展平网络并添加输出Dense层,带有sigmoid激活函数
  discriminator.add(Flatten())
  discriminator.add(Dense(1, activation='sigmoid'))
  
  # 打印模型摘要
  discriminator.summary()
  
  # 设置输入图像形状
  img = Input(shape=img_shape)
  
  # 运行鉴别器模型以获得输出概率
  probability = discriminator(img)
  
  # 返回一个模型,它将图像作为输入并产生概率输出
  return Model(img, probability)

五:生成器网络

生成器网络接收一些随机数据,并尝试模仿训练数据集以生成假图像。它的目标是通过尝试生成与训练数据集完美复制品的图像来欺骗鉴别器。

随着它的训练,它在每次迭代后都会变得越来越好。另一方面,鉴别器同时被训练,所以生成器必须不断改进,因为鉴别器学会了它的技巧。

生成器模型的架构看起来像是一个倒置的传统ConvNet。生成器接收一个带有随机噪声数据的向量输入,并将其重塑为一个具有宽度、高度和深度的立方体体积。这个体积被视为将被馈送到几个卷积层的特征图,这些卷积层将创建最终的图像。

图7 GAN模型的生成器网络。

就像传统的卷积神经网络使用池化层来下采样输入图像一样。为了缩放特征图,我们使用上采样层,通过重复其输入像素的每行和每列来放大图像尺寸。

现在,让我们使用Keras构建生成器网络。在生成器代码中,我们将使用与鉴别器网络中使用的类似组件。唯一的新组件是上采样层,通过重复像素来将其输入尺寸加倍。

与鉴别器类似,我们将堆叠卷积层,并添加其他优化层,如BatchNormalization。生成器模型的关键区别在于它从压平的向量开始,然后图像被上采样,直到它们具有与训练数据集相似的尺寸。


def generator_model():

  # 实例化一个顺序模型并将其命名为生成器
  generator = Sequential()
  # 添加一个Dense层,其神经元数量= 128x7x7
  generator.add(Dense(128 * 7 * 7, activation="relu", input_dim=100))
  # 将图像尺寸重塑为7 x 7 x 128
  generator.add(Reshape((7, 7, 128)))
  # 上采样层,将图像尺寸加倍到14 x 14
  generator.add(UpSampling2D(size=(2,2)))

  # 添加一个卷积层来运行卷积过程+批量归一化
  generator.add(Conv2D(128, kernel_size=3, padding="same", activation="relu"))
  generator.add(BatchNormalization(momentum=0.8))

  # 将图像尺寸上采样到28 x 28
  generator.add(UpSampling2D(size=(2,2)))

  # 卷积+批量归一化层
  # 注意我们这里没有添加上采样,因为我们已经有了28 x 28的图像尺寸
  # 这与MNIST数据集中的图像尺寸相等。您可以根据自己的问题进行调整。
  generator.add(Conv2D(64, kernel_size=3, padding="same", activation="relu"))
  generator.add(BatchNormalization(momentum=0.8))

  # 过滤器=1的卷积层
  generator.add(Conv2D(1, kernel_size=3, padding="same", activation="relu"))

  # 打印模型摘要
  generator.summary()

  # 生成长度=100的输入噪声向量
  # 我们在这里选择100来创建一个简单的网络
  noise = Input(shape=(100,))

  # 运行生成器模型以创建假图像
  fake_image = generator(noise)

  # 返回一个模型,它将噪声向量作为输入并输出假图像
  return Model(noise, fake_image)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pywinauto install ~

1. 下载最新的python, Download Python | Python.org 博主用的版本是: python-3.12.6-amd64.exe 2. 安装python. (略) 3. 配置环境变量: 点击环境变量,并编辑PATH变量, 后面3条是新加的。 4. 安装pywinauto, 打开CMD输入 pip …

转置卷积与反卷积的区分

transposed convolution(转置卷积)和deconvolution(反卷积)是两个完全不同的概念。 deconvolution为“inverse of convolution”、“inverse filter”,翻译为反卷积、解卷积。在信号处理中,反卷积是指从卷积…

一家电子元件企业终止,业绩规模小,疑似通过收购调节收入利润

贝特电子终止原因如下:首先,报告期内贝特电子营收较低,收购东莞博钺股权可能构成重大资产重组,且假如扣除报告期内来自东莞博钺的净利润,贝特电子的净利润恐怕不符合深交所上市标准;其次,交易所…

彩漩科技亮相第一届人工智能教育应用论坛,入选TOP30榜单,展示创新教育科技产品

近日,由中国教育发展战略学会人工智能与机器人教育专业委员会指导,北京教育信息化产业联盟主办的第一届人工智能教育应用论坛暨 AI 教育科技成果展在北京隆重举办。本次活动以“AI 强校大时代 —— 用新质生产力打造金钥匙强校”为主题,汇聚了…

C++速通LeetCode简单第12题-二叉树的直径

递归: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}…

链表的快速排序(C/C++实现)

一、前言 大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的&#xf…

并发控制全解析

在数据库操作中,并发控制 是确保数据一致性和事务隔离性的关键。然而,多个事务的并发操作可能导致数据不一致,破坏数据库的ACID特性。本文将深入探讨并发操作可能带来的问题,并介绍常见的并发控制技术。 1. 并发操作带来的挑战 …

注册接口参数校验

前面只是开发了注册接口&#xff0c;没有对注册用户名、密码长度进行任何限制&#xff0c;因此我们还需要对注册接口参数进行校验。 参数校验框架Spring Validation 引入Spring Validation起步依赖 在pom.xml文件引入依赖 <!-- validation依赖--> <dependenc…

【实践】应用访问Redis突然超时怎么处理?

目录标题 问题描述分析过程查看监控数据系统监控指标JVM监控指标Redis监控指标分析应用异常单机异常规律集群异常规律统计超时的key 初步结论验证结论访问Redis链路slowlogRedis单节点info all定位redis节点定位异常keybigkeystcpdump定位大key影响 经验总结 问题描述 某产品线…

CORS漏洞及其防御措施:保护Web应用免受攻击

1. 背景- 什么是CORS&#xff1f; 在当今互联网时代&#xff0c;Web 应用程序的架构日益复杂。一个后端服务可能对应一个前端&#xff0c;也可能与多个前端进行交互。跨站资源共享&#xff08;CORS&#xff09;机制在这种复杂的架构中起着关键作用&#xff0c;但如果配置不当&…

Vue 中常用的基础指令

一. 什么是 Vue 指令 指令的定义和作用 指令是通过 Vue 实例的directives选项进行定义的。在指令的定义中&#xff0c;需要提供一个bind函数&#xff0c;它在指令第一次绑定到元素时被调用&#xff0c;可以执行一些初始化的操作。还可以提供update函数&#xff0c;它在指令所…

性能测试-跨线程组使用变量(十四)

说明&#xff1a; 两个线程组相当于两个函数&#xff0c;比如A线程组使用json提取器提取的“city”变量&#xff0c;在B线程组中不能使用&#xff08;相当于是局部变量&#xff09;jmeter中&#xff0c;没有全局变量&#xff0c;环境变量 解决方法&#xff1a; 添加两个线程…

源码运行springboot2.2.9.RELEASE

1 环境要求 java 8 maven 3.5.2 2 下载springboot源码 下载地址 https://github.com/spring-projects/spring-boot/releases/tag/v2.2.9.RELEASE 3 修改配置 修改spring-boot-2.2.9.RELEASE/pom.xml 修改spring-boot-2.2.9.RELEASE/spring-boot-project/spring-boot-tools…

谷歌的 DataGemma 人工智能是一个统计精灵

谷歌正在扩大其人工智能模型家族&#xff0c;同时解决该领域的一些最大问题。 今天&#xff0c;该公司首次发布了 DataGemma&#xff0c;这是一对开源的、经过指令调整的模型&#xff0c;在缓解幻觉挑战方面迈出了一步&#xff0c;幻觉是指大型语言模型&#xff08;LLM&#xf…

Docker镜像下载-使用github action- 解决无法下载docker镜像的问题

最近不知道怎么jdk的本地镜像被不小心干掉了&#xff0c;然后action全部失败。服务器也不能从远程拉取镜像 由于国内已经无法从docker官方源下载镜像了&#xff0c;但是这个自动化运维的需求还是有的。其实有很多种方法&#xff0c;但是都很麻烦。 这里我写的docker compose…

运行PaddleOCR报错:requests.exceptions.SSLError: HTTPSconnectionPool……

文章目录 问题描述解决方法 问题描述 在运行以下代码时报错&#xff1a; ocr PaddleOCR(lang"en")解决方法 打开cmd&#xff0c;输入以下命令&#xff0c;查找Python解释器所在路径。 找到 Lib\site-packages\paddleocr\ppocr\utils\network.py&#xff0c;将代码…

【Python小知识 - 2】:在VSCode中切换Python解释器版本

文章目录 在VSCode中切换Python解释器版本 在VSCode中切换Python解释器版本 在VSCode中按下快捷键CtrlShiftP&#xff0c;出现命令框。 输入以下命令&#xff1a; Python: Select Interpreter输入命令回车后即出现不同的Python解释器选项&#xff0c;选择想要切换的Python解释器…

火焰检测算法、明烟明火检测、烟火检测算法

烟火检测算法主要用于火灾早期预警系统中&#xff0c;能够在火灾初期阶段及时发现烟雾或火焰&#xff0c;从而快速响应并采取行动&#xff0c;以减少火灾带来的损失。以下是对烟火检测算法的应用场景及优势的详细介绍。 烟火检测算法广泛应用于多种场景中&#xff0c;以下是一些…

C++ inline内联函数

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 用 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用的地方…

Netty笔记05-组件Handler Pipeline

文章目录 概述ChannelHandler方法 ChannelPipeline特点 总结 代码示例服务器端客户端 EmbeddedChannelEmbeddedChannel 的方法 概述 ChannelHandler ChannelHandler 是 Netty 中的一个接口&#xff0c;它定义了处理 I/O 事件的方法。ChannelHandler 可以处理各种类型的事件&a…