Keras【极简】GAN

Keras-GAN:使用Keras实现各种生成对抗网络 Keras-GAN项目为我们提供了丰富的GAN参考实现,是学习和实践GAN的绝佳资源。通过阅读和运行这些代码,我们可以深入理解各种GAN的工作原理,为自己的GAN应用开发打下坚实基础。 阅读详情

1、序言

  • 生成式对抗网络(Generative Adversarial Networks)至少包含2个模型:生成模型(Generative Model)和判别模型(Discriminative Model)。
  • 本文用Keras实现极简的GAN,利用面向对象的思想将模型封装成3部分:图像生成器、判别者和欺诈者

2、网络结构

2.1、图像生成器

图像生成器属于欺诈者的一部分,没有编译损失函数

2.2、判别者

判别者负责判别真假,损失函数为二元交叉熵

2.3、欺诈者

欺诈者训练时,判别者不训练,损失函数为二元交叉熵

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

from keras.datasets import mnist
from keras.layers import Input, Dense, Reshape, Flatten
from keras.models import Sequential, Model
import numpy as np, matplotlib.pyplot as mp, os
from keras.utils import plot_model

dir_imgs = 'imgs/'  # 图像储存文件夹
path_imgs = 'imgs/%02d.png'

img_shape = (28, 28)
noise_dim = 100  # 输入层维度

batch_size = 512  # 每次训练数量
times = 1000  # 每轮训练次数
epochs = 40  # 训练轮数

real = np.ones((batch_size, 1))  # 【正品】图像标签
fake = np.zeros((batch_size, 1))  # 【赝品】图像标签


def mkdir():
    if os.path.exists(dir_imgs):
        for fname in os.listdir(dir_imgs):
            os.remove(dir_imgs + fname)
    else:
        os.mkdir(dir_imgs)


def load_data():
    _, (x, _) = mnist.load_data()
    x = x / 127.5 - 1  # 图像预处理,映射到[-1,1]
    return x


class GAN:
    def __init__(self):
        self.generator = None  # 图像生成器
        self.discriminator = None  # 判别者
        self.welsher = None  # 欺诈者

    def init(self):
        # 建模
        self.build_generator()
        self.build_discriminator()
        self.build_welsher()
        # 模型可视化
        plot_model(self.generator, 'generator.png', show_shapes=True, show_layer_names=False)
        plot_model(self.discriminator, 'discriminator.png', show_shapes=True, show_layer_names=False)
        plot_model(self.welsher, 'welsher.png', show_shapes=True, show_layer_names=False)

    def build_generator(self):
        model = Sequential()
        model.add(Dense(250, activation='relu', input_dim=noise_dim))
        model.add(Dense(500, activation='relu'))
        model.add(Dense(np.prod(img_shape), activation='tanh'))
        model.add(Reshape(img_shape))
        self.generator = model

    def build_discriminator(self):
        model = Sequential()
        model.add(Flatten(input_shape=img_shape))
        model.add(Dense(500, activation='relu'))
        model.add(Dense(1, activation='sigmoid'))
        model.compile('adam', 'binary_crossentropy', ['acc'])
        self.discriminator = model

    def build_welsher(self):
        # 训练【欺诈者】时,不训练【判别者】
        self.discriminator.trainable = False
        # 伪造【赝品】
        noise = Input(shape=(noise_dim,))
        imgs_fake = self.generator(noise)
        # 【判别者】判别【赝品】
        discrimination = self.discriminator(imgs_fake)
        # 编译
        self.welsher = Model(noise, discrimination)
        self.welsher.compile('adam', 'binary_crossentropy')

    def train_discriminator(self, x):
        # 【正品】抽样
        idx = np.random.randint(0, x.shape[0], batch_size)
        imgs_real = x[idx]
        # 【赝品】制造
        noise = np.random.normal(0, 1, (batch_size, noise_dim))
        imgs_fake = self.generator.predict(noise)
        # 批训练
        d_loss_real = self.discriminator.train_on_batch(imgs_real, real)
        d_loss_fake = self.discriminator.train_on_batch(imgs_fake, fake)
        # 返回损失
        return np.add(d_loss_real, d_loss_fake) / 2

    def train_welsher(self):
        noise = np.random.normal(0, 1, (batch_size, noise_dim))
        return self.welsher.train_on_batch(noise, real)  # 返回损失

    def train(self, x):
        for i in range(epochs):
            loss_d, loss_w = [], []
            for _ in range(times):
                # 训练【判别者】
                loss_d.append(self.train_discriminator(x))
                # 训练【欺诈者】
                loss_w.append(self.train_welsher())
            # 训练过程展示
            print(i, '[loss_d acc_d]', np.mean(loss_d, axis=0), 'loss_w', np.mean(loss_w))
            # 保存【赝品】
            self.save_fig(i)

    def save_fig(self, epoch):
        nrows, ncols = 4, 6
        noise = np.random.normal(size=(nrows * ncols, noise_dim))
        imgs = self.generator.predict(noise)
        imgs = 0.5 * imgs + 0.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], cmap='gray')
                mp.axis('off')
        mp.savefig(path_imgs % epoch)
        mp.close()


if __name__ == '__main__':
    mkdir()
    gan = GAN()
    gan.init()
    x = load_data()
    gan.train(x)

4、生成的图像

本模型使用神经网络中最简单的MLP,纯粹为了方便理解GAN,不追求图像生成的效果,下面是训练3万次的效果:

万物皆可GAN之3D-GAN(keras框架) 这几天看了一篇比较有意思的文章,这里给你们分享一下。 论文地址:[https://arxiv.org/abs/1610.07584](https://arxiv.org/abs/1610.07584) 以下就用keras来对这个3D-GAN来进行分析;目前我还在看这篇文章的potorch代码,如果看懂了后续会将他给也分享出来。 分享出来主要是当作自己的学习笔记,然后也可以供大家学习参考。有兴趣的话,可以点击关注收藏。 阅读详情

相关推荐

深度学习——生成对抗网络(GAN)

生成对抗网络(GAN)是一种基于模拟深度学习模型的机器学习方法,它使用两个具有不同特征的网络来训练生成图像。生成图像可以通过以下步骤实现: 生成原始图像。 将生成的图像与真实图像进行对比,以检测差异并调整参数以提高质量。 训练一个新图像生成器,用于生成新的图像。

不迁怒,不贰过。小知识,大智慧。 3330

GAN学习:Keras入门

Keras入门1.环境配置2.搭建一个简单的网络3.多元线性回归3.1 准备数据集3.2 环境配置3.2代码3.4 结果 学习视频:来自bilibili 1.环境配置 在annaconda下创建一个新的虚拟环境 配置: tensorflow需要指定为2.0版本,注意tensorflow和keras的版本一定要对应,对应查看 pip install tensorflow==2.0 pip install keras==2.3.1 2.搭建一个简单的网络 搭建一个网络,去得到公式y=3*x+7,为一元线性回归

Cream_Cicilian的博客 6311

深度学习自学记录(5)——简单明了地实现Keras的生成对抗网络(GAN)(含代码)

深度学习自学记录(5)——简单明了地实现Keras的生成式对抗网络(GAN)1、生成式对抗网络(GAN)的原理2、GAN的训练思路3、GAN的Keras实现 1、生成式对抗网络(GAN)的原理 2、GAN的训练思路 3、GAN的Keras实现 ...

qq_40784418的博客 1761

Keras学习之:教你简单地写个 GAN 网络

文章目录1. GAN 网络原理1.1 generator 1. GAN 网络原理 GAN 网络由两个最主要的部分构成: generator discriminator 1.1 generator 生成器的作用很简单,那就是输入一个噪声,输出一个特定尺寸的图片、文本、数据等,在本文的例子中,generator 生成的数据是图片。先来看一下 generator 网络的定义: def generator(input_shape,channel): model = Sequential() #

qq_42902997的博客 1871

Keras深度学习实战(22)——生成对抗网络详解与实现

生成对抗网络 (Generative Adversarial Networks, GAN) 使用神经网络生成与原始图像集非常相似的新图像,它在图像生成中应用广泛,且 GAN 的相关研究正在迅速发展,以伪造生成与真实图像难以区分的逼真图像。本节首先介绍了对抗生成网络的基本原理,并使用 Keras 从零开始实现了一个对抗生成网络用于生成手写数字图像。

盼小辉丶的博客 1万+

基于Keras的生成对抗网络(1)——利用Keras搭建简单GAN生成手写体数字

0、前言 GAN网络是近两年深度学习领域的新秀,本文和之后的初识生成对抗网络系列旨在浅显理解传统GAN,分享学习心得。 关于为什么使用Keras进行搭建,而不是如日中天的TensorFlow和pytorch,因为keras是对新手最友好,最简单实用的深度学习框架,因此首先利用keras进行搭建,等充分理解GAN的结构和参数之后,再利用TensorFlow或pytorch进行搭建。 一、GAN结构 普通GAN的结构就是利用全连接层+激活函数,这里不过多介绍。 二、函数代码 2.1 生成器Generator 生

Wendy的博客 1193

基于 vibe.d 的 Web 框架基准测试实现解析:TechEmpower 六大测试场景的 D 语言落地

本文以 [frameworks/D/vibed/README.md](https://link.gitcode.com/i/a9b10877c2a63bc374b5f91764f80377) 为骨架,深入解析 D 语言异步框架 **vibe.d** 在 TechEmpower Framework Benchmarks 项目中如何实现 JSON、Plaintext、数据库查询、可变查询、Fortun

gitblog_00457的博客 1295

国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现

要用人工智能技术来庆祝国庆中秋,我们可以使用生成对抗网络(GAN)生成具有节日氛围的画作。这里将使用深度学习框架 TensorFlow 和 Keras 来实现。

AI时代光年 1857

经典回顾:Deep Learning with Python 2017第一版代码全解析与实战指南

**Deep Learning with Python** 是深度学习领域的里程碑著作,其配套的Jupyter notebooks项目([gh_mirrors/de/deep-learning-with-python-notebooks](https://link.gitcode.com/i/0f401d20328f114bf071582bd8ed346c))为初学者提供了从理论到实践的完整路径。

gitblog_00851的博客 731

Keras实现的生成对抗网络基础与实战

生成对抗网络(GAN)自2014年由Ian Goodfellow提出以来,已经成为机器学习领域的重要研究方向。本章旨在为读者提供一个关于GAN理论与实践的全面概览,帮助读者建立坚实的理论基础,并通过实际案例分析,掌握其在人工智能领域的多种应用。Keras是一个高层神经网络API,它能够以TensorFlow, CNTK, 或者 Theano作为后端运行。它具有快速实验的能力,它是一个Python库,专为人类而非机器而生,能够以最小的延迟将想法转化成结果。Keras的开发哲学是用户友好、模块化、易扩展。

weixin_29997223的博客 1123

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 447

生成对抗网络(GAN)简介以及Python实现

本篇博客简单介绍了生成对抗网络(Generative Adversarial Networks,GAN),并基于Keras实现GAN。 以往的生成模型都是预先假设生成样本服从某一分布族,然后用深度网络学习分布族的参数,最后从学习到的分布中采样生成新的样本。例如变分自编码器就是构建生成样本的密度函数p(x∣z,θ)p(x|z,\theta)p(x∣z,θ),这种模型称为显示密度模型。 GAN并不学习...

slx_share的博客 1万+

Power Automate实战:用SharePoint REST API批量处理列表数据(附JSON解析技巧)

本文深入探讨了如何利用Power Automate调用SharePoint REST API实现列表数据的批量自动化处理。文章详细解析了API的协同工作原理、高效的数据获取与筛选技巧,并重点分享了JSON数据解析的核心难点与实战解决方案,旨在帮助企业用户构建稳定可靠的数据处理流程,提升运营效率。

coffee的博客 771

深度学习模型:GAN(生成对抗网络)

通过最小化生成器的损失函数和最大化判别器的损失函数,可以实现生成器和判别器的优化。生成器的目标是生成足够真实的数据以欺骗判别器,而判别器的目标是区分输入数据是真实数据还是生成器生成的伪造数据。首先,固定生成器的参数,训练判别器以更好地区分真实数据和生成数据。然后,固定判别器的参数,训练生成器以生成更真实的数据。训练GAN模型时,需要注意平衡生成器和判别器之间的训练过程,以及选择合适的损失函数和优化器,GAN的训练过程可能不稳定,需要调整超参数和网络结构来获得更好的生成效果。

lymake的博客 6197

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1339

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

基于STM32F103C8T6的循迹避障小车完整制作过程 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程种也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。 我自己也算是一个小白,之前有做过 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎...

weixin_43924857的博客 14万+

好像还挺好玩的GAN1——Keras搭建简单GAN生成MNIST手写体

好像还挺好玩的GAN1——Keras搭建简单GAN生成MNIST手写体学习前言什么是GAN神经网络构建1、Generator2、Discriminator训练思路实现全部代码: 学习前言 我又死了我又死了我又死了! 什么是GAN 生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。 模型通...

Bubbliiiing的学习小课堂 1万+

DeepLearningTool-深度学习分类-和HALCON的详细过程

损失函数:衡量预测误差,用于模型优化。混淆矩阵:评估分类模型性能,提供详细预测结果分析。两者结合使用,可以全面评估和优化模型。过拟合:模型过于复杂,捕捉了噪声,表现为训练集误差低,测试集误差高。欠拟合:模型过于简单,无法捕捉数据模式,表现为训练集和测试集误差都高。调整参数过拟合:简化模型、增加数据、使用正则化、早停、Dropout。欠拟合:增加模型复杂度、特征工程、增加训练时间、调整学习率、使用集成方法。通过合理调整参数和方法,可以有效避免过拟合和欠拟合,提升模型性能。

weixin_36672036的博客 6197

生成对抗网络——GAN(一)

Generative adversarial network 据有关媒体统计:CVPR2018的论文里,有三分之一的论文与GAN有关! 由此可见,GAN在视觉领域的未来多年内,将是一片沃土(CVer们是时候入门GAN了)。而发现这片矿源的就是GAN之父,Goodfellow大神。 ~~~ 生成对抗网络GAN,是当今的一大热门研究方向。在2014年,被Goodfellow大神提出来,当时的G...

木盏 9万+

Matlab子图排版终极指南:从tight_subplot到tiledlayout的实战对比

本文深入对比Matlab中两大子图排版工具:社区经典函数tight_subplot与官方现代布局管理器tiledlayout。针对默认subplot产生的子图间距与边缘距离问题,详细解析两者的设计哲学、参数控制与实战应用,帮助用户根据版本与需求选择最佳方案,实现高效、精确且美观的多子图排版。

weixin_29048309的博客 360

深入解析Gerber RS274X文件格式:从基础语法到实战应用

本文深入解析PCB制造的核心标准Gerber RS274X文件格式,详细介绍了其基础语法、坐标系统、功能码以及嵌入式光圈定义等关键特性。通过实战案例演示了如何解析和手写Gerber指令,并总结了常见错误与调试技巧,帮助PCB工程师掌握这一与制造工厂沟通的“通用语言”,确保设计准确无误地转化为实体电路板。

weixin_29252171的博客 97

keras-adversarial:终极Keras GAN库入门指南 - 快速构建生成对抗网络

keras-adversarial是一个基于Keras的生成对抗网络(GAN)库,它提供了构建和训练各种对抗性模型的工具和优化器。通过这个强大的库,开发者可以轻松实现不同类型的GAN架构,包括标准GAN、AAE(对抗性自编码器)和BiGAN(双向GAN)等,无需从零开始编写复杂的对抗训练代码。 ## 为什么选择keras-adversarial? 对于深度学习新手和希望快速实现GAN模型的开发

gitblog_00594的博客 472

Pointnet++环境配置(Windows11和ubuntu)及训练教程

PS:前两行命令是数据处理的命令,主要是进行数据读取和生成相应的训练数据格式,在Ubuntu上是正常运行的,在Windows上运行会失败,无法生成训练用的数据格式,所以最好在Ubuntu上训练,如果一定要用Windows,可以ubuntu上生成数据格式在导到Windows上,数据生成不需要安装torch。通过anaconda配置的环境,在官网找的命令安装的,版本是2.1.0+cu118。训练命令:我使用的pycharm,直接在pycharm中打开终端,运行命令。Python版本:3.7。

AIcurator的博客 2558

深度学习框架之Keras感知:快速搭建生成对抗网络(GAN)生成自己想要的图片

1. 写在前面 如果是刚入深度学习的新手小白,可能有着只学习了一点深度学习的理论,也见识到了各种神经网络的强大而不能立马实现的烦恼,想学习TensorFlow,pytorch等出色强大的深度学习框架,又看到那代码晦涩难懂而有些想知难而退,这时候,我觉得有必要掌握一下Keras了,这是个啥? Keras是高级神经网络API,因为Keras短小精悍,非常适合快速原型制作和神经网络的搭建。在很短的时间内...

Miracle8070 6967

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用keras写一个生成对抗网络(GAN)

什么是生成对抗网络(GAN)? 1、GAN的用途? GAN的初衷就是生成不存在于真实世界的数据,类似于使得 AI具有创造力或者想象力。 应用场景如下: (1)AI作家,AI画家等需要创造力的AI体; (2)将模糊图变清晰(去雨,去雾,去抖动,去马赛克等),这需要AI具有所谓的“想象力”,能脑补情节; (3)进行数据增强,根据已有数据生成更多新数据供以feed,可以减缓模型过拟合现象。 2、GAN的结构: 理解GAN的两大护法G和D G是generator,生成器:负责凭空捏造数据出来 ..

a_123456598的博客 5055

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Keras-MNIST-GAN:基于Keras的MNIST手写数字生成对抗网络

Keras-MNIST-GAN:基于Keras的MNIST手写数字生成对抗网络 项目介绍 本项目【Keras-MNIST-GAN】旨在实现一个使用Keras框架的GAN(生成对抗网络)模型,专门用于处理经典的MNIST手写数字数据集。通过训练这个模型,它能够学习到手写数字的特征,并生成看似真实的新数字图像,展示了深度学习在生成建模领域的强大能力。 项目快速启动 首先,确保你的环境中已安装了Tens...

gitblog_00831的博客 920

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: Keras【极简】seq2seq
下一篇: Keras【自用命名规范】及【函数式API】
小基基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、付费专栏及课程。

余额充值