GANs-生成对抗网络
参考:
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和dropoutdiscriminator.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和dropoutdiscriminator.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层,其神经元数量= 128x7x7generator.add(Dense(128 * 7 * 7, activation="relu", input_dim=100))# 将图像尺寸重塑为7 x 7 x 128generator.add(Reshape((7, 7, 128)))# 上采样层,将图像尺寸加倍到14 x 14generator.add(UpSampling2D(size=(2,2)))# 添加一个卷积层来运行卷积过程+批量归一化generator.add(Conv2D(128, kernel_size=3, padding="same", activation="relu"))generator.add(BatchNormalization(momentum=0.8))# 将图像尺寸上采样到28 x 28generator.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)
相关文章:
GANs-生成对抗网络
参考: https://mp.weixin.qq.com/s?__bizMjM5ODIwNjEzNQ&mid2649887403&idx3&snf61fc0e238ffbc56a7f1249b93c20690&chksmbfa0f632460e035f00be6cc6eb09637d91614e4c31da9ff47077ca468caad1ee27d08c04ca32&scene27 https://cloud.tencent.com…...
e冒泡排序---复杂度O(X^2)
排序原理: 1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。 2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值, public class 冒泡排序 {public static void main(String[] args) {I…...
C语言--结构体(学习笔记)
内容借鉴于b站杜远超官方频道(C语言结构体详解【干货】) 首先C语言中定义变量格式为“数据类型 变量名”,如int a; float b;等等。 那么结构体则是将多个变量(数据类型 变量名)结合在一起的一种新的数据类型&…...
Vue项目中实现用户登录后跳回原地址
本地存储 在 Vue 3 中,你可以使用 Vue Router 和 sessionStorage 或 localStorage 来实现用户登录后跳回原来的页面。以下是一种常见的实现方式: 在用户登录之前,记录当前页面的路由路径: 在需要登录的页面组件中,在…...
【Google Chrome Windows 64 version及 WebDriver 版本】
最近升级到最新版本Chrome后发现页面居然显示错乱实在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 64 位 VersionSize下载地址Date104.0.5112.10282.76 MBhtt…...
[ffmpeg] 音视频编码
本文主要梳理 ffmpeg 中音视频编码的常用函数 API调用 常用 API const AVCodec *avcodec_find_encoder(enum AVCodecID id); AVCodecContext *avcodec_alloc_context3(const AVCodec *codec); void avcodec_free_context(AVCodecContext **avctx); int avcodec_open2(AVCode…...
springboot+redis+缓存
整合 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 连接redis,配置yml文件 主机 端口号 数据库是哪一个 密码 配置类 p…...
关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
一、关于http的206状态码和416状态码的意义及断点续传 HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据,一般用来解决大文件下载问题,一般CDN…...
SOMEIP_ETS_114: SD_Entries_Length_wrong_combined
测试目的: 验证DUT能够拒绝一个包含两个正确条目但条目数组长度不正确的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个条目数组长度与实际条目数量不匹配的Sub…...
SQL:DATEDIFF函数
DATEDIFF函数是用于计算两个日期之间的时间间隔的函数,它在不同的编程语言和数据库系统中都有广泛的应用。以下是对DATEDIFF函数的详细解析: 一、函数用途 DATEDIFF函数的主要用途是计算两个日期之间的时间间隔,这个间隔可以是年、季度、月…...
MATLAB 可视化基础:绘图命令与应用
目录 1. 绘制子图1.1基本绘图命令1.2. 使用 subplot 函数1.3. 绘图类型 2.MATLAB 可视化进阶(以下代码均居于以上代码的数据定义上实现)2.1. 极坐标图2.3. 隐函数的绘制 3.总结 在数据分析和科学计算中,数据可视化是理解和解释结果的关键工具。今天,我将…...
掌握 Python 异常处理的实战技巧:从基础到高级应用20240918
掌握 Python 异常处理的实战技巧:从基础到高级应用 引言 在 Python 编程中,异常处理是保障代码稳健性和可靠性的关键要素之一。无论是在网络请求、资源访问,还是复杂的业务逻辑中,异常处理都不可或缺。本文将从 Python 异常的基…...
One API 部署与配置指南
技术文档:One API 部署与配置指南 概述 One API 是一个多功能的 API 管理平台,支持自定义设置、用户管理、多种登录注册方式、主题切换等。本文档提供了详细的部署和配置指南,帮助用户快速搭建和使用 One API。 部署 基于 Docker 部署 D…...
国密起步7:BouncyCastle使用SM4自定义格式加解密C#版
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 github源码指引的指引-CSDN博…...
Qt优秀开源项目之二十三:QSimpleUpdater
QSimpleUpdater是开源的自动升级模块,用于检测、下载和安装更新。 github地址:https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多(911个),但已在很多开源项目看到其身影,比如Not…...
使用 Nmap 进行 SSL/TLS 加密套件枚举
1. Nmap 简介 Nmap(Network Mapper)是一个开源的网络探测和安全审计工具。它广泛用于扫描网络并发现设备、端口及服务,同时也支持多种脚本来进行更高级的安全扫描。Nmap 的 -sV 参数可以用于探测开放端口上的服务及版本信息,配合…...
探索 Python 的火焰:Fire 库的神秘力量
文章目录 🔥 探索 Python 的火焰:Fire 库的神秘力量第一部分:背景介绍第二部分:Fire 库是什么?第三部分:如何安装 Fire?第四部分:简单库函数使用方法第五部分:场景应用第…...
【Day14-单例设计模式动态代理】
单例设计模式 什么是设计模式(Design pattern) ? 一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。设计模式有20多种,对应20多种软件开发中会遇到的问题…...
代码随想录训练营Day7 | 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和
代码随想录 (programmercarl.com) Leetcode 454. 四数相加 II 题目描述 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N&#…...
C++和OpenGL实现3D游戏编程【目录】
欢迎来到zhooyu的专栏。 个人主页:【zhooyu】 文章专栏:【OpenGL实现3D游戏编程】 贝塞尔曲面演示: 贝塞尔曲面演示zhooyu 本专栏内容: 我们从游戏的角度出发,用C去了解一下游戏中的功能都是怎么实现的。这一切还是要…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
