Keras【极简】ACGAN

GAN实战(1)——Keras使用ACGAN实现数据扩增(含代码) 之前一篇博客介绍了GAN网络的原理,之后对原始GAN网络进行了多次改进,可以实现不同的任务。本篇博客对图像领域的不同GAN网络以及它们适用的任务进行汇总。 GAN系列(1)——各类GAN网络汇总DCGANStyleGANCycleGANCycleGAN DCGAN StyleGAN CycleGAN CycleGAN ... 阅读详情

1、序言

  • GAN升级版:辅助分类器对抗生成式网络
    (Auxiliary Classifier Generative Adversarial Network)
  • 本文用Keras实现极简的ACGAN,利用面向对象的思想将模型封装成3部分:生 成 器、审 判 者和欺 诈 者
  • https://gitee.com/arye/dl/tree/master/Keras/ACGAN

2、网络结构

2.1、生 成 器

2.2、审 判 者

2.3、欺 诈 者

3、代码(直接复制可用)

import numpy as np, matplotlib.pyplot as mp, os
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import (
    Input, Dense, Reshape, Flatten, Embedding,
    Conv2DTranspose, Conv2D, LeakyReLU,
    BatchNormalization, Dropout,
    multiply)
from keras.optimizers import Adam
from keras.utils import plot_model

"""配置"""
# 生成图像路径
dir_imgs = 'images/'
path_imgs = dir_imgs + '%02d.png'
# 模型可视化路径
dir_model_imgs = 'model_images/'
path_cnnt_imgs = dir_model_imgs + 'cnnt.png'
path_generator_imgs = dir_model_imgs + 'generator.png'
path_cnn_imgs = dir_model_imgs + 'cnn.png'
path_judge_imgs = dir_model_imgs + 'judge.png'
path_tricker_imgs = dir_model_imgs + 'tricker.png'
# 新建文件夹
for dir_i in [dir_imgs, dir_model_imgs]:
    if not os.path.exists(dir_i):
        os.mkdir(dir_i)

# 网络参数
shape = (28, 28, 1)  # 图像维度
num_classes = 10  # 手写数字10分类
noise_dim = 100  # 【噪音】输入层维度
adam = Adam(lr=2e-4, beta_1=.5)  # 优化器

# 训练参数
n_samples = 40960  # 样本总量
batch_size = 512  # 批量
times = int(n_samples / batch_size)  # 训练次数
epochs = 33  # 训练轮数

# 【真伪】
mix = np.array([1.] * batch_size + [0.] * batch_size)
trick = np.ones(batch_size * 2)

# 【类别】权重分配:【真实类别】权重为2,【噪音类别】权重为0,总体权重均值为1
weight = [np.ones(batch_size * 2),
          np.concatenate((np.ones(batch_size) * 2, np.zeros(batch_size)))]


def load_data():
    (x, y), _ = mnist.load_data()
    x = x[:n_samples].reshape(-1, *shape) / 127.5 - 1
    return x, y[:n_samples].reshape(-1, 1)


class GAN:
    def __init__(self):
        self.generator = None  # 【生成器】
        self.judge = None  # 【审判者】
        self.tricker = None  # 【欺诈者】

    def modeling(self):
        self.build_generator()
        self.build_judge()
        self.build_tricker()

    def build_generator(self):
        """输入【噪音】和【类别】,输出【赝品】图像"""
        # 反卷积神经网络
        cnnt = Sequential()
        cnnt.add(Dense(3 * 3 * 384, input_dim=noise_dim, activation='relu'))
        cnnt.add(Reshape((3, 3, 384)))
        cnnt.add(Conv2DTranspose(192, 5, strides=1, activation='relu',
                                 kernel_initializer='glorot_normal'))
        cnnt.add(BatchNormalization())
        cnnt.add(Conv2DTranspose(96, 5, strides=2, padding='same', activation='relu',
                                 kernel_initializer='glorot_normal'))
        cnnt.add(BatchNormalization())
        cnnt.add(Conv2DTranspose(1, 5, strides=2, padding='same', activation='tanh',
                                 kernel_initializer='glorot_normal'))

        # 【噪音】和【类别】
        noise = Input(shape=(noise_dim,))
        num = Input(shape=(1,), dtype='int32')
        num_emb = Embedding(num_classes, noise_dim,
                            embeddings_initializer='glorot_normal')(num)
        h = multiply([noise, num_emb])  # 哈达马积

        # 输出【赝品】图像
        x_fake = cnnt(h)
        self.generator = Model([noise, num], x_fake)

        # 模型可视化
        plot_model(cnnt, path_cnnt_imgs,
                   show_shapes=True, show_layer_names=False)
        plot_model(self.generator, path_generator_imgs,
                   show_shapes=True, show_layer_names=False)

    def build_judge(self):
        """输入图像,输出【真伪】和【类别】"""
        # 卷积神经网络
        cnn = Sequential()

        cnn.add(Conv2D(32, 3, strides=2, padding='same', activation=LeakyReLU(.2),
                       input_shape=shape))
        cnn.add(Dropout(.3))

        cnn.add(Conv2D(64, 3, strides=1, padding='same', activation=LeakyReLU(.2)))
        cnn.add(Dropout(.3))

        cnn.add(Conv2D(128, 3, strides=2, padding='same', activation=LeakyReLU(.2)))
        cnn.add(Dropout(.3))

        cnn.add(Conv2D(256, 3, strides=1, padding='same', activation=LeakyReLU(.2)))
        cnn.add(Dropout(.3))

        cnn.add(Flatten())

        # 输入图像,获取图像特征
        image = Input(shape)
        flatten = cnn(image)

        # 输出【真伪】和【类别】
        judgement = Dense(1, activation='sigmoid')(flatten)
        num = Dense(num_classes, activation='softmax')(flatten)

        # 编译
        self.judge = Model(image, [judgement, num])
        self.judge.compile(
            adam, ['binary_crossentropy', 'sparse_categorical_crossentropy'])

        # 模型可视化
        plot_model(cnn, path_cnn_imgs,
                   show_shapes=True, show_layer_names=False)
        plot_model(self.judge, path_judge_imgs,
                   show_shapes=True, show_layer_names=False)

    def build_tricker(self):
        """伪造【赝品】交给【审判者】,返回审判结果,据此提升【伪造技术】"""
        # 生成【赝品】图像
        noise = Input(shape=(noise_dim,))
        num_noise = Input(shape=(1,), dtype='int32')
        x_fake = self.generator([noise, num_noise])

        # 【审判者】不训练
        self.judge.trainable = False
        judgement, num_judgement = self.judge(x_fake)
        self.tricker = Model([noise, num_noise], [judgement, num_judgement])

        # 编译
        self.tricker.compile(
            adam, ['binary_crossentropy', 'sparse_categorical_crossentropy'])

        # 模型可视化
        plot_model(self.tricker, path_tricker_imgs,
                   show_shapes=True, show_layer_names=False)

    def train_judge(self, x, y):
        # 【赝品】图像制造
        noise = np.random.uniform(-1, 1, (batch_size, noise_dim))  # 均匀分布
        num_noise = np.random.randint(0, num_classes, (batch_size, 1))
        x_fake = self.generator.predict([noise, num_noise], verbose=0)

        # 真假图像合并
        x = np.concatenate((x, x_fake))
        num = np.concatenate((y, num_noise), axis=0)

        # 批训练,返回损失
        return self.judge.train_on_batch(x, [mix, num], sample_weight=weight)

    def train_tricker(self):
        noise = np.random.uniform(-1, 1, (batch_size * 2, noise_dim))
        num = np.random.randint(0, num_classes, (batch_size * 2, 1))
        return self.tricker.train_on_batch([noise, num], [trick, num])

    def train(self, x, y):
        loss_d = self.train_judge(x, y)  # 训练【审判者】
        loss_t = self.train_tricker()  # 训练【欺诈者】
        return loss_d, loss_t

    def save_fig(self, epoch):
        nrows, ncols = 10, 10
        noises = np.random.normal(size=(nrows * ncols, noise_dim))
        nums = np.array(list(range(nrows)) * ncols)
        imgs = self.generator.predict([noises, nums])
        imgs = .5 * imgs + .5  # 预处理还原
        for i in range(nrows):
            for j in range(ncols):
                mp.subplot(nrows, ncols, i * ncols + j + 1)
                mp.imshow(imgs[i * ncols + j].reshape(28, 28), cmap='gray')
                mp.axis('off')
        mp.savefig(path_imgs % epoch)
        mp.close()


if __name__ == '__main__':
    gan = GAN()
    gan.modeling()
    x, y = load_data()
    for e in range(epochs):
        print('\033[033m{} %s\033[0m'.format(e) %
              '[loss_d_total loss_d_2 loss_d_10] [loss_t_total loss_t_2 loss_t_10]')
        for i in range(times):
            loss_d, loss_t = gan.train(x[i * batch_size: (i + 1) * batch_size],
                                       y[i * batch_size: (i + 1) * batch_size])
            print(i, loss_d, loss_t)
        gan.save_fig(e)

4、伪 造 图 像 展 示

训练30次后有较好结果

基于Keras的生成对抗网络(4)——利用Keras搭建ACGAN生成手写体数字并贴上标签 0、前言 上两篇文章分别介绍了DCGAN 和CGAN的基本原理和代码示例,同时也反映出二者的一些缺点,比如DCGAN无法为图像添加标签进行分类,CGAN生成图像效果不好等。这一篇就来一下DCGAN与CGAN的综合版本——ACGAN。 一、ACGAN介绍及其结构 1.1 ACGAN介绍 ACGAN全称Auxiliary Classifier GAN,是在CGAN基础上的扩展,通过对判别器进行改进实现了图像分类的功能,论文链接:https://arxiv.org/abs/1610.09585 原始GAN网络的功 阅读详情

相关推荐

辅助分类器GAN(ACGAN)

ACGAN 在 CGAN 基础上引入辅助分类任务,通过重构辅助信息提升生成性能。其生成器结构与 CGAN 相同,输入噪声和标签并输出对应类别的伪造图像;判别器则取消条件输入,改为同时输出图像真实性概率和类别标签。损失函数在 CGAN 基础上增加分类任务:判别器需完成真伪判别和图像分类双重目标,生成器则需同时欺骗判别器并确保伪造图像可被正确分类。实验表明,这种多任务学习机制显著提升了 ACGAN 的生成质量和训练稳定性。

盼小辉丶的博客 3167

ACGAN

既然这两种思路都可以提高生成数据的质量,于是ACGAN综合了以上两种思路,既使用标签信息进行训练,同时也重建标签信息,结合CGAN和SGAN的优点,从而进一步提升生成样本的质量,并且还能根据指定的标签相应的样本。为两部分,一部分是源数据真假的判断,形状为:(batch_size, 1),一部分是输入数据的分类结果,形状为:(batch_size, class_num)。因此判别器的最后一层有两个并列的全连接层,分别得到这两部分的输出结果,即判别器的输出有两个张量(真假判断张量和分类结果张量)。

沐阳的博客 1420

Keras搭建ACGAN利用卷积给生成带标签结果

Keras搭建ACGAN利用卷积给生成带标签结果

qq_30895747的博客 170

深度对抗型网络

生成模型(GenerativeModel)是一种可以通过学习训练样本来产生更多类似样本的模型。在所有生成模型当中,最具潜力的是生成对抗网络(Generative Adversarial Networks, GANs)。GANs 是非监督机器学习的一种,它的运作方式可被看做是两个神经网络相互竞争的零和游戏(zero-sum game)。 时间要回溯到2014年,Ian Goodfellow等人...

Tony_wei01的博客 4490

Keras上用ACGAN实现自己数据的数据扩增(可直接运行)

在Keras上使用ACGAN生成图片实现数据扩增,可直接运行。输入一个随机数和标签可以调用生成模型输出指定种类的图片。生成模型和判别模型可根据自己的任务调优设计。

第G9周:ACGAN理论与实战:acgan代码

第G9周:ACGAN理论与实战:acgan代码

好像还挺好玩的GAN4——Keras搭建ACGAN利用卷积给生成结果贴上标签

好像还挺好玩的GAN4——Keras搭建ACGAN利用卷积给生成结果贴上标签学习前言什么是CGAN神经网络构建1、Generator2、Discriminator训练思路实现全部代码 学习前言 我又死了我又死了我又死了! 什么是CGAN CGAN一种带条件约束的GAN,在生成模型(D)和判别模型(G)的建模中均引入条件变量y(conditional variable y)。 使用额外信息y对模型...

Bubbliiiing的学习小课堂 7130

python爬虫豆瓣读书top250+数据清洗+数据库+Java后端开发+Echarts数据可视化(二)

之前的博客已经写了python爬取豆瓣读书top250的相关信息,接下来继续看如何清洗数据。 如果有没看懂的或是不了解上一部分说的是什么内容的,请看https://blog.youkuaiyun.com/qq_45804925/article/details/112848887 现在开始具体内容的复习: 1. 豆瓣读书top250信息预处理 #数据清洗 import pandas as pd import re import time # 先读取数据文件 data = pd.read_csv('E:/Class/商.

qq_45804925的博客 4443

AcGan论文解读及Keras实现

AcGan 译文下载地址 链接:https://pan.baidu.com/s/1OEHITJ0f9SwJrc_XyGOvEQ 提取码:az2o 译文一瞥: 介绍 本文中主要是提出了一种新的网络结构,可量化辨识度和多样性的方法及一些实验论证。 新的网络结构 本文主要介绍了一种CGan的变种,其带有额外的辅助分类器,称之为AcGan。主体网络结构仍然是生成器G和判别器D,只是G的输入除了随机噪声z...

Noonebirdyou的博客 3823

Ubuntu+Dify实战:如何让大模型知识库完美支持图片召回(附避坑指南)

本文详细介绍了在Ubuntu系统上部署Dify平台,并实现大模型知识库图片召回功能的完整实战方案。通过解析Dify处理图片的底层逻辑,重点讲解了配置Nginx代理服务器将本地图片路径转换为可公开访问URL的核心工程步骤,并提供了文档预处理、环境变量配置以及父子分段策略等高级技巧,帮助开发者构建图文并茂的AI应用,有效提升知识库的丰富性和用户体验。

c7d8e的博客 447

车载毫米波雷达实战:用MATLAB复现DDMA-MIMO雷达的Empty-band算法(附代码解析)

本文详细介绍了车载毫米波雷达中DDMA-MIMO技术的实战应用,重点解析了Empty-band算法的原理与MATLAB实现。通过搭建仿真环境,文章深入探讨了发射天线通道解调与相位法速度解模糊两大核心难题的解决方案,并提供了完整的代码解析,为雷达算法工程师提供了从理论到实践的清晰指南。

hill8的博客 564

Keras搭建ACGAN生成MNIST手写体图片

一. CGAN和ACGAN 1. CGAN 普通的GAN输入的是一个N维的正态分布随机数\color{red}随机数随机数,而CGAN会为这个随机数添上标签\color{red}随机数添上标签随机数添上标签; CGAN利用Embedding层将正整数(索引值)转换为固定尺寸的稠密向量\color{red}固定尺寸的稠密向量固定尺寸的稠密向量,并将这个稠密向量与N维的正态分布随机数相乘\color{red}相乘相乘,从而获得一个有标签的随机数\color{red}有标签的随机数有标签的随机数。 2. AC

Paul_Huang的专栏 898

骚戴笔记公告

骚戴笔记公告

我从不打没有准备的仗! 2万+

小白的GAN网络学习(四)- ACGAN

ACGAN 文章目录ACGANACGAN & CGANACGAN的损失函数基于mnist数据集的ACGAN实现 ACGAN & CGAN CGAN通过在生成器和判别器中均使用标签信息进行训练,仅能产生特定标签的数据 ACGAN是CGAN的另一种实现,既使用标签信息进行训练,同时也重建标签信息 生成器的输入包括class 和 noise 两部分,其中class为训练数据的标签(ba...

summer_bugs的博客 1993

RK3568笔记二:部署手写数字识别模型

部署手写数字识别模型,使用手写数字识别(mnist)数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的深度学习入门的必学模型,是深度学习领域中的经典卷积神经网络(CNN)架构之一。过程分为:训练,导出ONNX,转化RKNN,测试。

1172

Graphviz安装及使用:决策树可视化

Python大数据分析与机器学习学习笔记 Graphviz安装及使用:决策树可视化

算法工程师 1万+

深度学习ACGan学习笔记,keras版

一.ACGAN(Auxiliary Classifier GAN) 依旧有Generator,Discriminator,可使用MNSIT训练生成图片。 和DCGAN的不同: 1.增加了class类别标签参与训练,可以生成指定类别的图片 代码引用的《Web安全之强化学习与GAN》,位置: https://github.com/duoergun0729/3book/code/keras-a...

u011311291的博客 4141

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 471

keras/examples/mnist_acgan.py ACGAN代码解析

  # -*- coding: utf-8 -*- """ Train an Auxiliary Classifier Generative Adversarial Network (ACGAN) on the MNIST dataset. See https://arxiv.org/abs/1610.09585 for more details. You should start to se...

ygfrancois的博客 1683

深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解

/ 加载动态库// 获取符号地址// 关闭动态库// 获取错误信息public:// 单例获取// 销毁实例// 加载插件// 卸载插件private:// 获取插件实例// 插件映射锁// 插件映射表public:Plugin();~Plugin();// 加载算法// 卸载算法// 获取算法实例// 设置算法实例private:// 算法接口指针// 动态库句柄// 算法ID// 版本信息// 配置信息字符串int len;

m0_67505153的博客 509

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ACGAN 简介与代码实战

ACGAN 简介与代码实战

修行之路 734

Camera2Demo

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

官网实例详解4.22(mnist_acgan.py)-keras学习笔记四

基于MINIST数据集训练辅助分类器ACGAN(生成对抗网络) 包含了辅助分类器(功能)的生成对抗网络 Keras实例目录 运行生成文件 效果展示 plot_epoch_073_generated(图片文件) 代码注释 # -*- coding: utf-8 -*- """ Train an Auxiliary Classifier Generative Adversari...

wyx100的专栏 3715

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ACGAN(Auxiliary Classifier GAN)详解与实现(tensorflow2

ACGAN实现。

2401_89794436的博客 979

keras之ACGAN学习

结构 流程 1 generate层输入(none,100)的噪声和(none,1)的标签作为输入,输出(28,28,1)的图像。(以手写数字为例) 2 discriminator层输入(28,28,1)的图像(输入真实图像或者fake图像(generate生成的)),输出为(none,1)和(none,10)判别真伪和种类。 3 参数的更新,通过discrimination的输出和真实的标签(none,1)和(none,10)之间的误差。 generatediscrimination combine 程序

weixin_44671058的博客 414

GAN变体keras程序总结

话不多说,附上 eriklindernoren/Keras-GAN 一位GitHub群众eriklindernoren就发布了17种GAN的Keras实现,得到Keras亲爸爸François Chollet在Twitter上的热情推荐。 这真的超级棒,对于我这种辣鸡,看一篇外文要好几天还看不到的人来说,有了这些代码,瞬间明白了文章的意思和做法了! 现在将我看的代码总结下关键地方。 1、...

Wisley的读书笔记分享 497

生成对抗网络入门到实战(2) --- keras生成带标签MNIST手写体

生成对抗网络运行环境CGAN 概念(普通)ACGAN概念(卷积)简单神经网络构建GeneratorDiscriminator训练思路全部代码效果展示卷积神经网络构建GeneratorDiscriminator实现思路全部代码效果展示 运行环境 tensorflow-gpu==1.13.1 keras==2.1.5 CGAN 概念(普通) 原始的GAN的生成器只能根据随机噪声进行生成图像,至于这个图像是什么(即标签是什么我们无从得知),判别器也只能接收图像输入进行判别是否图像来使生成器。因此CGAN的

一名新生程序员的日常 6925
上一篇: 多标签(multilabel)分类
下一篇: 删除Python项目下所有__pycache__
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值