基于paddle,aistudio的DCGAN

主要用于记录自己学习经历。

1   导入必要的包

import os
import random
import paddle
import paddle.nn as nn
import paddle.optimizer as optim
import paddle.vision.datasets as dset
import paddle.vision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

2   定义数据集

demo_dataset = paddle.vision.datasets.MNIST(mode='train')

3   查看数据集

demo_dataset[5][0]

4   查看数据集维度

for data in dataloader:breakdata[0].shape

5   参数初始化模块

@paddle.no_grad()
def normal_(x, mean=0., std=1.):temp_value = paddle.normal(mean, std, shape=x.shape) # 该op返回符合正态分布(均值为mean,标准差为std的正态随机分布)的随机Tensor。x.set_value(temp_value)return x@paddle.no_grad()
def uniform_(x, a=-1., b=1.):temp_value = paddle.uniform(min=a, max=b, shape=x.shape)# 该op返回值服从范围[min,max]内均值分布的随机Tensor,性状为shape,数据类型为dtypex.set_value(temp_value)return x@paddle.no_grad()
def constant_(x, value):temp_value = paddle.full(x.shape, value, x.dtype)# 该op创造形状大小为shape并且数据类型为dtype的Tensor,其中元素值均为fill_value。x.set_value(temp_value)return xdef weights_init(m):classname = m.__class__.__name__if hasattr(m, 'weight') and classname.find('Conv') != -1:normal_(m.weight, 0.0, 0.02)elif classname.find('BatchNorm') != -1:normal_(m.weight, 1.0, 0.02)constant_(m.bias, 0)

6   生成器代码

# Layer 给予OOD实现的动态图Layer,包含该Layer的参数,前序运动的结构等信息

class Generator(nn.Layer):def __init__(self, ):super(Generator, self).__init__()# 顺序容器。子Layer将按构造函数参数的顺序添加到此容器中。# 传递给构造函数的参数可以Layers或可迭代的name Layer元组。self.gen = nn.Sequential(# input is Z, [B, 100, 1, 1] -> [B, 64 * 4, 4, 4]nn.Conv2DTranspose(100, 64 * 4, 4, 1, 0, bias_attr=False),# 二维转置神经层# 改层根据输入(input),卷积核(kernel)和空洞大小(dilations),步长(stride)# 填充(padding)来计算输出特征层大小或者通过output_size指定输出特征层大小。# 输入(Input)和输出(Output)为NCHW或NHWC格式,其中N是批尺寸,C为通道数(channel)# H为特征层高度,W为特征层宽度。卷积核是MCHW格式,M是输出图像通道数,# C是输入图像通道数,H是卷积核高度,W是卷积核宽度。# 如果组数大于1,C等于输入图像通道数除以组数的结果。# 转置卷积的计算过程相当于卷积的反向计算。# 转置卷积又被称为反卷积(但其实并不是真正的反卷积)。nn.BatchNorm2D(64 * 4),# 该接口用于构建 BatchNorm2D 类的一个可调用对象。# 可以处理4D的Tensor, 实现了批归一化层(Batch Normalization Layer)的功能,# 可用作卷积和全连接操作的批归一化函数,# 根据当前批次数据按通道计算的均值和方差进行归一化。nn.ReLU(True),# state size. [B, 64 * 4, 4, 4] -> [B, 64 * 2, 8, 8]nn.Conv2DTranspose(64 * 4, 64 * 2, 4, 2, 1, bias_attr=False),nn.BatchNorm2D(64 * 2),nn.ReLU(True),# state size. [B, 64 * 2, 8, 8] -> [B, 64, 16, 16]nn.Conv2DTranspose( 64 * 2, 64, 4, 2, 1, bias_attr=False),nn.BatchNorm2D(64),nn.ReLU(True),# state size. [B, 64, 16, 16] -> [B, 1, 32, 32]nn.Conv2DTranspose( 64, 1, 4, 2, 1, bias_attr=False),nn.Tanh()# Tanh激活层)def forward(self, x):return self.gen(x)netG = Generator()
# Apply the weights_init function to randomly initialize all weights
#  to mean=0, stdev=0.2.
netG.apply(weights_init)
# 用来对模型的参数进行初始化  将netG中参数都过weights_init进行初始化# Print the model
print(netG)

7   判别器代码

class Discriminator(nn.Layer):def __init__(self,):super(Discriminator, self).__init__()self.dis = nn.Sequential(# input [B, 1, 32, 32] -> [B, 64, 16, 16]nn.Conv2D(1, 64, 4, 2, 1, bias_attr=False),nn.LeakyReLU(0.2),# state size. [B, 64, 16, 16] -> [B, 128, 8, 8]nn.Conv2D(64, 64 * 2, 4, 2, 1, bias_attr=False),nn.BatchNorm2D(64 * 2),nn.LeakyReLU(0.2),# state size. [B, 128, 8, 8] -> [B, 256, 4, 4]nn.Conv2D(64 * 2, 64 * 4, 4, 2, 1, bias_attr=False),nn.BatchNorm2D(64 * 4),nn.LeakyReLU(0.2),# state size. [B, 256, 4, 4] -> [B, 1, 1, 1] -> [B, 1]nn.Conv2D(64 * 4, 1, 4, 1, 0, bias_attr=False),nn.Sigmoid())def forward(self, x):return self.dis(x)netD = Discriminator()
netD.apply(weights_init)
print(netD)

8   二分类的交叉熵损失函数

loss = nn.BCELoss()
# 该接口用于创建一个BCELoss的可调用类,
# 用于计算输入input和标签label之间的二值交叉熵损失值fixed_noise = paddle.rand([32, 100, 1, 1],dtype='float32')real_label = 1.
fake_label = 0.optimizerD = optim.Adam(parameters=netD.parameters(),learning_rate=0.0002,beta1=0.5,beta2=0.999)
optimizerG = optim.Adam(parameters=netG.parameters(),learning_rate=0.0002,beta1=0.5,beta2=0.999)
# Adam优化器出自 Adam论文 的第二节。
#能够利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

9   进行训练,先训练生成器,后训练判别器

losses = [[],[]]
now = 0
for pass_id in range(10):for batch_id,(data,target) in enumerate (dataloader):# enumerate  一般用于for中  获取字典索引和元素值optimizerD.clear_grad()# 梯度清空  防止积累real_img = databs_size = real_img.shape[0]label = paddle.full((bs_size,1,1,1),real_label,dtype='float32')real_out = netD(real_img)errD_real = loss(real_out,label)errD_real.backward()noise = paddle.randn([bs_size,100,1,1],'float32')fake_img = netG(noise)label = paddle.full((bs_size,1,1,1),fake_label,dtype='float32')fake_out = netD(fake_img.detach())errD_fake = loss(fake_out,label)errD_fake.backward()optimizerD.step()optimizerD.clear_grad()errD = errD_real+errD_fakelosses[0].append(errD.numpy()[0])optimizerG.clear_grad()noise = paddle.randn([bs_size,100,1,1],'float32')fake = netG(noise)label = paddle.full((bs_size,1,1,1),real_label,dtype=np.float32,)output = netD(fake)errG = loss(output,label)errG.backward()optimizerG.step()optimizerG.clear_grad()losses[1].append(errG.numpy()[0])if batch_id % 100 == 0:generated_image = netG(noise).numpy()imgs = []plt.figure(figsize=(15,15))try:for i in range(10):image = generated_image[i].transpose()image = np.where(image > 0, image, 0)image = image.transpose((1,0,2))plt.subplot(10, 10, i + 1)plt.imshow(image[...,0], vmin=-1, vmax=1)plt.axis('off')plt.xticks([])plt.yticks([])plt.subplots_adjust(wspace=0.1, hspace=0.1)msg = 'Epoch ID={0} Batch ID={1} \n\n D-Loss={2} G-Loss={3}'.format(pass_id, batch_id, errD.numpy()[0], errG.numpy()[0])print(msg)plt.suptitle(msg,fontsize=20)plt.draw()plt.savefig('{}/{:04d}_{:04d}.png'.format('work', pass_id, batch_id), bbox_inches='tight')plt.pause(0.01)except IOError:print(IOError)paddle.save(netG.state_dict(), "work/generator.params")

【DCGAN】生成对抗网络,手写数字识别相关推荐

  1. GAN (生成对抗网络) 手写数字图片生成

    GAN (生成对抗网络) 手写数字图片生成 文章目录 GAN (生成对抗网络) 手写数字图片生成 Discriminator Network Generator Network 简单版本的生成对抗网络 ...

  2. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  3. TensorFlow高阶 API: keras教程-使用tf.keras搭建mnist手写数字识别网络

    TensorFlow高阶 API:keras教程-使用tf.keras搭建mnist手写数字识别网络 目录 TensorFlow高阶 API:keras教程-使用tf.keras搭建mnist手写数字 ...

  4. [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  5. pytorch手写数字识别验证四流网络

    四流网络验证 四流网络10 epoch 结果 16.19526395201683 correct1: tensor(9871, device='cuda:0') Test acc: 0.9871512 ...

  6. 使用tf.keras搭建mnist手写数字识别网络

    使用tf.keras搭建mnist手写数字识别网络 目录 使用tf.keras搭建mnist手写数字识别网络 1.使用tf.keras.Sequential搭建序列模型 1.1 tf.keras.Se ...

  7. 基于Python的BP网络实现手写数字识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790047 资源下载地址:https://download.csdn.net/downl ...

  8. 深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别

    深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别 一.前言 二.网络结构 三.可解释性 四.记忆主线 五.遗忘门 六.输入门 七.输出门 八.手写数字识别实战 8.1 引入依赖库 8. ...

  9. GAN变种ACGAN利用手写数字识别mnist生成手写数字

    1.摘要 本文主要讲解:GAN变种ACGAN利用手写数字识别mnist数据集进行训练,最终生成手写数字图片 主要思路: Initialize generator and discriminator I ...

  10. 使用Keras训练Lenet网络来进行手写数字识别

    使用Keras训练Lenet网络来进行手写数字识别 这篇博客将介绍如何使用Keras训练Lenet网络来进行手写数字识别. LeNet架构是深度学习中的一项开创性工作,演示了如何训练神经网络以端到端的 ...

最新文章

  1. 视频用户行为及推荐系统评价KPI-部分
  2. C#中切割字符串之正则表达式应用
  3. 寻找U2OS中表达的基因及其promoter并用于后续annotation
  4. 开源项目|基于darknet实现量化感知训练,已实现yolov3-tiny所有算子
  5. 51Talk音视频技术实践和独特挑战
  6. [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】
  7. P6378 [PA2010] Riddle(2-sat/前后缀优化建图)
  8. SharePoint2010 对象模型 关联列表
  9. 现代控制理论——状态、状态空间、状态空间描述
  10. 移动平均法(Moving average,MA) 指数平滑法(Exponential Smoothing,ES)
  11. js 正则去前后空格且长度不大于20_js去除空格的正则用法
  12. 二、图的遍历——深度优先遍历
  13. python与开源gis空间分析_Python 与开源GIS —数据处理、空间分析与地图制图
  14. (XWZ)的Python学习笔记Ⅷ--------numpy
  15. 统计学中的十几个数据分析方法
  16. UE5 GPU崩溃D3D丢失的终极解决办法
  17. 举报合肥极宝网络信息科技有限公司,骗子平台
  18. cusparse下载_CUDA 8混合精度编程
  19. Java从零到企业级电商项目实战: linux环境配置
  20. hcia完结 静态路由综合实验

热门文章

  1. python数组数字求和_python数组求和
  2. 制作简单的div盒子
  3. 详解go generate
  4. 推荐系统[八]算法实践总结V4:混排算法在淘宝信息流第四代混排调控框架实战,提升推荐实时性捕捉实时兴趣。
  5. DES加密和解密工具,可以对字符串进行加密和解密操作
  6. 收藏数据结构学习网站
  7. SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过...
  8. 3.搭建Vue开发环境
  9. 如何区分生抽与老抽?
  10. 从一场相亲说起,决策树