详解生成对抗网络(GAN)- 体验AI作画

目录

1.GAN是什么?

2.GAN的计算

3.编写GAN的小小示例

4.GAN的发展与应用 

5.AI作画体验-Disco Diffusion


1.GAN是什么?

2014年,因为朋友邀请协助一个计算机生成图像的项目,lanGooddellow发明了GAN(Generative adversarial network),被广泛用于图像生成!

GAN翻译过来,就是生成对抗网络了,它确实“人”如其名,正是一个生成对抗的过程。

生成器(Generator):生成数据,企图骗过判别器

判别器(Discriminator):判断数据,企图揪出生成器生成的假数据

让我们看一看这个生成对抗的过程吧,以图像为例(毕竟GAN大部分是为了生成图像嘛)

 一开始,生成器随机生成噪声数据,和真图一起输入判别器

c60c3fc589854493a16f139eb8d6da71.png

然后判别器开始训练,训练后判别器能轻易判别噪声和真图

于是我们又开始训练生成器,让生成出来的图片与真实更接近,等到这时的判别器无法分辨真假,只能瞎蒙(50%真50%假),我们便继续训练判别器

循环上述过程,形成一种对抗,生成器和判别器的性能都逐渐提升,最终得到很强的生成器和判别器

5f5b0e65383e4adfb35b8f2ff347a604.png

我们就可以用这个很强的生成器来生成图片啦!

2.GAN的计算

GAN的损失函数定义:

d109ea0203d4465e8ebb947c03602f2c.jpeg

 G:生成器 

 D:判别器

一切损失计算都是在D输出处产生的,而D的输出是true/fake,所以整体采用二分类的交叉熵损失函数

Ex~pdata表示从真实数据分布p中采样得到样本x

Ez~pz表示从特定数据分布p中采样得到样本z

G(z):生成器生成z

D(x):判别器判断真实数据,判断正确的概率

D(G(z)):判别器判断生成器生成的数据,判断正确的概率

判别器D训练阶段:

左边一项越大,意味着D(x)越大,判别器准确判断真实样本为true,有maxD

右边一项越大,意味着D(G(z))越小,判别器准确判断生成样本为fake,有maxD

生成器G训练阶段:

不管左边一项

右边一项越小,意味着D(G(z))越大,生成器生成的数据越逼真,有minG

训练判别器时最大化这个函数,训练生成器时最小化这个函数,形成对抗

3.编写GAN的小小示例

经典的MNIST手写数字数据集,简单好训练

tensorflow版本:2.10.0        keras版本:2.10.0

import keras
import tensorflow as tf
from keras import layers
from keras.datasets import mnist
import matplotlib.pyplot as plt
import numpy as np
import glob# 显存自适应分配(分配尽可能充足的GPU)
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
for gpu in gpus:tf.config.experimental.set_memory_growth(gpu,True)# 判断是否使用gpu进行训练
gpu_ok = tf.test.is_gpu_available()
print("tf version:", tf.__version__)
print("use GPU", gpu_ok) 
# 手写数据集
(train_images,train_labels),(test_images,test_labels) = mnist.load_data() 
train_images = (train_images)/255 # 归一化BATCH_SIZE = 256
BUFFER_SIZE = 60000
datasets = tf.data.Dataset.from_tensor_slices(train_images) # 创建数据集
datasets = datasets.shuffle(BUFFER_SIZE).batch(BATCH_SIZE) # 乱序
# 生成器模型
def generator_model():model = keras.Sequential() model.add(layers.Dense(256,input_shape=(100,),use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU())model.add(layers.Dense(512,use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Dense(28*28*1,use_bias=False,activation="tanh")) # 输出28*28*1形状 使用tanh激活得到-1 到1 的值model.add(layers.BatchNormalization())model.add(layers.Reshape((28,28,1))) # reshape成28*28*1的形状return model# 判别器模型
def discriminator_model():model = keras.Sequential()model.add(layers.Flatten())model.add(layers.Dense(512,use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Dense(256,use_bias=False))model.add(layers.BatchNormalization())model.add(layers.LeakyReLU())model.add(layers.Dense(1)) return model
# loss  
cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True) # 相当于normalize(softmax)该层# 辨别器loss
def discriminator_loss(real_out,fake_out):real_loss = cross_entropy(tf.ones_like(real_out),real_out) # 使用binary_crossentropy 对真实图片判别为1 fake_loss = cross_entropy(tf.zeros_like(fake_out),fake_out) # 生成的图片 判别为0 return real_loss + fake_loss
# 生成器loss
def generator_loss(fake_out):return cross_entropy(tf.ones_like(fake_out),fake_out) # 希望对生成的图片返回为1
# 定义训练参数
generator_opt = tf.keras.optimizers.Adam(1e-4)
discriminator_opt = tf.keras.optimizers.Adam(1e-4)
EPOCHS = 100
noise_dim = 100 
num_exp_to_generate = 16seed = tf.random.normal([num_exp_to_generate,noise_dim]) # (16,100) # 生成16个样本,长度为100的随机数generator = generator_model()
discriminator = discriminator_model()
# 一个epoch
def train_step(images):noise = tf.random.normal([BATCH_SIZE,noise_dim])with tf.GradientTape() as gen_tape,tf.GradientTape() as disc_tape: # 梯度real_out = discriminator(images,training=True)gen_image = generator(noise,training=True)fake_out = discriminator(gen_image,training=True)gen_loss = generator_loss(fake_out) # 最大化生成图片预测为真的概率disc_loss = discriminator_loss(real_out,fake_out) # 最小化生成图片预测为真的概率gradient_gen = gen_tape.gradient(gen_loss,generator.trainable_variables) # 计算梯度gradient_disc = disc_tape.gradient(disc_loss,discriminator.trainable_variables)generator_opt.apply_gradients(zip(gradient_gen,generator.trainable_variables)) # 更新变量discriminator_opt.apply_gradients(zip(gradient_disc,discriminator.trainable_variables))
# 绘制函数
def genrate_plot_image(gan_model,test_noise):pre_images = gan_model(test_noise,training=False)fig = plt.figure(figsize=(4,4))for i in range(pre_images.shape[0]):plt.subplot(4,4,i+1) # 四行四列plt.imshow((pre_images[i,:,:,0]+1)/2,cmap="gray")plt.axis("off")plt.show()
# 定义训练
def train(dataset,epochs):for epoch in range(epochs):for image_batch in dataset:train_step(image_batch)print(".",end="")genrate_plot_image(generator,seed)# 开始训练模型
train(datasets,EPOCHS)

训练结果:

91d5a8d2e547492eba095add88c77756.png

GAN的训练对算力要求较高,而且在训练更复杂的问题时不稳定,容易遇到梯度消失,模式崩溃的问题,训练难度较高

4.GAN的发展与应用 

2014年诞生以来,GAN的发展非常迅速,最初的GAN难以生成高质量的图像,而现在的GAN已经可以生成高质量的图像

2015年,结合了CNN的DCGAN

10318f9cdc7b490e984c07396ecaa376.png

2016年,变换图像的CycleGANpix2pix

6c369c5043d8402bae805bb80ca90b88.png

2bb5e9620a2e4335aaf1c1820351b75a.png

2018年,逐步增长网络的proGAN和基于此的StyleGAN 

e248724c483f4741accb411ce9f0a499.png

此外,GAN还可以进行图像数据集生成,人脸生成,视频预测,图文转换,照片融合,超分辨率等

然而就在最近,图像生成领域出现了颠覆性的方法-Diffusion Model,将图像生成效果提升到一个新的高度,风头甚至开始超过GAN!,让我们通过AI作画感受一下这个新方法的强大

想了解原理可以看这个: 由浅入深了解Diffusion Model - 知乎 (zhihu.com)

5.AI作画体验-Disco Diffusion

今年(2022),谷歌基于CLIP-Guided Diffusion创建了一个开源的强大AI图像生成程序-Disco Diffusion,可以根据描述生成精致的图片,一起体验一下吧!

在这里打开(需要梯子)GoogleColab Disco Diffusion

502871ac2526402cbf7e5e99faf1b4c9.png

运行全部代码,将使用Google免费提供的大GPU,连接到Google Drive以保存生成的图像93cafe1ad30b4d42b9fd8a7db2a699fe.png

 在这里输入描述指导生成图片,改第一行(一个双引号语句即可),不要改第二行6489be22eccc48b5b1a8516ecc97580e.png

创建好描述后开始生成图片!

df56f984ef394907b90d156f32d319d4.png

如输入描述"In the morning,overlooking TOKYO city by greg rutkowski and thomas kinkade,Trending on artstationmakoto shinkai style"0503df5efe134117b236d1ef9eace200.png

 输入描述"city of the future "

282455c8198840a89db686751a3647c0.png

当然,即使是相同的描述,每次生成的结果也会不一样,生成的图片自动保存在谷歌云盘

更多可以看看下面的链接

参数解释:AI画家–Disco Diffusion使用指南+本地化保姆级教程_sugarsama的博客-CSDN博客

参考描述:Disco Diffusion Prompt 描述语参考 - 哔哩哔哩 (bilibili.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52663.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能下象棋,走一步,能看几步?|漫画

图文原创:谭婧 谭婧老师爱下象棋,就是谁也赢不了。 去公园下了一盘棋 ,第一步我就走了一个当头炮 ,剩下的都是大爷们帮我走的。 结果,我输了。 经过他们的总结研究,我第一步走错了 。 2022年,象…

参考文献怎么查找,去哪里查找?一篇文章讲明白这些问题

在我们撰写论文查找参考文献时,往往不知道从哪里入手,本文小编就针对下面这三个方面给大家详细讲解下: 一、查找参考文献方法 二、参考文献资料查找网站 三、参考文献格式规范 一、查找参考文献方法: 1、知网全球最大的中文数据…

与外文文献有关的那些事儿

目录 SCI是什么 一、SCI分区依据? 二、如何查找外文文献 1.常用的外文文献数据库​编辑 2.Web of Science数据库 总结 SCI是什么 SCI是美国《科学引文索引》的英文简称,其全称为:Science Citation Index,,创刊于1961年&…

从算力到存力:存储芯片研究框架(2023)

2023年3月31日,我国发起对美光在华销售产品的网络安全审查,体现出存储产业安全的重要性。此外,AI算力需求拉动高算力服务器出货,而AI服务器的存力需求更强,AI将驱动“从算力到存力”的中长期需求: 1、海外…

Python为什么有那么多人在学?有了ChatGPT还有必要学习Python吗?

为什么学习Python呢? 学习 Python 的原因有很多,以下是一些常见的原因: 简单易学: Python 是一门易于学习的编程语言,语法简单、清晰明了,可以快速掌握基本的编程概念。 应用广泛: Python 是…

在数字化质变“奇点”时刻,看数字生产力跃升的华为观

(华为轮值董事长孟晚舟) 进入2023年,以大语言模型为代表的新AI,打开了全球对于数字生产力的全新认知:高盛集团经济学家认为,ChatGPT等生成式AI最终可能在10年的时间里使得全球年GDP增长7%(近7万…

chatgpt赋能python:Python照片换底:让您的照片更具艺术感

Python照片换底:让您的照片更具艺术感 Python是一种高级编程语言,拥有丰富的库和工具,可以实现多种应用。其中,照片换底技术是很多人感兴趣的内容之一。通过使用Python,您可以自动抠出照片中的主体,并将其…

chatgpt赋能Python-pycharm怎么重新配置python环境

Pycharm重新配置Python环境方法概述 如果您是Python编程的专业人士或者是刚开始学习Python,您可能已经听说了Pycharm这个IDE。Pycharm不仅可以提高您Python编程的效率,而且也大大改善了整个开发过程。不过,如果您需要使用Pycharm重新配置Pyt…

运营小红书需要注意什么?这4个方法助你成为小红书达人!(上)

在小红书这个平台上,大部分人都心照不宣的意识到成为小红书的博主就能赚到钱,这是事实。比如粉丝5千的博主就可以申请成为小红书的创作者,开始推广赚钱,而粉丝过万的博主除了申请创作者外,可能还会有品牌主动找你合作。…

小红书「高效达人筛选攻略」

三八女神节降临,诸多品牌纷纷开启铺垫预热,在各大平台借势宣传。而聚集庞大年轻女性消费群体的小红书,对“她营销”的重要性不言而喻。节点序幕拉开,面对海量达人信息,如何提前积草屯粮、高效备战? 本期千瓜…

小红书达人怎么找?保姆级教程来了~

在小红书推广营销中,寻找优质的达人是最头疼的事,许多品牌往往会根据简单的小红书排名来直接进行判断认定,其实在挑选小红书达人时有许多要注意的点,接下来和小编一起根据小红书数据分析工具来筛选合适、优质的达人。 千瓜数据—…

阿里云版GPT官宣,我们问了它10个问题

4月7日,阿里云宣布自研大模型“通义千问”,目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年,并于2019年启动大模型研发,通义千问便是其最新成果,相当于阿里云版的“ChatGPT”。 …

《长津湖》,我没看够

大家好,我是校长。 今天我比较期待的一个电影《长津湖》终于上映了,下午的时候,我就去电影院看了这部电影。 其实,我这个人从小喜欢看历史,看近现代史,我小学和中学的时候,历史经常考满分&#…

前端和HTML基础

本文重点: 1. 介绍什么是前端。 2. 简单介绍了html以及html中常用的一些标签。 前端 1.含义 使用web技术栈解决多终端图形界面下的人机交互问题 前端技术栈分为三层: HTML为内容,CSS为样式,JavaScript为行为,三者通过H…

中文影评分类的神经网络模型

本文旨在利用Tensorflow训练一个中文影评二分类神经网络,由于分词处理是以词为最小单位的,所以该模型同时也是word-based NLP模型。 准备文本训练集 训练集为一个文本文件,数字部分为影评的标签,1表示影评是消极的,0表示影评是积极…

5.springboot整合thymeleaf

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…

2.springboot整合mybatisplus

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…

4.springboot整合swagger

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…

1.springboot整合mybatis

1.创建数据库 DROP TABLE IF EXISTS movie; CREATE TABLE movie (id int(255) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,author varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,score varchar(2…

SQL语句练习附带答案

首先创建数据库filmclub DROP DATABASE IF EXISTS filmclub;CREATE DATABASE filmclub;USE filmclub;CREATE TABLE category (cid INT PRIMARY KEY AUTO_INCREMENT,cname VARCHAR(20) )CHARSETutf8; CREATE TABLE film (fid INT PRIMARY KEY AUTO_INCREMENT,fname VARCHAR(20)…