Generative adversarial net with Mnist

从零复现原始GAN:手写数字生成的对抗原理与PyTorch实战 生成对抗网络(GAN)是一种基于博弈论思想的无监督生成模型,其核心在于生成器与判别器之间的极小极大对抗优化,而非传统概率密度拟合。原始GAN虽结构简单,却揭示了隐空间映射、梯度流控制与模式坍缩等关键挑战。理解其训练不稳定性、非饱和损失设计、[-1,1]数据归一化及权重初始化规范,是掌握WGAN、StyleGAN乃至扩散模型演进逻辑的基础。本文以MNIST手写数字生成为切入点,结合PyTorch工程实践,系统解析vanilla GAN的数学原理、网络架构约束与典型调试技巧,适用于AI初学者夯实生成式建模根基。 阅读详情
import tensorflow as tf

import numpy as np

import tensorflow.examples.tutorials.mnist.input_data as input_data

import math

import scipy

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#------------------分割线------------------#

batch_size=64

smooth=0.1

path = '/Users/changxingya/Documents/test_image'

#------------------分割线------------------#
#use the msra to initialize the parameters
'''
input_: Tensor of input, format NHWC

shape: [filter_height, filter_width, in_channel, out_channel]

k_step: The size of kernel

name: Name of model

'''
def conv2d(input_, shape, k_step, name):

  with tf.variable_scope(name):

    msra_num = 1.0

    fan_in = k_step * k_step * int(input_.get_shape()[-1])

    stddev = msra_num * (math.sqrt(2. / float(fan_in)))

    w = tf.get_variable('w', shape, initializer= tf.truncated_normal_initializer(stddev=stddev))

    b = tf.get_variable('b', [shape[-1]], initializer=tf.constant_initializer(value=0.0))

    conv = tf.nn.conv2d(input_, w, strides=[1,k_step,k_step,1], padding = 'SAME') + b

    return conv

'''
  input_: Tensor of input, format NHWC

  output: [height, width, output_channel, in_channel]

  k_step: The size of kernel is k_step*k_step

  d_step: we can define the generated image size, if you define the d_step=2,
          we can get the double size of generated image

'''

def deconv2d(input_, out_shape, k_step, d_step, name):

  with tf.variable_scope(name):

    msra_num = 1.0

    fan_in = k_step * k_step * int(input_.get_shape()[-1])

    stddev = msra_num * (math.sqrt(2. / float(fan_in) * float(d_step) * float(d_step)))

    w = tf.get_variable('w', [k_step, k_step, out_shape[-1], input_.get_shape()[-1]])

    deconv = tf.nn.conv2d_transpose(input_, w, output_shape=out_shape, strides=[1, d_step, d_step, 1])

  return deconv

'''

input_: Tensor of input, format NHWC

shape: [input_channel, out_channel]

'''

def fully_contact(input_, shape, name):

  with tf.variable_scope(name):

    msra_num = 1.0

    fan_in = int(input_.get_shape()[-1])

    stddev = msra_num * (math.sqrt(2./float(fan_in)))

    w = tf.get_variable('w', shape, initializer= tf.truncated_normal_initializer(stddev=stddev))

    b = tf.get_variable('b', shape[-1], initializer= tf.constant_initializer(value=0.0))

    fc = tf.matmul(input_, w) + b

    return fc

'''

define the function of leakrelu

'''

def leakyrelu(x, leak=0.2):

  k1 = (1 + leak)*0.5

  k2 = (1 - leak)*0.5

  return k1 * x + k2 * tf.abs(x)

'''

Restore pixel [-1, 1] to [0, 255]

'''

def rescale_image(image):

  convert_image = (image / 1.5 + 0.5) * 255

  return convert_image

'''

input: The tensor of input, format NHWC

size: recevie the number of images, such as size=8, we can get the 64 images, simultaneously

image_path: the path to store image

colorL: Ture is color image, Flase is gray image

iter: record continous storage images

'''

def save_image(input_, size, image_path, color, iter):

  h, w = input_.shape[1],input_.shape[2]

  convert_input = input_.reshape(batch_size, h, w)

  if color is True:

    image = np.zeros((h * size, w * size, 3))

  else:

    image = np.zeros((h * size, w * size))

  for index, img in enumerate(convert_input):

    i = index % size

    j = math.floor(index / size)

    if color is True:

      image[h*j:h*j+h, i*w:i*w+w,:] = img

    else:

      image[h*j:h*j+h, i*w:i*w+w] = img

  scipy.misc.toimage(rescale_image(image),cmin=0, cmax=255).save(image_path+'/tr_gt_%s.png' % (iter))

#------------------分割线------------------#

def discriminator(input_):

  with tf.variable_scope("discrimination", reuse = tf.AUTO_REUSE) as scope0:


      conv1 = conv2d(input_, [5, 5, 1, 32], 2, "conv1")

      conv1 = leakyrelu(conv1)

      conv2 = conv2d(conv1, [5, 5, 32, 64], 2, "conv2")

      conv2 = leakyrelu(conv2)

      flatten = tf.reshape(conv2, (-1, 7*7*64))

      logits = fully_contact(flatten, [7*7*64, 1], "fc")

      outputs = tf.sigmoid(logits)

      return outputs, logits

#------------------分割线------------------#

def generator(input_):

  with tf.variable_scope("generation", reuse = tf.AUTO_REUSE) as scope1:

    re_flatten = fully_contact(input_, [100, 7*7*64], "re_fc")  # (?, 1)

    deconv1 = tf.reshape(re_flatten, [-1, 7, 7, 64])

    deconv1 = deconv2d(deconv1, [batch_size, 14, 14, 32] ,5, 2, "deconv1")

    deconv2 = leakyrelu(deconv1)

    deconv2 = deconv2d(deconv2, [batch_size, 28, 28, 1] ,5, 2, "deconv2")

    outputs = tf.tanh(deconv2)

    return outputs


#------------------分割线------------------#

input_image = tf.placeholder(tf.float32, [None, 28, 28, 1])

input_noise = tf.placeholder(tf.float32, [None, 100])

# tensor_image = tf.reshape(input_image,[-1, 28, 28, 1])

#------------------分割线------------------#

generate_image = generator(input_noise)

fake_output, fake_logits = discriminator(generate_image)

real_output, real_logits = discriminator(input_image)

#------------------分割线------------------#

G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=fake_logits,
                        labels =tf.ones_like(fake_output * (1-smooth))))

D_real_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=real_logits,
                        labels =tf.ones_like(real_output) * (1-smooth)))

D_fake_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=fake_logits,
                        labels= tf.zeros_like(fake_output)))

D_loss = tf.add(D_real_loss, D_fake_loss)

#------------------分割线------------------#

train_var = tf.trainable_variables()

g_var = [var for var in train_var if var.name.startswith("generation")]

d_var = [var for var in train_var if var.name.startswith("discrimination")]

with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):

  train_loss_d = tf.train.AdamOptimizer(0.001, beta1=0.4).minimize(D_loss, var_list = d_var)

  train_loss_g = tf.train.AdamOptimizer(0.001, beta1=0.4).minimize(G_loss, var_list = g_var)

init = tf.global_variables_initializer()

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.6)

#------------------分割线------------------#

with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:

  sess.run(init)

  for i in range(1000):

    mnist_image= mnist.train.next_batch(batch_size)

    batch_noise = np.random.uniform(-1, 1, size=(batch_size, 100))

    batch_image = mnist_image[0].reshape(batch_size, 28, 28, 1)

    batch_image = batch_image * 2 - 1

    sess.run(train_loss_d, feed_dict={input_image: batch_image, input_noise: batch_noise})

    sess.run(train_loss_g, feed_dict={input_image: batch_image, input_noise: batch_noise})


    if i % 10 == 0:

      print(sess.run(G_loss, feed_dict={input_image: batch_image, input_noise: batch_noise}))

      print(sess.run(D_loss, feed_dict={input_image: batch_image, input_noise: batch_noise}))

      output_image = sess.run(generate_image, feed_dict={input_image: batch_image, input_noise: batch_noise})

      save_image(output_image, 8, path, False, i)

 

AIGC实战——条件生成对抗网络(Conditional Generative Adversarial Net, CGAN) 在本节中,构建了一个条件生成对抗网络 (Conditional Generative Adversarial Net, CGAN),通过将标签作为输入传递给判别器和生成器,能够生成可控类别的图像,这是由于标签为网络提供了额外的信息,以便使生成的输出与给定的标签相关联。 阅读详情

相关推荐

生成对抗网络(Generative Adversarial Network)原理与代码实战案例讲解

生成对抗网络(Generative Adversarial Network)原理与代码实战案例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 关键词:生成对抗网络(GAN)、深度学习、

AI天才研究院 528

TensorFlow学习(四):梯度带(GradientTape),优化器(Optimizer)和损失函数(losses)

训练你的机器

谢小小XH 19万+

mnist_softmax.py

tensorflow中MNIST源码mnist_softmax.py

【Tensorflow】tf.nn.relu函数

tf.nn.relu(features, name=None)  = max(0, features) 参数: features:A `Tensor`. 必须类型: `float32`, `float64`, `int32`, `int64`, `uint8`, `int16`, `int8`, `uint16`, `half`. name:名称 返回:Tensor

zj360202的专栏 2万+

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5722

Mac电脑用Latex论文排版3天速成5天实战de笔记

我后悔了,这五天竞赛搞得我视力都下降了...一个冲动的决定后成为数模竞赛论文写手,3天速成+5天时间=点亮攻克latex写论文技能💡关于Overleaf我是Mac,曾经按照大部分推荐的方式用TEXshop+vs code,但是把模板导入就开始报错。跟着少之又少的适配mac的教程(此时我已知道大概是走错路了)改了配置也无效。海鲜市场找佬改了半天,佬问我:一定要用VC吗?我说,那倒也不是。于是佬推荐我overleaf,三下五除二帮我挑配了环境,美汁汁收了我30块钱。

luwanjoyce的博客 2252

TensorFlow优化算法 tf.train.AdamOptimizer 简介

AdamOptimizer是TensorFlow中实现Adam算法的优化器。Adam即Adaptive Moment Estimation(自适应矩估计),是一个寻找全局最优点的优化算法,引入了二次梯度校正。Adam 算法相对于其它种类算法有一定的优越性,是比较常用的算法之一。 一、算法流程 初始化: 更新规则: 二、 参数定义 __init__( learning_rate=0.0...

python内置函数set() 3139

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1262

[生成对抗网络GAN入门指南](8)SGAN:Semi-Supervised Learning with Generative Adversarial Networks

本篇blog的内容基于原始论文SGAN:Semi-Supervised Learning with Generative Adversarial Networks和《生成对抗网络入门指南》第六章。(论文比较短只有3页,其中还包含一页citation) 为什么研究SGAN? 有大量的数据是不带标签的,带标签的数据只占一小部分; 在DCGAN的研究中我们看到使用生成模型特征抽取后形成...

gdtop的个人笔记 7075

从SN65HVD230芯片手册出发,手把手教你搞定3.3V CAN收发器电路(附典型应用图)

本文详细解析TI SN65HVD230芯片手册,指导完成3.3V CAN收发器电路设计。从关键参数解读到基础电路搭建,再到高级功能实现与EMC优化,提供完整的接口电路设计方案,并附典型应用图和故障排查指南,助力开发者提升CAN总线通信质量。

weixin_29997523的博客 516

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1248

Semi-Supervised Learning with Generative Adversarial Networks

如果你曾经听过或研究过深度学习,你可能听说过MNIST,SVHN,ImageNet,PascalVoc等。 每个数据集都有一个共同点。 它们由数百和数千个标记数据组成。 换句话说,这些集合由(x,y)对组成,其中(x)是原始数据,例如图像矩阵,(y)是数据点(x)代表什么的描述。 以MNIST数据集为例。 60,000个数据点中的每一个都是(输入,标签)对。 输入是2...

u013841458的博客 790

pnpm 卸载教程:彻底移除 pnpm 及全局缓存的方法

卸载 pnpm = 全局包 → CLI → 环境变量 → store 缓存只要按这个顺序来,基本不会留下任何坑。如果你后面还打算重新安装 pnpm / 切换 npm、yarn / 多包管理器共存,这些细节反而更重要,环境一旦干净,后续问题会少很多。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 940

Semi-Supervised Learning with Generative Adversarial Networks(小白学GAN 七)

原文链接:https://arxiv.org/pdf/1606.01583.pdf 简介

fan1102958151的博客 1271

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1432

【StarRocks】-- DATETIME 与 TIMESTAMP 区别详解

本文详细解析了StarRocks中DATETIME/DATETIMEV2与TIMESTAMP的区别及使用场景。DATETIME系列存储人类可读时间,不携带时区;TIMESTAMP实际指Unix时间戳,建议用BIGINT存储。关键差异包括:精度选择(DATETIMEV2支持微秒级)、时区处理(仅函数计算时影响)、存储方式等。针对不同场景提供选型建议:单时区展示用DATETIMEV2,跨时区计算用BIGINT存储Epoch。特别强调与MySQL迁移时的注意事项,并给出常见问题解决方案和最佳实践清单,包括统一入口

欢迎来到我的博客,一起探索代码里的世界! 501

Generative Adversarial Nets(译)

仅供参考,如有翻译不到位的地方敬请指出。 论文地址:Generative Adversarial Nets 论文翻译:XlyPb(http://blog.csdn.net/wspba/article/details/54577236) 摘要 我们提出了一个通过对抗过程估计生成模型的新框架,在新框架中我们同时训练两个模型:一个用来捕获数据分布的生成模型G,和一个用来估计样本来自训练数据而不是G的概率...

wanttifa的博客 680

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

PaperNotes(2)-Generative Adversarial Net-代码实现资料

生成对抗网络Abstract1.Introduction2.Related work3.Adversarial nets4.Theoretical Results4.1全局最优 $p_g=p_{data}$4.2算法1的收敛性质5.Experiments6.Advantagesa and disadvantages7.Conclusions and future work 开篇之作 Abstrac...

sinat_40624829的博客 773

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Semi-Supervised Learning with Generative Adversarial Networks 论文笔记

Abstract 我们通过强制鉴别器网络输出类标签,将生成对抗网络(GAN)扩展到半监督上下文。 我们在数据集上训练生成模型G和鉴别器D,其中输入属于N类之一。 在训练时,D用于预测输入所属的N + 1个类中的哪一个,其中添加额外的类以对应于G的输出。我们表明该方法可用于创建更具数据效率的分类器。 并且它允许生成比常规GAN更高质量的样本。  1. Introduction     ...

u013841458的博客 1857

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

paper:Conditional Generative Adversarial Nets

主要内容:原始的GAN是无监督的,本文想通过添加额外的信息y,来增加模型的能力,想法很直接,实现也很简单,应该是最早的一篇向GAN添加y的paper。 重要句子: Adversarial nets have the advantages that Markov chains are never needed, only backpropagation is used to obtain gra...

Z609834342的博客 320

PyTorch计算机视觉(5)——生成对抗网络(Generative Adversarial Network,GAN)

本节介绍了生成对抗网络 (Generative Adversarial Network, GAN) 的理论基础与实现方法。GAN 通过生成器与判别器的对抗博弈,使生成器逐步学习真实数据分布,最终生成以假乱真的样本。理论部分详细推导了最优判别器表达式及损失函数界限。实践环节首先在二次曲线数据集上验证了 GAN 训练框架,损失曲线与理论值高度吻合,随后将简单全连接 GAN 应用于 MNIST 手写数字生成。

盼小辉丶的博客 4081

PyTorch计算机视觉(7)——条件生成对抗网络(cGAN)

本节介绍了条件生成对抗网络 (GAN) 的原理与实现。CGAN 通过在生成器和判别器中同时引入标签信息(如图像类别),实现了对生成图像类型的精确控制。实践部分首先在 MNIST 和 Fashion-MNIST 数据集上构建 cDCGAN 模型,利用 nn.Embedding 将标签编码并与图像/噪声拼接,成功生成了指定数字的高质量图像。随后将该方法扩展到三分类的石头剪刀布手势数据集,采用 128×128 分辨率彩色图像,通过五层转置卷积生成器和六层卷积判别器配合指数衰减学习率调度器进行训练。

盼小辉丶的博客 3887

PyTorch计算机视觉(6)——深度卷积对抗神经网络(DCGAN)

本节探讨了深度卷积生成对抗网络 (DCGAN) 在图像生成中的应用。首先详细解析了转置卷积的数学原理,通过公式推导和代码示例阐明了其与标准卷积的互逆关系。随后在 MNIST 和 Fashion MNIST 数据集上构建四层 DCGAN 模型,通过设计分段学习率调度器并设置生成器学习率为判别器的 50 倍,有效平衡了双模型训练。最后将 DCGAN 应用于动漫人脸数据集,探讨了学习率比例 k 对训练稳定性的影响,揭示了 GAN 训练中双模型平衡的重要性。

盼小辉丶的博客 2091

深度学习图解Deep Learning Illustrated:从零开始掌握神经网络基础

想要轻松入门人工智能和机器学习吗?《深度学习图解Deep Learning Illustrated》项目为你提供了一条简单直观的学习路径!这个开源项目通过丰富的可视化示例和交互式Jupyter notebooks,让复杂的神经网络概念变得生动易懂。无论你是编程新手还是希望深化理解的专业人士,这个项目都能帮助你快速掌握深度学习核心原理。 ## 🎯 项目概述:深度学习图解入门指南 《深度学习图解

gitblog_00060的博客 846

200行PyTorch实现稳定收敛的WGAN-GP实战指南

生成对抗网络(GAN)是一种基于极小极大博弈原理的无监督生成模型,其核心价值在于学习数据分布的隐式表示而非显式建模。由于原始GAN依赖JS散度导致梯度消失、训练不稳定,Wasserstein GAN(WGAN)引入Earth-Mover距离并施加Lipschitz约束,显著提升收敛性与模式多样性。在工程实践中,WGAN-GP通过梯度惩罚替代权重裁剪,配合全连接架构、LayerNorm、LeakyReLU及[-1,1]归一化等关键设计,可在MNIST等中小规模数据集上实现鲁棒训练。本文聚焦可复现、可调试、可解

weixin_30797199的博客 437
上一篇: 链表遍历一次删除倒数第N个节点
下一篇: tensorflow AutoEncoder
SoyCoder
博客等级 码龄9年 12粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值