前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用tensorflow训练简单的生成对抗网络GAN

利用tensorflow训练简单的生成对抗网络GAN

作者头像
狼啸风云
修改于 2022-09-02 12:43:05
修改于 2022-09-02 12:43:05
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

对抗网络是14年Goodfellow Ian在论文Generative Adversarial Nets中提出来的。 原理方面,对抗网络可以简单归纳为一个生成器(generator)和一个判断器(discriminator)之间博弈的过程。整个网络训练的过程中,

两个模块的分工

  • 判断网络,直观来看就是一个简单的神经网络结构,输入就是一副图像,输出就是一个概率值,用于判断真假使用(概率值大于0.5那就是真,小于0.5那就是假)。
  • 生成网络,同样也可以看成是一个神经网络模型,输入是一组随机数Z,输出是一个图像。

两个模块的训练目的

  • 判别网络的目的:就是能判别出来属于的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,网络输出接近0,那么很完美,达到了很好判别的目的。
  • 生成网络的目的:生成网络是造样本的,它的目的就是使得自己造样本的能力尽可能强,强到判别网络没法判断是真样本还是假样本。

GAN的训练

  需要注意的是生成模型与对抗模型可以说是完全独立的两个模型,好比就是完全独立的两个神经网络模型,他们之间没有什么联系。

那么训练这样的两个模型的大方法就是:单独交替迭代训练。因为是2个网络,不好一起训练,所以才去交替迭代训练,我们一一来看。 

  首先我们先随机产生一个生成网络模型(当然可能不是最好的生成网络),那么给一堆随机数组,就会得到一堆假的样本集(因为不是最终的生成模型,那么现在生成网络可能就处于劣势,导致生成的样本很糟糕,可能很容易就被判别网络判别出来了说这货是假冒的),但是先不管这个,假设我们现在有了这样的假样本集,真样本集一直都有,现在我们人为的定义真假样本集的标签,因为我们希望真样本集的输出尽可能为1,假样本集为0,很明显这里我们就已经默认真样本集所有的类标签都为1,而假样本集的所有类标签都为0.

  对于生成网络,回想下我们的目标,是生成尽可能逼真的样本。那么原始的生成网络生成的样本你怎么知道它真不真呢?就是送到判别网络中,所以在训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的。就是如果我们单单只用生成网络,那么想想我们怎么去训练?误差来源在哪里?细想一下没有,但是如果我们把刚才的判别网络串接在生成网络的后面,这样我们就知道真假了,也就有了误差了。所以对于生成网络的训练其实是对生成-判别网络串接的训练,就像图中显示的那样。好了那么现在来分析一下样本,原始的噪声数组Z我们有,也就是生成了假样本我们有,此时很关键的一点来了,我们要把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本。这样才能起到迷惑判别器的目的,也才能使得生成的假样本逐渐逼近为正样本。

下面是代码部分,这里,我们利用训练的两个数据集分别是

  • mnist
  • Celeba

来生成手写数字以及人脸

首先是数据集的下载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math
import os
import hashlib
from urllib.request import urlretrieve
import zipfile
import gzip
import shutil

data_dir = './data'

def download_extract(database_name, data_path):
     """
     Download and extract database
     :param database_name: Database name
     """
     DATASET_CELEBA_NAME = 'celeba'
     DATASET_MNIST_NAME = 'mnist'

     if database_name == DATASET_CELEBA_NAME:
         url = 'https://s3-us-west-1.amazonaws.com/udacity-dlnfd/datasets/celeba.zip'
         hash_code = '00d2c5bc6d35e252742224ab0c1e8fcb'
         extract_path = os.path.join(data_path, 'img_align_celeba')
         save_path = os.path.join(data_path, 'celeba.zip')
         extract_fn = _unzip
     elif database_name == DATASET_MNIST_NAME:
         url = 'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz'
         hash_code = 'f68b3c2dcbeaaa9fbdd348bbdeb94873'
         extract_path = os.path.join(data_path, 'mnist')
         save_path = os.path.join(data_path, 'train-images-idx3-ubyte.gz')
         extract_fn = _ungzip

     if os.path.exists(extract_path):
         print('Found {} Data'.format(database_name))
         return

     if not os.path.exists(data_path):
         os.makedirs(data_path)

     if not os.path.exists(save_path):
         with DLProgress(unit='B', unit_scale=True, miniters=1, desc='Downloading {}'.format(database_name)) as pbar:
             urlretrieve(
                 url,
                 save_path,
                 pbar.hook)

     assert hashlib.md5(open(save_path, 'rb').read()).hexdigest() == hash_code, \
         '{} file is corrupted.  Remove the file and try again.'.format(save_path)

     os.makedirs(extract_path)
     try:
         extract_fn(save_path, extract_path, database_name, data_path)
     except Exception as err:
         shutil.rmtree(extract_path)  # Remove extraction folder if there is an error
         raise err

     # Remove compressed data
     os.remove(save_path)

# download mnist
download_extract('mnist', data_dir)
# download celeba
download_extract('celeba', data_dir

我们先看看我们的mnist还有celeba数据集是什么样子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # the number of images
  show_n_images =16
  
  %matplotlib inline
  import os
  from glob import glob
  from matplotlib import pyplot
  
  def get_batch(image_files, width, height, mode):
     data_batch = np.array(
         [get_image(sample_file, width, height, mode) for sample_file in image_files]).astype(np.float32)
 
     # Make sure the images are in 4 dimensions
     if len(data_batch.shape) < 4:
         data_batch = data_batch.reshape(data_batch.shape + (1,))
 
     return data_batch
 
 def images_square_grid(images, mode):
     # Get maximum size for square grid of images
     save_size = math.floor(np.sqrt(images.shape[0]))
 
     # Scale to 0-255
     images = (((images - images.min()) * 255) / (images.max() - images.min())).astype(np.uint8)
 
     # Put images in a square arrangement
     images_in_square = np.reshape(
             images[:save_size*save_size],
             (save_size, save_size, images.shape[1], images.shape[2], images.shape[3]))
     if mode == 'L':
         images_in_square = np.squeeze(images_in_square, 4)
 
     # Combine images to grid image
     new_im = Image.new(mode, (images.shape[1] * save_size, images.shape[2] * save_size))
     for col_i, col_images in enumerate(images_in_square):
         for image_i, image in enumerate(col_images):
             im = Image.fromarray(image, mode)
             new_im.paste(im, (col_i * images.shape[1], image_i * images.shape[2]))
 
     return new_im
 
 mnist_images = get_batch(glob(os.path.join(data_dir, 'mnist/*.jpg'))[:show_n_images], 28, 28, 'L')
 pyplot.imshow(images_square_grid(mnist_images, 'L'), cmap='gray')

mninst:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show_n_images = 9
 
mnist_images = get_batch(glob(os.path.join(data_dir, 'img_align_celeba/*.jpg'))[:show_n_images], 28, 28, 'RGB')
pyplot.imshow(images_square_grid(mnist_images, 'RGB'))

celeba

现在我们开始搭建网络

这里我建议用GPU来训练,tensorflow的版本最好是1.1.0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from distutils.version import LooseVersion
import warnings
import tensorflow as tf

# Check TensorFlow Version
assert LooseVersion(tf.__version__) >= LooseVersion('1.0'), 'Please use TensorFlow version 1.0 or newer.  You are using {}'.format(tf.__version__)
print('TensorFlow Version: {}'.format(tf.__version__))

# Check for a GPU
if not tf.test.gpu_device_name():
    warnings.warn('No GPU found. Please use a GPU to train your neural network.')
else:
    print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))

接着我们要做的是构建输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def model_inputs(image_width, image_height, image_channels, z_dim):
    ## Real imag
    inputs_real = tf.placeholder(tf.float32,(None, image_width,image_height,image_channels), name = 'input_real')

    ## input z

    inputs_z = tf.placeholder(tf.float32,(None, z_dim), name='input_z')

    ## Learning rate
    learning_rate = tf.placeholder(tf.float32, name = 'lr')

    return inputs_real, inputs_z, learning_rate

构建Discriminator

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def discriminator(images, reuse=False):
    """
    Create the discriminator network
    :param images: Tensor of input image(s)
    :param reuse: Boolean if the weights should be reused
    :return: Tuple of (tensor output of the discriminator, tensor logits of the discriminator)
    """
    # TODO: Implement Function

    ## scope here

    with tf.variable_scope('discriminator', reuse=reuse):

        alpha = 0.2  ### leak relu coeff

        # drop out probability
        keep_prob = 0.8

        # input layer 28 * 28 * color channel
        x1 = tf.layers.conv2d(images, 128, 5, strides=2, padding='same',
                              kernel_initializer= tf.contrib.layers.xavier_initializer(seed=2))
        ## No batch norm here
        ## leak relu here / alpha = 0.2
        relu1 = tf.maximum(alpha * x1, x1)
        # applied drop out here
        drop1 = tf.nn.dropout(relu1, keep_prob= keep_prob)
        # 14 * 14 * 128

        # Layer 2
        x2 = tf.layers.conv2d(drop1, 256, 5, strides=2, padding='same',
                             kernel_initializer= tf.contrib.layers.xavier_initializer(seed=2))
        ## employ batch norm here
        bn2 = tf.layers.batch_normalization(x2, training=True)
        ## leak relu
        relu2 = tf.maximum(alpha * bn2, bn2)
        drop2 = tf.nn.dropout(relu2, keep_prob=keep_prob)

        # 7 * 7 * 256

        # Layer3
        x3 = tf.layers.conv2d(drop2, 512, 5, strides=2, padding='same',
                             kernel_initializer= tf.contrib.layers.xavier_initializer(seed=2))
        bn3 = tf.layers.batch_normalization(x3, training=True)
        relu3 = tf.maximum(alpha * bn3, bn3)
        drop3 = tf.nn.dropout(relu3, keep_prob=keep_prob)
        # 4 * 4 * 512

        # Output
        # Flatten
        flatten = tf.reshape(relu3, (-1, 4 * 4 * 512))
        logits = tf.layers.dense(flatten,1)
        # activation
        out = tf.nn.sigmoid(logits)

    return out, logits

接着是 Generator 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generator(z, out_channel_dim, is_train=True):
    """
    Create the generator network
    :param z: Input z
    :param out_channel_dim: The number of channels in the output image
    :param is_train: Boolean if generator is being used for training
    :return: The tensor output of the generator
    """
    # TODO: Implement Function

    with tf.variable_scope('generator', reuse = not is_train):
        # First Fully connect layer
        x0 = tf.layers.dense(z, 4 * 4 * 512)
        # Reshape
        x0 = tf.reshape(x0,(-1,4,4,512))
        # Use the batch norm
        bn0 = tf.layers.batch_normalization(x0, training= is_train)
        # Leak relu
        relu0 = tf.nn.relu(bn0)
        # 4 * 4 * 512

        # Conv transpose here
        x1 = tf.layers.conv2d_transpose(relu0, 256, 4, strides=1, padding='valid')
        bn1 = tf.layers.batch_normalization(x1, training=is_train)
        relu1 = tf.nn.relu(bn1)
        # 7 * 7 * 256

        x2 = tf.layers.conv2d_transpose(relu1, 128, 3, strides=2, padding='same')
        bn2 = tf.layers.batch_normalization(x2, training=is_train)
        relu2 = tf.nn.relu(bn2)
        # 14 * 14 * 128

        # Last cov
        logits = tf.layers.conv2d_transpose(relu2, out_channel_dim, 3, strides=2, padding='same')
        ## without batch norm here
        out = tf.tanh(logits)


        return out

然后我们来定义loss,这里,加入了smoother

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def model_loss(input_real, input_z, out_channel_dim):
    """
    Get the loss for the discriminator and generator
    :param input_real: Images from the real dataset
    :param input_z: Z input
    :param out_channel_dim: The number of channels in the output image
    :return: A tuple of (discriminator loss, generator loss)
    """
    # TODO: Implement Function


    g_model = generator(input_z, out_channel_dim, is_train=True)

    d_model_real, d_logits_real = discriminator(input_real, reuse = False)

    d_model_fake, d_logits_fake = discriminator(g_model, reuse= True)

    ## add smooth here

    smooth = 0.1
    d_loss_real = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real,
                                                labels=tf.ones_like(d_model_real) * (1 - smooth)))

    d_loss_fake = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_model_fake)))

    g_loss = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake,
                                                labels= tf.ones_like(d_model_fake)))

    d_loss = d_loss_real + d_loss_fake



    return d_loss, g_loss

接着我们需要定义网络优化的过程,这里我们需要用到batch_normlisation, 不懂的话去搜下文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def model_opt(d_loss, g_loss, learning_rate, beta1):
    """
    Get optimization operations
    :param d_loss: Discriminator loss Tensor
    :param g_loss: Generator loss Tensor
    :param learning_rate: Learning Rate Placeholder
    :param beta1: The exponential decay rate for the 1st moment in the optimizer
    :return: A tuple of (discriminator training operation, generator training operation)
    """

    t_vars = tf.trainable_variables()
    d_vars = [var for var in t_vars if var.name.startswith('discriminator')]
    g_vars = [var for var in t_vars if var.name.startswith('generator')]



    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)

    with tf.control_dependencies(update_ops):
        d_train_opt = tf.train.AdamOptimizer(learning_rate,beta1=beta1).minimize(d_loss,var_list = d_vars)
        g_train_opt = tf.train.AdamOptimizer(learning_rate,beta1=beta1).minimize(g_loss,var_list = g_vars)

    return d_train_opt, g_train_opt

现在,我们网络的模块,损失函数,以及优化的过程都定义好了,现在我们就要开始训练我们的网络了,我们的训练过程定义如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train(epoch_count, batch_size, z_dim, learning_rate, beta1, get_batches, data_shape, data_image_mode):
    """
    Train the GAN
    :param epoch_count: Number of epochs
    :param batch_size: Batch Size
    :param z_dim: Z dimension
    :param learning_rate: Learning Rate
    :param beta1: The exponential decay rate for the 1st moment in the optimizer
    :param get_batches: Function to get batches
    :param data_shape: Shape of the data
    :param data_image_mode: The image mode to use for images ("RGB" or "L")
    """
    losses = []
    samples = []

    input_real, input_z, lr = model_inputs(data_shape[1], data_shape[2], data_shape[3], z_dim)

    d_loss, g_loss = model_loss(input_real,input_z,data_shape[-1])

    d_opt, g_opt = model_opt(d_loss, g_loss, learning_rate, beta1)

    steps = 0

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for epoch_i in range(epoch_count):
            for batch_images in get_batches(batch_size):
                # TODO: Train Model
                steps += 1

                # Reshape the image and pass to Discriminator
                batch_images = batch_images.reshape(batch_size,
                                                    data_shape[1],
                                                    data_shape[2],
                                                    data_shape[3])
                # Rescale the data to -1 and 1
                batch_images = batch_images * 2

                # Sample the noise
                batch_z = np.random.uniform(-1,1,size = (batch_size, z_dim))


                ## Run optimizer
                _ = sess.run(d_opt, feed_dict = {input_real:batch_images,
                                                 input_z:batch_z,
                                                 lr:learning_rate
                                                 })
                _ = sess.run(g_opt, feed_dict = {input_real:batch_images,
                                                 input_z:batch_z,
                                                 lr:learning_rate})

                if steps % 10 == 0:

                    train_loss_d = d_loss.eval({input_real:batch_images, input_z:batch_z})
                    train_loss_g = g_loss.eval({input_real:batch_images, input_z:batch_z})

                    losses.append((train_loss_d,train_loss_g))

                    print("Epoch {}/{}...".format(epoch_i+1, epochs),
                          "Discriminator Loss: {:.4f}...".format(train_loss_d),
                          "Generator Loss: {:.4f}".format(train_loss_g))

                if steps % 100 == 0:

                    show_generator_output(sess, 25, input_z, data_shape[-1], data_image_mode)

开始训练,超参数的设置

对于MNIST

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size = 64
z_dim = 100
learning_rate = 0.001
beta1 = 0.5
epochs = 2

mnist_dataset = helper.Dataset('mnist', glob(os.path.join(data_dir, 'mnist/*.jpg')))
with tf.Graph().as_default():
    train(epochs, batch_size, z_dim, learning_rate, beta1, mnist_dataset.get_batches,
          mnist_dataset.shape, mnist_dataset.image_mode)

训练效果如下

开始的时候,网络的参数很差,我们生成的手写数字的效果自然就不好

随着训练的进行,轮廓逐渐清晰,效果如下,到最后:

我们看到数字的轮廓基本是清晰可以辨认的,当然,这只是两个epoch的结果,如果有足够的时间经过更长时间的训练,效果会更好。

我们同样展示下对celeba人脸数据集的训练结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size = 32
z_dim = 100
learning_rate = 0.001
beta1 = 0.4
epochs = 1

celeba_dataset = helper.Dataset('celeba', glob(os.path.join(data_dir, 'img_align_celeba/*.jpg')))
with tf.Graph().as_default():
    train(epochs, batch_size, z_dim, learning_rate, beta1, celeba_dataset.get_batches,
          celeba_dataset.shape, celeba_dataset.image_mode)

训练开始:

经过一个epoch之后:

人脸的轮廓基本清晰了。这里我们就是用了DCGAN最简单的方式来实现,原理过程说的不是很详细,同时,可能这个参数设置也不是很合理,训练的也不够成分,但是我想可以帮大家快速掌握实现一个简单的DCGAN的方法了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Face Generation
部署 model_opt 函数实现对 GANs 的优化。使用 tf.trainable_variables 获取可训练的所有变量。通过变量空间名 discriminator 和 generator 来过滤变量。该函数应返回形如 (discriminator training operation, generator training operation) 的元组。
小飞侠xp
2018/08/29
3930
使用对抗生成网络(GAN)生成手写字
这是通过GAN迭代训练30W次,耗时3小时生成的手写字图片效果,大部分的还是能看出来是数字的。
Awesome_Tang
2019/05/10
1.2K0
使用对抗生成网络(GAN)生成手写字
​tensorflow实现基于深度学习的图像补全
大数据文摘作品,转载要求见文末 作者 | Brandon Amos 编译 | Molly,寒小阳 目录 ■ 简介 ■ 第一步:将图像理解为一个概率分布的样本 你是怎样补全缺失信息的呢? 但是怎样着手统计呢?这些都是图像啊。 那么我们怎样补全图像? ■ 第二步:快速生成假图像 在未知概率分布情况下,学习生成新样本 [ML-Heavy] 生成对抗网络(Generative Adversarial Net, GAN) 的架构 使用G(z)生成伪图像 [ML-Heavy] 训
大数据文摘
2018/05/21
1.9K0
一看就懂的Tensorflow实战(GAN)
生成对抗网络(GAN)启发自博弈论中的二人零和博弈(two-player game),类似于周伯通的绝学——“左右互搏”。GAN 模型中的两位博弈方分别由生成式模型(generative model)和判别式模型(discriminative model)充当。生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个类似真实训练数据的样本,追求效果是越像真实样本越好;判别模型 D 是一个二分类器,估计一个样本来自于训练数据(而非生成数据)的概率,如果样本来自于真实的训练数据,D 输出大概率,否则,D 输出小概率。可以做如下类比:生成网络 G 好比假币制造团伙,专门制造假币,判别网络 D 好比警察,专门检测使用的货币是真币还是假币,G 的目标是想方设法生成和真币一样的货币,使得 D 判别不出来,D 的目标是想方设法检测出来 G 生成的假币。随着训练时间的增加,判别模型与生成模型的能力都相应的提升!
AI异构
2020/07/29
7680
一看就懂的Tensorflow实战(GAN)
生成对抗网络(GAN)简介
GAN 由 Ian Goodfellow 在2014年提出。GAN通过训练两个相互对抗的神经网络解决了非监督学习问题,其中一个是生成(Generator)网络,另一个叫判别(discriminator)网络。
用户6021899
2022/06/07
2.1K0
生成对抗网络(GAN)简介
tf24: GANs—生成明星脸
本文介绍了如何使用TensorFlow实现生成对抗网络(GANs),用于生成明星脸。首先,介绍了TensorFlow的基本概念,然后详细阐述了如何搭建一个GANs模型。接着,展示了如何训练模型以及使用GANs进行图像生成。最后,总结了本文的主要内容和实现步骤。
MachineLP
2018/01/09
1.2K0
tf24: GANs—生成明星脸
Generative Adversarial Network
这里我们将建立 一个对抗生成网络 (GAN)训练MNIST,并在最后生成新的手写数字。
小飞侠xp
2018/08/29
3810
如何快速理解GAN?这里有一篇最直观的解读
本文授权转自雷克世界(ID:raicworld) 编译 | 嗯~阿童木呀、KABUDA 让我们假设这样一种情景:你的邻居正在举办一场非常酷的聚会,你非常想去参加。但有要参加聚会的话,你需要一张特价票,而这个票早就已经卖完了。 而对于这次聚会的组织者来说,为了让聚会能够成功举办,他们雇佣了一个合格的安全机构。主要目标就是不允许任何人破坏这次的聚会。为了做到这一点,他们在会场入口处安置了很多警卫,检查每个人所持门票的真实性。 考虑到你没有任何武术上的天赋,而你又特别想去参加聚会,那么唯一的办法就是用一张非
AI科技大本营
2018/04/26
7360
如何快速理解GAN?这里有一篇最直观的解读
tensorflow 实现wgan-gp mnist图片生成
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/details/76695935
DoubleV
2018/09/12
1.6K0
tensorflow 实现wgan-gp  mnist图片生成
教程 | 用AI生成猫的图片,撸猫人士必备
编译 | 小梁 【AI科技大本营导读】我们身边总是不乏各种各样的撸猫人士,面对朋友圈一波又一波晒猫的浪潮,作为学生狗和工作狗的我们只有羡慕的份,更流传有“吸猫穷三代,撸猫毁一生?”的名言,今天营长就为
AI科技大本营
2018/04/26
2.2K0
教程 | 用AI生成猫的图片,撸猫人士必备
一看就懂的Tensorflow实战(DCGAN)
DCGAN在GAN的基础上优化了网络结构,加入了 conv,batch_norm 等层,使得网络更容易训练,网络结构如下:
AI异构
2020/07/29
8160
一看就懂的Tensorflow实战(DCGAN)
图像生成器——用GAN生成辛普森家族
在今天的文章里,我们将实现一个机器学习模型。这个模型可以基于给定的数据集生成无数的相似图像样本。为了实现这个目标,我们将启动生成对抗网络(GANs)并且将包含有“辛普森家族”图像特征的数据作为输入。在这篇文章的最后,你将会熟悉GANs背后的基础知识,而且你也可以建立一个你自己的生成模型。
AI研习社
2019/05/08
1.7K0
图像生成器——用GAN生成辛普森家族
Tensorflow2.0实战之GAN
本文主要带领读者了解生成对抗神经网络(GAN),并使用提供的face数据集训练网络
陶陶name
2022/05/13
3220
[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(中)
上一篇文章--[GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(上)中,我们先介绍了对于图像修复的背景,需要利用什么信息来对缺失的区域进行修复,以及将图像当做概率分布采样的样本来看待,通过这个思路来开始进行图像的修复。
kbsc13
2019/08/16
7520
《PaddlePaddle从入门到炼丹》六——生成对抗网络
我们上一章使用MNIST数据集进行训练,获得一个可以分类手写字体的模型。如果我们数据集的数量不够,不足于让模型收敛,最直接的是增加数据集。但是我们收集数据并进行标注是非常消耗时间了,而最近非常火的生成对抗网络就非常方便我们数据的收集。对抗生成网络可以根据之前的图片训练生成更多的图像,已达到以假乱真的目的。
夜雨飘零
2020/05/06
7250
《PaddlePaddle从入门到炼丹》六——生成对抗网络
生成对抗网络——GAN(一)「建议收藏」
据有关媒体统计:CVPR2018的论文里,有三分之一的论文与GAN有关 由此可见,GAN在视觉领域的未来多年内,将是一片沃土(CVer们是时候入门GAN了)。而发现这片矿源的就是GAN之父,Goodfellow大神。 文末有基于keras的GAN代码,有助于理解GAN的原理
全栈程序员站长
2022/11/17
4310
生成对抗网络——GAN(一)「建议收藏」
生成对抗网络(GAN)的直观介绍
原文来源:freeCodeCamp 作者:Thalles Silva 让我们假设这样一种情景:你的邻居正在举办一场非常酷的聚会,你非常想去参加。但有要参加聚会的话,你需要一张特价票,而这个票早就已经卖完了。 而对于这次聚会的组织者来说,为了让聚会能够成功举办,他们雇佣了一个合格的安全机构。主要目标就是不允许任何人破坏这次的聚会。为了做到这一点,他们在会场入口处安置了很多警卫,检查每个人所持门票的真实性。 考虑到你没有任何武术上的天赋,而你又特别想去参加聚会,那么唯一的办法就是用一张非常有说服力的假票来
刀刀老高
2018/04/10
1.2K0
生成对抗网络(GAN)的直观介绍
深度学习 | GAN,什么是生成对抗网络
GAN是由两部分组成的,第一部分是生成,第二部分是对抗。简单来说,就是有一个生成网络G和一个判别网络D,通过训练让两个网络相互竞争,生成网络G接受一个随机噪声z来生成假的数据G(z),对抗网络D通过判别器去判别真伪概率,最后希望生成器G生成的数据能够以假乱真。在最理想的状态下,D(G(z)) = 0.5。
Justlovesmile
2021/12/14
1.3K0
深度学习 | GAN,什么是生成对抗网络
人工智能生成内容(AIGC)在图像生成领域的技术进展
人工智能生成内容(AIGC,AI-Generated Content)在图像生成领域取得了显著的进展。本文将探讨从卷积神经网络(CNN)到风格迁移(Style Transfer)的技术演变,并通过代码实例展示其应用。
一键难忘
2024/06/21
1.3K0
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
In 2014, Goodfellow et al. presented a method for training generative models called Generative Adversarial Networks (GANs for short). In a GAN, we build two different neural networks. Our first network is a traditional classification network, called the discriminator. We will train the discriminator to take images, and classify them as being real (belonging to the training set) or fake (not present in the training set). Our other network, called the generator, will take random noise as input and transform it using a neural network to produce images. The goal of the generator is to fool the discriminator into thinking the images it produced are real. 在生成网络中,我们建立了两个神经网络。第一个网络是典型的分类神经网络,称为discriminator重点内容,我们训练这个网络对图像进行识别,以区别真假的图像(真的图片在训练集当中,而假的则不在。另一个网络称之为generator,它将随机的噪声作为输入,将其转化为使用神经网络训练出来产生出来的图像,它的目的是混淆discriminator使其认为它生成的图像是真的。
老潘
2018/06/21
2.5K0
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
推荐阅读
相关推荐
Face Generation
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验