InfoGAN详细介绍及特征解耦图像生成

article/2025/5/11 8:04:10

InfoGAN详细介绍及特征解耦图像生成

  • 一.InfoGAN框架理解
    • 特征耦合
    • InfoGAN
    • InfoGAN论文实验结果
  • 二.VAE-GAN框架理解
    • VAE-GAN算法步骤
  • 三.BiGAN框架理解
  • 四.InfoGAN论文复现
    • 使用MNIST数据集复现InfoGAN
    • 代码编写
      • 初始化判别器
      • 初始化生成器
      • 初始化分类器
      • 训练InfoGAN网络
  • 总结
  • 参考文献及博客

一.InfoGAN框架理解

特征耦合

我们知道最基本的GAN就是输入一个随机的向量,输出一个图片。以手写数字为例,我们希望修改随机向量的某一维,能改变数字的特想,比如角度,粗细,数字等
特征解耦:
在这里插入图片描述
如上图:实际情况中的特征是非常杂乱无章的,然后我们希望的特征关系是比较整齐明了的,具体哪一列表示什么很清晰,从而便于控制它。而infogan的目的就是将这些杂乱无章的特征清晰化规律化。
特征解耦举例:
我们可以找到某一个控制某个特征对应的神经元,然后去改变它的值进而就可以改天具体某个特征。如下图举例所示:
在这里插入图片描述

InfoGAN

InfoGAN的框架如下:
在这里插入图片描述
Z为输入,输入分为两部分(标签和噪声),这里的C是在初始化的时候随机给定的,这里的生成器类似于编码器,其次还有一个分类器中与生成器组成一个类似于自动编码器。将真实数据或者生成数据放入分类器中,它可以去学习C,因为生成器生成的数据中就隐藏着C的一些关系,分类器就将数据重新提取重新得到C的这样一个过程。
更进一步说明:
在这里插入图片描述

InfoGAN论文实验结果

在这里插入图片描述
a图所示的向量C1可控制生成具体哪一类数字,b图几乎没有差异,C3是控制宽度的一个向量,通过控制C3可生成不同宽度的数字。

二.VAE-GAN框架理解

自动编码器是将输入数据压缩到高度抽象的特征空间然后进行重构的过程。一开始对于输入数据X进行压缩重构成一个向量z,在进行解码器进行解码,使输出和输入尽可能接近。这一步的操作的目的是为了更好的欺骗判别器,其余部分跟传统的GAN 网络是一致的,如下图所示:
在这里插入图片描述

VAE-GAN算法步骤

在这里插入图片描述
编码器要做的就是让P(z|x)逼近分布P(z),比如标准正太分布,同时最小化生成器(解码器)和输入x的差距。生成器(解码器)要做的就是最小化输出和输入x的差距,同时又要骗过判别器。判别器要做的就是给真实的高分,跟P(z)采样生成的和重建的低分。
具体算法:
在这里插入图片描述

三.BiGAN框架理解

BiGAN就是双向GAN的意思,这里的判别器与上面介绍的判别器不一样,这里的判别器接收的是图像和编码,判别图像和编码是来自编码器还是解码器。
算法思想:将编码器和解码器分开,但是加一个判别器,将他们的输入和输出同时作为判别器的输入,然后区分是来自编码器还是解码器,如果无法分别来自哪个,就说明编码器的输入图片和解码器生成的图片很接近,编码器输出的z和解码器输入的z很接近,目的就达到了。
简单的原理就是将编码器看成一个P(x,z)分布,将解码器看成Q(x,z)分布,通过判别器,让他们的差异越来越小。理想情况下就会:

在这里插入图片描述
具体算法:
在这里插入图片描述

四.InfoGAN论文复现

使用MNIST数据集复现InfoGAN

无标记信息情况下学习生成可控的图片
在这里插入图片描述
通过输入向量的控制进行控制自己想要生成的图像。

代码编写

初始化判别器

初始化判别器代码:
// An highlighted blockdef _init_dicriminator(self, input, isTrain=True, reuse=False):"""初始化判别器网络模型:param input: 输入数据op:param isTrain: 是否训练状态:param reuse: 是否复用内部参数:return: 判断结果op"""with tf.variable_scope('discriminator', reuse=reuse):# input [none,32,32,1]conv1 = tf.layers.conv2d(input, 32, [4, 4], strides=(2, 2), padding='same')  # [none,16,16,32]bn1 = tf.layers.batch_normalization(conv1, training=isTrain)active1 = tf.nn.leaky_relu(bn1)# layer 2conv2 = tf.layers.conv2d(active1, 64, [4, 4], strides=(2, 2), padding="same")  # [none,8,8,64]bn2 = tf.layers.batch_normalization(conv2, training=isTrain)active2 = tf.nn.leaky_relu(bn2)# layer 3conv3 = tf.layers.conv2d(active2, 128, [4, 4], strides=(2, 2), padding='same')  # [none,4,4,128]bn3 = tf.layers.batch_normalization(conv3, training=isTrain)active3 = tf.nn.leaky_relu(bn3)# layer 4active4 = tf.reshape(active3, shape=[-1, 4 * 4 * 128])out = tf.layers.dense(inputs=active4, units=self.d_dim)return out;

初始化生成器

 初始化生成器代码
// An highlighted blockdef _init_generator(self, input_c, input_z, isTrain=True, resue=False):"""初始化生成器网络模型:param input_c: 输入条件[none,c_dim]:param input_z: 输入随机噪声[None,z_dim]:param isTrain: 是否训练状态:param resue: 是否复用内部参数:return: 生成数据op"""with tf.variable_scope("generator", reuse=resue):# layer1input = tf.concat([input_c, input_z], axis=1)  # [none,c_dim+z_dim]input = tf.reshape(input, shape=[-1, 1, 1, self.c_dim + self.z_dim])de1 = tf.layers.conv2d_transpose(input, 256, [4, 4], strides=(1, 1), padding='valid')  # [none,4,4,256]de_bn1 = tf.layers.batch_normalization(de1, training=isTrain)de_active1 = tf.nn.leaky_relu(de_bn1)# layer 2de2 = tf.layers.conv2d_transpose(de_active1, 128, [4, 4], strides=(2, 2), padding="same")  # [none,8,8,128]de_bn2 = tf.layers.batch_normalization(de2, training=isTrain)de_active2 = tf.nn.leaky_relu(de_bn2)# layer 3de3 = tf.layers.conv2d_transpose(de_active2, 64, [4, 4], strides=(2, 2), padding="same")  # [none,16,16,64]de_bn3 = tf.layers.batch_normalization(de3, training=isTrain)de_active3 = tf.nn.leaky_relu(de_bn3)# layer 4de4 = tf.layers.conv2d_transpose(de_active3, 1, [4, 4], strides=(2, 2), padding="same")  # [none,32,32,1]out = tf.nn.sigmoid(de4)  #0,1return out

初始化分类器

初始化分类器代码
// An highlighted blockdef _init_classifier(self, input, isTrain=True, reuse=False):"""初始化分类器网络模型:param input: 输入数据(图像)[none,img_h,img_w,img_c]:param isTrain: 是否训练状态:param reuse: 是否复用内部参数:return: 分类条件结果op"""with tf.variable_scope("classifier", reuse=reuse):# input [none,32,32,1]conv1 = tf.layers.conv2d(input, 32, [4, 4], strides=(2, 2), padding='same')  # [none,16,16,32]bn1 = tf.layers.batch_normalization(conv1, training=isTrain)active1 = tf.nn.leaky_relu(bn1)# layer 2conv2 = tf.layers.conv2d(active1, 64, [4, 4], strides=(2, 2), padding="same")  # [none,8,8,64]bn2 = tf.layers.batch_normalization(conv2, training=isTrain)active2 = tf.nn.leaky_relu(bn2)# layer 3conv3 = tf.layers.conv2d(active2, 128, [4, 4], strides=(2, 2), padding='same')  # [none,4,4,128]bn3 = tf.layers.batch_normalization(conv3, training=isTrain)active3 = tf.nn.leaky_relu(bn3)# layer 4active4 = tf.reshape(active3, shape=[-1, 4 * 4 * 128])out_c = tf.layers.dense(inputs=active4, units=self.c_dim, activation=tf.nn.softmax)return out_c

训练InfoGAN网络

训练InfoGAN网络代码
// An highlighted blockdef train(self, batch_size=64, itrs=100000, save_time=1000):"""训练InfoGAN网络:param batch_size: 采样数据量:param itrs: 迭代训练次数:param save_time: 保存,测试模型周期:return: None"""start_time = time.time()data = dh.load_mnist_resize(path="data/MNIST_data",img_w=32,img_h=32)for i in range(itrs):mask = np.random.choice(data['data'].shape[0],batch_size,replace=True)batch_x = data['data'][mask]batch_noise_c = np.random.multinomial(1,self.c_dim*[0.1],size=batch_size)batch_noise_z = np.random.normal(0,1,(batch_size,self.z_dim))#训练判别器_,D_loss_curr= self.sess.run([self.D_trainer,self.D_loss],feed_dict={self.x:batch_x,self.gen_z:batch_noise_z,self.gen_c:batch_noise_c,self.isTrain:True})# 训练生成器batch_noise_c = np.random.multinomial(1, self.c_dim * [0.1], size=batch_size)batch_noise_z = np.random.normal(0, 1, (batch_size, self.z_dim))_,G_loss_curr = self.sess.run([self.G_trainer,self.G_loss],feed_dict={self.gen_c:batch_noise_c,self.gen_z:batch_noise_z,self.isTrain:True})# 训练分类器idx = np.random.randint(0,self.c_dim)batch_noise_z =np.random.normal(0,1,(batch_size,self.z_dim))batch_noise_c = np.zeros([batch_size,self.c_dim])batch_noise_c[:,idx] =1_,C_loss_curr = self.sess.run([self.C_trainer,self.C_loss],feed_dict={self.gen_z:batch_noise_z,self.gen_c:batch_noise_c,self.isTrain:True})# 保存模型if i%save_time==0:idx = np.random.randint(0, self.c_dim)batch_noise_z = np.random.normal(0, 1, (25, self.z_dim))batch_noise_c = np.zeros([25, self.c_dim])batch_noise_c[:, idx] = 1self.gen_data(c=batch_noise_c,z=batch_noise_z,save_path="out/InfoGAN_MNIST/"+str(i).zfill(6)+".png")self.test_model()print("i:",i," D_loss",D_loss_curr," G_loss",G_loss_curr," C_loss",C_loss_curr)self.save()end_time = time.time()time_loss = end_time-start_timeprint("时间消耗",int(time_loss),"秒")start_time = time.time()self.sess.close()

总结

无论是InfoGAN还是VAE—GAN,BiGAN都是自动编码器+GAN的框架,核心就是利用自动编码器压缩后的特征与GAN网络建立联系

参考文献及博客

[1] I. Goodfellow, J. Pouget-Abadie, M. Mirza, B. Xu, D. Warde-Farley,S. Ozair, A. Courville, and Y. Bengio, “Generative adversarial nets,” in Advances in Neural Information Processing Systems (NIPS), pp. 2672–2680,2014.
[2] T. Salimans, I. Goodfellow, W. Zaremba, V. Cheung, A. Radford, X. Chen,and X. Chen, “Improved techniques for training gans,” in Advances inNeural Information Processing Systems (NIPS), pp. 2226–2234, 2016.
[3]M. Arjovsky, S. Chintala, and L. Bottou, “Wasserstein gan,”arXiv:1701.07875, 2017.
博客:
https://so.csdn.net/so/search?q=BiGAN&t=blog&u=wangwei19871103


http://chatgpt.dhexx.cn/article/tbhugRCm.shtml

相关文章

InfoGAN介绍

今天给大家分享的是NIPS2016的InfoGAN。这篇paper所要达到的目标就是通过非监督学习得到可分解的特征表示。使用GAN加上最大化生成的图片和输入编码之间的互信息。最大的好处就是可以不需要监督学习,而且不需要大量额外的计算花销就能得到可解释的特征。 通常&#…

10.可视化、可视分析、探索式数据分析

前言:基于人大的《数据科学概论》第十章。主要内容为可视化的定义、可视化的意义、可视化的一般过程、科学可视化与信息可视化、可视化的原则、可视化实例、可视化的挑战和趋势、可视分析技术、探索式数据分析、可视化工具。 一、可视化的定义 可视化是数据的可视表…

国内外大数据可视化分析产品点评

一、KINETICA Kinetica 利用图像处理芯片提供计算支持,允许企业使用机器学习,商业智能分析和可视化技术更快速地分析海量数据; 点评:它的核心技术能力是类MapD的GPU数据库,功能性能较强大,非开源&#xf…

数据分析可视化之模型介绍

一 前言 “数据分析可视化”这条术语实现了成熟的科学可视化领域与较年轻的信息可视化领域的统一。 数据分析可视化:是指将大型数据集中的数据以图形图像形式表示,并利用数据分析和开发工具发现其中未知信息的处理过程。 数据可视化已经提出了许多方法&…

5个最受欢迎的大数据可视化软件

数据可视化的本质是视觉对话,数据可视化将数据分析技术与图形技术结合,清晰有效地将分析结果信息进行解读和传达。 大数据可视化是进行各种大数据分析解决的最重要组成部分之一。 一旦原始数据流被以图像形式表示时,以此做决策就变得容易多了…

软件架构-可视化

软件架构-可视化 当我们在讨论系统时,往往都会说这个系统的架构是什么样的,在你口述的同时,如果能借助某些图表,效果会更好,传统的uml建模比较复杂,目前的软件工程大家更关注效率(这里我不谈敏捷…

48 款数据可视化分析工具大集合

作者:DC君 来源:DataCastle数据城堡 本篇专门推荐48款数据可视化工具,全到你无法想象。 1、Excel 作为一个入门级工具,是快速分析数据的理想工具,也能创建供内部使用的数据图,但是Excel在颜色、线条和样式上…

爬取某小说榜单爬虫及可视化分析

爬取某小说榜单爬虫及可视化分析(仅用于学习) gitee代码链接:https://gitee.com/huang_jia_son/duoduo.git 介绍 GUI界面python爬虫数据清洗与处理pyecharts可视化展示软件架构 (1)通过tkinter制作GUI界面&#xf…

咖啡PowerBI可视化实例

目录 一、导入数据 二、构建指标 1、构架表之间的关系 ​ 2、完善表 3、构建指标 三、可视化 1、整体分析 2、省份业务 3、产品维度 4、地区维度 5、客户维度 6、价格分析 7、利润分析 8、其它分析 一、导入数据 二、构建指标 1、构架表之间的关系 软件会…

CodeScene - 软件质量可视化工具

CodeScene - 软件质量可视化工具 CodeScene https://codescene.com/ https://codescene.io/ The powerful visualization tool using Predictive Analytics to find hidden risks and social patterns in your code. 使用 Predictive Analytics 的功能强大的可视化工具&#x…

使用excel、python、tableau对招聘数据进行数据处理及可视化分析

招聘数据数据分析及可视化 数据来源前言一、观察数据删除重复值数据加工 二、利用python进行数据分析和可视化1.引入库2.读入数据观察描述统计,了解数据大概信息 3.数据预处理3.1数据清洗3.1.1 删除重复值3.1.2缺失值处理 3.2数据加工 4.数据可视化4.1城市岗位数量4…

可视化工具软件排行榜

市面上的数据可视化工具软件如此之多,有哪些可视化软件工具居于排行榜单的前列呢?你用的软件上榜了吗? 1、FineBI 来自帆软公司,虽作一个BI工具,但是可视化效果不错,可制作Dashboard。优势在于一旦准备好…

2020年六十款数据分析的可视化工具推荐

今天小编将为大家盘点六十款数据分析的可视化工具,让你妥妥的成为会议室乃至全公司最亮的崽~ 1、ChartBlocks ChartBlocks是一款网页版的可视化图表生成工具,在线使用。通过导入电子表格或者数据库来构建可视化图表。整个过程可以在图表的向导指示下完成。它的图表在HTML…

值得推荐的13款可视化软件,快收藏!

数据可视化力求用图表结合的方式把所有的数据整合在某一图像上,这样呈现在观众眼前的画面不仅仅是美观,且比以往长篇大论或是密密麻麻的数据表格更直观易懂,更便于观察分析。到今年上半年为止,国内外已经有了很多发展的较好的数据…

深入分析ArrayMap

前面我们分析了Android为了节省内存提供的一个HahMap<Integer, ?>的替代品SparseArray。SparseArray只能替代key的类型为int的Map。Android也提供了一个key不用局限于int的Map的实现&#xff0c;ArrayMap。老规矩我们通过调试来深入的分析一下ArrayMap&#xff08;看本文…

ArrayMAP介绍

它不是一个适应大数据的数据结构&#xff0c;相比传统的HashMap速度要慢&#xff0c;因为查找方法是二分法&#xff0c;并且当你删除或者添加数据时&#xff0c;会对空间重新调整&#xff0c;在使用大量数据时&#xff0c;效率并不明显&#xff0c;低于50%。 ArrayMap is a ge…

Android特别的数据结构(二)ArrayMap源码解析

1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成&#xff0c;一个int[] mHashes用来存放Key的hash值&#xff0c;一个Object[] mArrays用来连续存放成对的Key和ValuemHashes数组按非严格升序排列初始默认容量为0减容&#xff…

ArrayMap 源码的详细解析

最近在写framework层的系统服务&#xff0c;发现Android 12中用来去重注册监听的map都是用的ArrayMap&#xff0c;因此仔细研究了ArrayMap的原理。 目录 一. ArrayMap概述 二. ArrayMap源码解析 1.主要包含的成员变量 2.构造函数 3. public boolean containsKey(Object ke…

SparseArray和ArrayMap

首先我们来介绍一下HashMap&#xff0c;了解它的优缺点&#xff0c;然后再对比一下其他的数据结构以及为什么要替代它。 HashMap HashMap是由数组单向链表的方式组成的&#xff0c;初始大小是16&#xff08;2的4次方&#xff09;&#xff0c;首次put的时候&#xff0c;才会真…

SparseArray与ArrayMap

SparseArray SparseArray核心代码 两个构造函数默认数组容量10 public SparseArray() {this(10); } public SparseArray(int initialCapacity) {if (initialCapacity 0) {mKeys EmptyArray.INT;mValues EmptyArray.OBJECT;} else {mValues ArrayUtils.newUnpaddedObjectA…