【深度学习实践(八)】生成对抗网络(GAN)之手写数字生成

本文深入探讨了深度学习实践中的对抗生成网络(GAN),通过实例讲解如何用GAN生成逼真的手写数字。从定义、结构到训练过程,包括设置GPU、构建生成器和鉴别器,详细展示了模型训练步骤和关键代码实现。
部署运行你感兴趣的模型镜像

活动地址:优快云21天学习挑战赛

  👉引言💎

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
热爱写作,愿意让自己成为更好的人…


在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

【深度学习实践(八)】对抗生成网络(GAN)之手写数字生成

一、🌹对抗生成网络

1 定义与背景 :

生成对抗网络GAN是由蒙特利尔大学Ian Goodfellow在2014年提出的机器学习架构,GAN的核心本质是通过对抗训练将随机噪声的分布拉近到真实的数据分布

2 基本结构:
  • GAN本身是一个不断博弈,识别真假的过程,下面通过手写数字生成案例 窥探GAN对抗生成网络的原理及操作流程:

在这里插入图片描述

  • 定义一个模型来作为生成器(图三中蓝色部分Generator),能够输入一个向量,输出手写数字大小的像素图像(生成噪声

  • 定义一个分类器来作为判别器(图三中红色部分Discriminator)用来判别图片是真的还是假的(或者说是来自数据集中的还是生成器中生成的),输入为手写图片,输出为判别图片的标签

并且,既然是神经网络,那么模型就可以根据 外界反馈 自行调整参数,也就是会根据 标签匹配结果进行相应的学习与调整, 训练完成后 可以达到 ** 生成以假乱真的 手写数字图片效果**

二、🌹模型训练

💎1 设置GPU
  • GPU能够为大量数据的运算提供算力支持
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")
    
warnings.filterwarnings("ignore")             
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False    


💎2 构建GAN对抗网络生成器
def build_generator():
    # ======================================= #
    #     生成器,输入一串随机数字生成图片
    # ======================================= #
    model = Sequential([
        layers.Dense(256, input_dim=latent_dim),
        layers.LeakyReLU(alpha=0.2),               # 高级一点的激活函数
        layers.BatchNormalization(momentum=0.8),   # BN 归一化
        
        layers.Dense(512),
        layers.LeakyReLU(alpha=0.2),
        layers.BatchNormalization(momentum=0.8),
        
        layers.Dense(1024),
        layers.LeakyReLU(alpha=0.2),
        layers.BatchNormalization(momentum=0.8),
        
        layers.Dense(np.prod(img_shape), activation='tanh'),
        layers.Reshape(img_shape)
    ])

    noise = layers.Input(shape=(latent_dim,))
    img = model(noise)

    return Model(noise, img)


💎3 构造鉴别器
def build_discriminator():
    model = Sequential([
        layers.Flatten(input_shape=img_shape),
        layers.Dense(512),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(256),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(1, activation='sigmoid')
    ])

    img = layers.Input(shape=img_shape)
    validity = model(img)

  • 最后传入img以及model参数构造Model对象
    return Model(img, validity)
  • 鉴别器训练原理:通过对输入的图片进行鉴别,从而达到提升的效果

  • 生成器训练原理:通过鉴别器对其生成的图片进行鉴别,来实现提升


💎4 构造生成器
# 创建判别器
dis = build_discriminator()

# 定义优化器
optimizer = tf.keras.optimizers.Adam(1e-4)
dis.compile(loss='binary_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])
                      
# 创建生成器                       
generator = build_generator()
gan_input = layers.Input(shape=(latent_dim,))
img = generator(gan_input) 

#训练generate时候停止训练判别器
dis.trainable = False  

# 测试:对生成的假图片进行预测 
validity = discriminator(img)
combined = Model(gan_input, validity)
combined.compile(loss='binary_crossentropy', optimizer=optimizer)
💎5 训练模型
  • train_on_batch详解:

    keras在compile完模型后需要训练,除了常用的model.fit()与model.fit_generator外

    还有model.train_on_bantch作用:对一批样品进行单梯度更新,即对一个epoch中的一个样本进行一次训练

  • 使用train_on_batch优点:

    更精细自定义训练过程,更精准的收集 loss 和 metrics

    分布训练模型-GAN生成对抗神经网络的实现

    多GPU训练保存模型更加方便

    def train(epochs, batch_size=128, sample_interval=50):
    
  • 加载数据

    (train_images,_), (_,_) = tf.keras.datasets.mnist.load_data()
    
  • 将图片标准化到 [-1, 1] 区间内

    train_images = (train_images - 127.5) / 127.5
    
  • 数据

    train_images = np.expand_dims(train_images, axis=3)
    
  • 创建标签

    true = np.ones((batch_size, 1))
    fake = np.zeros((batch_size, 1))
    
  • 开始训练

    for epoch in range(epochs): 
    
        
            idx = np.random.randint(0, train_images.shape[0], batch_size)
            imgs = train_images[idx]      
            
        
            noise = np.random.normal(0, 1, (batch_size, latent_dim))
     
            gen_imgs = generator.predict(noise)
            
    
            d_loss_true = discriminator.train_on_batch(imgs, true)
            d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
            
            d_loss = 0.5 * np.add(d_loss_true, d_loss_fake)
    
            noise = np.random.normal(0, 1, (batch_size, latent_dim))
            g_loss = combined.train_on_batch(noise, true)
            
            print ("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100*d_loss[1], g_loss))
    
            # 保存样例图片
            if epoch % sample_interval == 0:
                sample_images(epoch)
    
    

在这里插入图片描述

  • 动图展示

    def compose_gif():
        # 图片地址
        data_dir = "F:/jupyter notebook/DL-100-days/code/images"
        data_dir = pathlib.Path(data_dir)
        paths    = list(data_dir.glob('*'))
        
        gif_images = []
        for path in paths:
            print(path)
            gif_images.append(imageio.imread(path))
        imageio.mimsave("test.gif",gif_images,fps=2)
    

🌹写在最后💖
路漫漫其修远兮,吾将上下而求索!伙伴们,再见!🌹🌹🌹在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

<think>好的,用户想要生成手写数字图片,我应该先考虑常用的方法。首先想到的是MNIST数据集,这是手写数字的经典数据源。使用Python的话,可以通过scikit-learn或者TensorFlow、PyTorch这些库来加载MNIST数据,然后从中提取图片。 不过用户可能更想自己生成而不是使用现有数据集。这时候可能需要用到生成模型,比如GAN生成对抗网络)或者VAE(变分自编码器)。GAN训练后可以生成逼真的手写数字,比如DCGAN的结构。另外,还可以用图像处理库如PIL或OpenCV手动绘制,但这样生成的可能不够真实。 需要分情况讨论:如果用户只需要现有的数字,可以直接从MNIST提取;如果想生成新的,用GAN等方法。还要考虑用户是否有深度学习背景,是否需要简单的方法。可能给出两种示例:一种用MNIST显示图片,另一种用GAN生成。 然后检查代码是否准确。比如用TensorFlow的Keras加载MNIST,然后matplotlib显示。对于GAN部分,可能需要提供训练代码,但生成示例可能较长,可以简化为加载预训练模型或简单示例。 可能遇到的问题:用户环境没有安装必要的库,需要提示安装。生成图片的质量问题,比如GAN训练时间不足导致的模糊。另外,数据增强的方法,如旋转、缩放等增加数据多样性。 最后,相关问题要围绕方法、模型、评估、挑战等方面提问,帮助用户深入思考。</think><< 生成手写数字图片主要有以下几种方法: 1. MNIST数据集提取(基础方法): ```python from sklearn.datasets import fetch_openml import matplotlib.pyplot as plt mnist = fetch_openml('mnist_784', version=1) X, y = mnist["data"], mnist["target"] # 显示第一个数字 digit = X[0].reshape(28, 28) plt.imshow(digit, cmap="binary") plt.axis("off") plt.show() ``` 2. 使用生成对抗网络GAN生成: ```python # 需要安装TensorFlow/Keras from keras.models import Sequential from keras.layers import Dense, Reshape, Flatten from keras.layers import Conv2D, Conv2DTranspose, LeakyReLU # 构建生成器模型 def build_generator(): model = Sequential([ Dense(7*7*256, input_dim=100), Reshape((7,7,256)), Conv2DTranspose(128, (5,5), strides=(1,1), padding='same'), LeakyReLU(0.2), Conv2DTranspose(64, (5,5), strides=(2,2), padding='same'), LeakyReLU(0.2), Conv2DTranspose(1, (5,5), strides=(2,2), padding='same', activation='tanh') ]) return model # 生成示例(需要先训练模型) generator = build_generator() noise = tf.random.normal([1, 100]) generated_image = generator(noise, training=False) plt.imshow(generated_image[0, :, :, 0], cmap='gray') plt.show() ``` 3. 使用Diffusion模型生成: ```python # 需要安装diffusers库 from diffusers import DDPMPipeline pipeline = DDPMPipeline.from_pretrained("google/ddpm-cifar10-32") image = pipeline().images[0] image.show() ``` 实现原理: - MNIST直接提取:使用经典数据集中的真实手写样本 - GAN方法:通过对抗训练让生成器学习真实数据分布 - Diffusion模型:通过逐步去噪过程生成高质量图像 注意事项: 1. GAN需要大量训练数据和计算资源 2. 生成图片质量取决于模型架构和训练时长 3. 可能需要调整超参数(如学习率、噪声维度等) 4. 生成结果存在一定随机性
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想new的出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值