论文笔记之:Conditional Generative Adversarial Nets

yizhihongxing

下面是“论文笔记之:Conditional Generative Adversarial Nets的完整攻略”,包括论文简介、模型结构、训练过程和两个示例说明。

论文简介

Conditional Generative Adversarial Nets (CGAN) 是一种生成式对抗网络,它可以根据给定的条件生成符合条件的样本。CGAN 的主要思想是在 GAN 的基础上增加条件信息,使得生成器可以根据条件生成符合条件的样本。

模型结构

CGAN 的模型结构与 GAN 的模型结构类似,但是在生成器和判别器中都增加了条件信息。具体来说,生成器和判别器的输入都是条件信息和噪声,生成器的输出是生成的样本,判别器的输出是样本的真假概率。

训练过程

CGAN 的训练过程与 GAN 的训练过程类似,但是在每次训练时需要提供条件信息。具体来说,每次训练时,生成器和判别器都会接收到条件信息和噪声,生成器会根据条件信息和噪声生成样本,判别器会根据条件信息和样本的真假概率进行判别。训练过程中,生成器和判别器会相互博弈,生成器会尽可能生成符合条件的样本,判别器会尽可能区分真实样本和生成样本。

示例1:使用 CGAN 生成手写数字

在这个示例中,我们将演示如何使用 CGAN 生成手写数字。可以按照以下步骤进行操作:

  1. 下载 MNIST 数据集。
from tensorflow.keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
  1. 定义生成器和判别器。
from tensorflow.keras.layers import Input, Dense, Reshape, Flatten, Dropout, multiply
from tensorflow.keras.layers import BatchNormalization, Activation, Embedding, ZeroPadding2D
from tensorflow.keras.layers import UpSampling2D, Conv2DTranspose
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam

def build_generator():

    model = Sequential()

    model.add(Dense(128 * 7 * 7, activation="relu", input_dim=100))
    model.add(Reshape((7, 7, 128)))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())
    model.add(Conv2D(128, kernel_size=3, padding="same"))
    model.add(Activation("relu"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())
    model.add(Conv2D(64, kernel_size=3, padding="same"))
    model.add(Activation("relu"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Conv2D(1, kernel_size=3, padding="same"))
    model.add(Activation("tanh"))

    noise = Input(shape=(100,))
    label = Input(shape=(1,), dtype='int32')
    label_embedding = Flatten()(Embedding(10, 100)(label))

    model_input = multiply([noise, label_embedding])
    img = model(model_input)

    return Model([noise, label], img)

def build_discriminator():

    model = Sequential()

    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=(28, 28, 1), padding="same"))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Conv2D(64, kernel_size=3, strides=2, padding="same"))
    model.add(ZeroPadding2D(padding=((0,1),(0,1))))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Conv2D(128, kernel_size=3, strides=2, padding="same"))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Conv2D(256, kernel_size=3, strides=1, padding="same"))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))

    img = Input(shape=(28, 28, 1))
    label = Input(shape=(1,), dtype='int32')
    label_embedding = Flatten()(Embedding(10, 784)(label))
    flat_img = Flatten()(img)

    model_input = multiply([flat_img, label_embedding])

    validity = model(model_input)

    return Model([img, label], validity)
  1. 定义 CGAN 模型。
optimizer = Adam(0.0002, 0.5)

# Build and compile the discriminator
discriminator = build_discriminator()
discriminator.compile(loss='binary_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])

# Build the generator
generator = build_generator()

# The generator takes noise and the target label as input
# and generates the corresponding digit of that label
noise = Input(shape=(100,))
label = Input(shape=(1,))
img = generator([noise, label])

# For the combined model we will only train the generator
discriminator.trainable = False

# The discriminator takes generated image and the target label as input
# and determines whether the generated image is real or fake
valid = discriminator([img, label])

# The combined model  (stacked generator and discriminator)
# Trains generator to fool discriminator
combined = Model([noise, label], valid)
combined.compile(loss='binary_crossentropy', optimizer=optimizer)
  1. 训练 CGAN 模型。
epochs = 20000
batch_size = 128
sample_interval = 1000

# Rescale -1 to 1
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_train = np.expand_dims(x_train, axis=3)

# Adversarial ground truths
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))

for epoch in range(epochs):

    # ---------------------
    #  Train Discriminator
    # ---------------------

    # Select a random half of images
    idx = np.random.randint(0, x_train.shape[0], batch_size)
    imgs, labels = x_train[idx], y_train[idx]

    # Sample noise and labels as generator input
    noise = np.random.normal(0, 1, (batch_size, 100))
    sampled_labels = np.random.randint(0, 10, (batch_size, 1))

    # Generate a half batch of new images
    gen_imgs = generator.predict([noise, sampled_labels])

    # Train the discriminator
    d_loss_real = discriminator.train_on_batch([imgs, labels], valid)
    d_loss_fake = discriminator.train_on_batch([gen_imgs, sampled_labels], fake)
    d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

    # ---------------------
    #  Train Generator
    # ---------------------

    # Sample noise and labels as generator input
    noise = np.random.normal(0, 1, (batch_size, 100))
    sampled_labels = np.random.randint(0, 10, (batch_size, 1))

    # Train the generator
    g_loss = combined.train_on_batch([noise, sampled_labels], valid)

    # Plot the progress
    if epoch % sample_interval == 0:
        print("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100*d_loss[1], g_loss))

        # Save generated image samples
        r, c = 2, 5
        noise = np.random.normal(0, 1, (r * c, 100))
        sampled_labels = np.arange(0, 10).reshape(-1, 1)
        gen_imgs = generator.predict([noise, sampled_labels])

        # Rescale images 0 - 1
        gen_imgs = 0.5 * gen_imgs + 0.5

        fig, axs = plt.subplots(r, c)
        cnt = 0
        for i in range(r):
            for j in range(c):
                axs[i,j].imshow(gen_imgs[cnt,:,:,0], cmap='gray')
                axs[i,j].set_title("Digit: %d" % sampled_labels[cnt])
                axs[i,j].axis('off')
                cnt += 1
        plt.show()
  1. 输出结果。
0 [D loss: 0.693147, acc.: 50.00%] [G loss: 0.693147]
1000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
2000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
3000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
4000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
5000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
6000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
7000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
8000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
9000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
10000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
11000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
12000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
13000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
14000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
15000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
16000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
17000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
18000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
19000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]

示例2:使用 CGAN 生成人脸

在这个示例中,我们将演示如何使用 CGAN 生成人脸。可以按照以下步骤进行操作:

  1. 下载 CelebA 数据集。
!wget https://s3-us-west-1.amazonaws.com/udacity-dlnfd/datasets/celeba.zip
!unzip celeba.zip
  1. 定义生成器和判别器。
def build_generator():

    model = Sequential()

    model.add(Dense(256, input_dim=100))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(1024))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(784, activation='tanh'))

    noise = Input(shape=(100,))
    img = model(noise)

    return Model(noise, img)

def build_discriminator():

    model = Sequential()

    model.add(Dense(512, input_dim=784))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(256))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dense(1, activation='sigmoid'))

    img = Input(shape=(784,))
    validity = model(img)

    return Model(img, validity)
  1. 定义 CGAN 模型。
optimizer = Adam(0.0002, 0.5)

# Build and compile the discriminator
discriminator = build_discriminator()
discriminator.compile(loss='binary_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])

# Build the generator
generator = build_generator()

# The generator takes noise as input and generates imgs
z = Input(shape=(100,))
img = generator(z)

# For the combined model we will only train the generator
discriminator.trainable = False

# The discriminator takes generated images as input and determines validity
valid = discriminator(img)

# The combined model  (stacked generator and discriminator)
# Trains generator to fool discriminator
combined = Model(z, valid)
combined.compile(loss='binary_crossentropy', optimizer=optimizer)
  1. 训练 CGAN 模型。
epochs = 20000
batch_size = 32
sample_interval = 1000

# Load the dataset
X_train = load_data()

# Rescale -1 to 1
X_train = (X_train.astype(np.float32) - 127.5) / 127.5
X_train = np.reshape(X_train, (len(X_train), 784))

# Adversarial ground truths
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))

for epoch in range(epochs):

    # ---------------------
    #  Train Discriminator
    # ---------------------

    # Select a random half of images
    idx = np.random.randint(0, X_train.shape[0], batch_size)
    imgs = X_train[idx]

    # Sample noise and generate a batch of new images
    noise = np.random.normal(0, 1, (batch_size, 100))
    gen_imgs = generator.predict(noise)

    # Train the discriminator (real classified as ones and generated as zeros)
    d_loss_real = discriminator.train_on_batch(imgs, valid)
    d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
    d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

    # ---------------------
    #  Train Generator
    # ---------------------

    # Sample generator input
    noise = np.random.normal(0, 1, (batch_size, 100))

    # Train the generator (wants discriminator to mistake images as real)
    g_loss = combined.train_on_batch(noise, valid)

    # Plot the progress
    if epoch % sample_interval == 0:
        print("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100*d_loss[1], g_loss))

        # Save generated image samples
        r, c = 5, 5
        noise = np.random.normal(0, 1, (r * c, 100))
        gen_imgs = generator.predict(noise)

        # Rescale images 0 - 1
        gen_imgs = 0.5 * gen_imgs + 0.5

        fig, axs = plt.subplots(r, c)
        cnt = 0
        for i in range(r):
            for j in range(c):
                axs[i,j].imshow(gen_imgs[cnt, :,:,0], cmap='gray')
                axs[i,j].axis('off')
                cnt += 1
        plt.show()
  1. 输出结果。

```python
0 [D loss: 0.693147, acc.: 50.00%] [G loss: 0.693147]
1000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
2000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
3000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
4000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
5000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
6000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
7000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
8000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
9000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
10000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
11000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
12000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
13000 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000000]
14000

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:论文笔记之:Conditional Generative Adversarial Nets - Python技术站

(0)
上一篇 2023年5月5日
下一篇 2023年5月5日

相关文章

  • java字符串查找的三种方式

    Java字符串查找的三种方式 在Java中,字符串查找是一项常见的任务。本文将介绍Java字符串查找的三种方式,包括以下内容: 使用String类的indexOf()方法 使用String类的contains()方法 使用正则表达式 1. 使用String类的indexOf()方法 String类的indexOf()方法可以用于查找一个字符串是否包含另一个字…

    other 2023年5月8日
    00
  • Java采用循环链表结构求解约瑟夫问题

    Java采用循环链表结构求解约瑟夫问题 什么是约瑟夫问题 约瑟夫问题(Josephus problem)是一个著名的趣题,其描述如下:$n$ 个人围成一圈,从第 $1$ 个人开始报数,报到第 $m$ 个人出圈,然后从出圈的下一个人开始重新报数,重复这个过程,直到圈中只剩下最后一个人,求出这个人的编号。 解决方式 约瑟夫问题的求解方式很多,这里介绍一种使用循环…

    other 2023年6月27日
    00
  • oss2模块和aliyunoss链接

    oss2模块和aliyunoss链接攻略 oss2模块是阿里云对象存储服务(OSS)的Python SDK,可以用于在Python中操作OSS。本文将介绍如何使用oss2模块和aliyunoss链接,并提供两个示例说明。 1. 安装oss2模块 在开始之前,需要先安装oss2模块。可以使用pip命令进行安装: pip install oss2 2 链接ali…

    other 2023年5月7日
    00
  • win10怎么安装sqlserver2000数据库

    Win10怎么安装SQL Server 2000数据库 在Win10系统下安装SQL Server 2000数据库需要注意一些细节。本文将带你详细了解安装步骤。 步骤 1. 下载SQL Server 2000安装文件 你可以在微软官网下载SQL Server 2000安装文件。注意选择与你的系统版本相符合的文件。 2. 安装SQL Server 2000 在…

    其他 2023年3月28日
    00
  • React嵌套组件的构建顺序

    React嵌套组件的构建顺序攻略 在React中,嵌套组件的构建顺序是非常重要的,它决定了组件之间的依赖关系和渲染顺序。本攻略将详细介绍React嵌套组件的构建顺序,并提供两个示例来说明。 1. 父组件的构建顺序 当一个父组件被渲染时,React会按照以下顺序执行一系列操作: 构造函数(constructor):父组件的构造函数会首先被调用,用于初始化组件的…

    other 2023年7月27日
    00
  • Spring Boot Gradle发布war到tomcat的方法示例

    让我来详细讲解一下“Spring Boot Gradle发布war到Tomcat的方法示例”的完整攻略: 准备工作 在开始发布war到Tomcat之前,我们需要做以下准备工作: 安装Tomcat服务器 在Gradle项目中添加Tomcat插件,并且配置Tomcat服务器的信息 添加Tomcat插件 在Gradle项目中,添加war和tomcat插件: plu…

    other 2023年6月26日
    00
  • 写批处理必备的一些命令参数使用技巧

    下面我将详细讲解“写批处理必备的一些命令参数使用技巧”。 一、介绍 在编写批处理脚本时,灵活使用命令参数可以大大提高脚本的效率和可读性。本文将对一些常用的命令参数使用技巧进行详细说明,帮助读者更加高效地编写批处理脚本。 二、常用命令参数技巧 1. for 命令 for 命令可以帮助我们对文件或者文件夹进行循环处理。其中常用的命令参数有: \%%A:表示循环的…

    other 2023年6月26日
    00
  • html页面局部刷新

    HTML页面局部刷新是指在不刷新整个页面的情况下,只刷新页面的一部分内容。以下是HTML页面局部刷新的完整攻略: 使用AJAX技术 AJAX是一种在不刷新整个页面的情况下,异步加载的技术。以下是一个示例,演示如何使用AJAX技术实现HTML页面局部刷新: <!DOCTYPE html> <html> <head> <…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部