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去了解一下游戏中的功能都是怎么实现的。这一切还是要…...
【Python MCP服务器开发终极模板】:20年架构师亲授源码级解析与高并发优化实战
第一章:Python MCP服务器开发模板概览与核心设计哲学Python MCP(Model-Controller-Protocol)服务器开发模板是一套面向协议驱动、可插拔架构的轻量级服务框架,专为构建高内聚、低耦合的模型交互后端而设计。其核心不依赖于特定Web…...
GLM-4v-9b效果展示:学术海报截图→研究方法/结果/结论三段式结构化提取
GLM-4v-9b效果展示:学术海报截图→研究方法/结果/结论三段式结构化提取 1. 模型能力概览 GLM-4v-9b是智谱AI在2024年推出的开源多模态模型,拥有90亿参数,专门处理文本和图像的联合理解任务。这个模型最大的特点是能够同时看懂图片和文字&am…...
4个步骤实现跨设备数据同步:开源工具Kazumi的WebDAV集成方案
4个步骤实现跨设备数据同步:开源工具Kazumi的WebDAV集成方案 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi …...
终极窗口尺寸编辑器:SRWE让你的应用程序窗口自由伸缩
终极窗口尺寸编辑器:SRWE让你的应用程序窗口自由伸缩 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE Simple Runtime Window Editor (SRWE) 是一款革命性的开源工具,它能让你实时调整任何…...
Vue2集成海康摄像头RTSP流:基于FFmpeg转码与WebSocket实时传输方案
1. 海康摄像头RTSP流播放的技术挑战 海康威视作为国内主流监控设备厂商,其摄像头输出的RTSP流在Web端直接播放存在天然技术屏障。浏览器原生不支持RTSP协议,传统方案需要依赖浏览器插件或转码服务。我在实际项目中发现,直接使用VLC测试RTSP流…...
某循环流化床锅炉设计【论文+ CAD图纸+翻译】
循环流化床锅炉作为高效清洁燃烧技术的代表,其设计需兼顾热效率、污染物控制与运行稳定性。论文部分通过系统分析流体力学、传热学及燃烧学原理,构建了锅炉本体结构、受热面布置与气固两相流场优化的理论模型。针对不同煤种特性,重点探讨了循…...
除了阿里云,还有哪些靠谱的身份证实名认证方案?SpringBoot整合横向评测
SpringBoot整合主流身份证实名认证API横向评测:从阿里云到多服务商技术选型指南 当你的应用需要接入身份证实名认证功能时,阿里云可能只是众多选项中的一个起点。作为技术决策者,如何在腾讯云、百度智能云、聚合数据等众多服务商中做出最优选…...
利用快马平台快速构建技能评估系统原型:以skill-vetter为例
利用快马平台快速构建技能评估系统原型:以skill-vetter为例 最近在做一个前端开发技能评估系统,需要快速验证产品原型。传统开发流程从搭建环境到功能实现至少需要1-2周,但通过InsCode(快马)平台的AI辅助和现成模板,我只用了3天就…...
别再踩坑了!KubeKey离线安装K8s v1.26.12时,containerd镜像拉取失败的完整避坑指南
KubeKey离线部署K8s集群:containerd镜像拉取全流程避坑手册 第一次用KubeKey离线部署Kubernetes集群时,containerd镜像拉取失败的问题让我折腾了大半天。看着部署日志里反复出现的证书错误提示,才意识到离线环境下的镜像仓库配置远比想象中复…...
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您是否拥有一台被苹…...
