Сложно найти наборы данных? GAN генерирует нужные вам данные! ! !

задняя часть

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Заметки об исследовании генеративно-состязательной сети GAN

1. История рождения GAN:

Ян Гудфеллоу, основатель GAN, обсуждал академические вопросы со своими коллегами после легкого пьянства в баре.В то время Эммануэль придумал первоначальную идею GAN, но в то время она не была признана его коллегами. Вернувшись из бара, он обнаружил, что его девушка уснула, поэтому он не спал всю ночь и писал код, и обнаружил, что он действительно эффективен, так что после некоторых исследований родился GAN, новаторская работа. В статье «Генеративно-состязательные сети» впервые предложена GAN.

Ссылка на бумагу:АР Вест V.org/ABS/1406.26…

2. Принцип ГАН:

Основное вдохновение GAN исходит из идеиигры с нулевой суммой в теории игр, Применительно к нейронной сети с глубоким обучением это происходит через непрерывную игру между сетью генераторов G (Генератор) и дискриминантной сетью D (Дискриминатор). , так что G узнает распределение данных. , если он используется для генерации изображений, после завершения обучения G может генерировать реалистичные изображения из случайного числа. Основные функции G и D:

  • G — генерирующая сеть, которая получает случайный шум z (случайное число) и генерирует изображение из этого шума.

  • D — дискриминантная сеть, которая определяет, является ли изображение «настоящим» или нет. Его входной параметр x, x представляет изображение, а выход D(x) представляет вероятность того, что x является реальным изображением.Если это 1, это означает 100% реального изображения, а если выход равен 0, это означает, что это не может быть реальной картиной

В процессе обучения цель генерации сети G состоит в том, чтобы попытаться сгенерировать реальные изображения, чтобы обмануть дискриминационную сеть D. Цель D — попытаться отличить фальшивое изображение, созданное G, от реального изображения. Таким образом, G и D составляют динамический «игровой процесс», а конечной точкой равновесия является точка равновесия Нэша.


Популярное значение состоит в том, что в процессе подделки преступниками фальшивой валюты и выявления полицией фальшивой валюты

[1] Модель генерации G эквивалентна партии, производящей поддельные монеты.Ее цель состоит в том, чтобы попытаться создать больше настоящих поддельных монет, которые полиция не может распознать в зависимости от ситуации с увиденными монетами и технологии идентификации полиции. 

[2] Дискриминантная модель D эквивалентна идентификации фальшивой валюты, и ее цель состоит в том, чтобы максимально точно идентифицировать фальшивую валюту, изготовленную преступниками. Таким образом, за счет соперничества между фальшивомонетчиком и фальшивомонетчиком и улучшения цели достигается эффект равновесия Нэша, при котором сгенерированная модель может быть максимально реальной, а фальшивомонетчик не может судить об истинном и ложном (вероятность того и другого истинные и фальшивые монеты равны 0,5).


как показано на рисунке:


3. Принципиальная схема ГАН:


4. Особенности ГАН:

  1. По сравнению с традиционной моделью она имеет две разные сети вместо одной сети, а метод обучения использует метод состязательного обучения.

  2. Информация об обновлении градиента G в GAN поступает от дискриминатора D, а не от выборок данных.


5. Преимущества ГАН:

  1. GAN является генеративной моделью.По сравнению с другими генеративными моделями (машинами Больцмана и GSN) используется только обратное распространение без сложных цепей Маркова.

  2. По сравнению со всеми другими моделями GAN может создавать более четкие и реалистичные образцы.

  3. GAN обучен методу обучения без учителя и может широко использоваться в области обучения без учителя и обучения с полуучителем.

  4. По сравнению с вариационными автоэнкодерами GAN не вносят никакого детерминированного смещения, а вариационные методы вносят детерминированное смещение, потому что они оптимизируют нижнюю границу логарифмической вероятности, а не саму вероятность, что, по-видимому, приводит к тому, что экземпляры, генерируемые VAE, более размыты, чем GAN

  5. По сравнению с VAE, GAN не имеют вариационной нижней границы. Если дискриминатор хорошо обучен, генератор может отлично изучить распределение обучающих выборок. Другими словами, GAN асимптотически непротиворечивы, но VAE смещены.

  6. GAN применяется к некоторым сценариям, таким как передача стиля изображения, сверхвысокое разрешение, завершение изображения, шумоподавление, что позволяет избежать сложности проектирования функции потерь. остальные Следующие будут переданы на тренировку противостояния.


6. Недостатки ГАН:

  1. Обучение GAN необходимо для достижения равновесия Нэша, что иногда может быть достигнуто с помощью градиентного спуска, иногда нет.Мы не нашли хорошего способа достичь равновесия Нэша, поэтому обучение GAN нестабильно по сравнению с VAE или PixelRNN, но я думаю, что на практике это все же намного стабильнее, чем тренировка машины Больцмана

  2. GAN не подходят для обработки дискретных форм данных, таких как текст

  3. У GAN есть проблемы с нестабильным обучением, исчезающими градиентами и коллапсом режима (в настоящее время решено)


7. Несколько советов по обучению GAN:

  1. Вход нормализуется до (-1, 1), а функция активации последнего слоя использует tanh (кроме BEGAN).

  2. Используя функцию потерь вассертеина GAN,

  3. Если у вас есть данные меток, попробуйте использовать метки. Некоторые считают, что использование обратных меток очень эффективно. Кроме того, используется сглаживание меток, одностороннее сглаживание меток или двустороннее сглаживание меток.

  4. Используйте норму мини-партии, если вам не нужна норма партии, вы можете использовать норму экземпляра или норму веса

  5. Избегайте использования RELU и объединенных слоев, чтобы уменьшить вероятность разреженных градиентов, вы можете использовать функцию активации Leakrelu.

  6. Оптимизатор должен попытаться выбрать ADAM, и скорость обучения не должна быть установлена ​​слишком большой.Можно сослаться на начальный 1e-4.Кроме того, скорость обучения может постоянно снижаться по мере обучения.

  7. Добавление гауссовского шума к сетевому слою D эквивалентно регуляризации.


8. Какие есть расширения GAN:

DCGAN
CGAN
ACGAN
infoGAN
WGAN
SSGAN
Pix2Pix GAN
Cycle  GAN

9. Что могут делать GAN: Ответ заключается в том, чтобы генерировать данные

生成音频
生成图片(动物:猫,狗等;人脸图片,人脸图转动漫图等)
.......

Давайте сначала сфотографируем еду и немного отдохнем (поешьте немного, когда устанете от учебы, хахаха)

Продолжать! ! ! ! !

10. Классический случай ГАН: создание изображения рукописных цифр.

  • Исходный код и набор данныхспособ полученияниже

  • Есть два формата: формат py и формат ipynb (код тот же)

код показывает, как показано ниже:

# -*- coding: utf-8 -*-
"""
Created on 2020-10-31
@author: 李运辰
"""
#导入数据包
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
#get_ipython().run_line_magic('matplotlib', 'inline')
import numpy as np
import glob
import os
 
 
# # 输入
(train_images,train_labels),(_,_)=tf.keras.datasets.mnist.load_data()
 
 
train_images  = train_images.astype('float32')
 
 
# # 数据预处理
train_images=train_images.reshape(train_images.shape[0],28,28,1).astype('float32')
 
 
#归一化 到【-1,1】
train_images = (train_images -127.5)/127.5
 
 
BTATH_SIZE=256
BUFFER_SIZE=60000
 
 
#输入管道
datasets = tf.data.Dataset.from_tensor_slices(train_images)
 
 
#打乱乱序,并取btath_size
datasets  =  datasets.shuffle(BUFFER_SIZE).batch(BTATH_SIZE)
 
 
# # 生成器模型
def generator_model():
    model = tf.keras.Sequential()
    model.add(layers.Dense(256,input_shape=(100,),use_bias=False))
    #Dense全连接层,input_shape=(100,)长度100的随机向量,use_bias=False,因为后面有BN层
    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'))
    model.add(layers.BatchNormalization())
    
    model.add(layers.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))#输出数字,>0.5真实图片
    
    return model
    
# # loss函数
cross_entropy=tf.keras.losses.BinaryCrossentropy(from_logits=True)#from_logits=True因为最后的输出没有激活
 
 
# # 生成器损失函数
def generator_loss(fake_out):#希望fakeimage的判别输出fake_out判别为真
    return cross_entropy(tf.ones_like(fake_out),fake_out)
 
 
 
 
# # 判别器损失函数
def discriminator_loss(real_out,fake_out):#辨别器的输出 真实图片判1,假的图片判0
    real_loss=cross_entropy(tf.ones_like(real_out),real_out)
    fake_loss=cross_entropy(tf.zeros_like(fake_out),fake_out)
    return real_loss+fake_loss 
 
 
 
 
# # 优化器
 
 
generator_opt=tf.keras.optimizers.Adam(1e-4)#学习速率
discriminator_opt=tf.keras.optimizers.Adam(1e-4)
 
 
EPOCHS=500
noise_dim=100 #长度为100的随机向量生成手写数据集
num_exp_to_generate=16 #每步生成16个样本
seed=tf.random.normal([num_exp_to_generate,noise_dim]) #生成随机向量观察变化情况
 
 
# # 训练
generator=generator_model()
discriminator=discriminator_model()
 
 
 
 
# # 定义批次训练函数
def train_step(images):
    noise = tf.random.normal([num_exp_to_generate,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 generator_plot_image(gen_model,test_noise):
    pre_images = gen_model(test_noise,training=False)
    #绘图16张图片在一张4x4
    fig = plt.figure(figsize=(4,4))
    for i in range(pre_images.shape[0]):
        plt.subplot(4,4,i+1) #从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('第'+str(epoch+1)+'次训练结果')
        if epoch%10==0:
            print('第'+str(epoch+1)+'次训练结果')
            generator_plot_image(generator,seed)
 
 
train(datasets,EPOCHS)
 
 

Результат обучения:

  • 1-й результат тренировки

  • 100-й результат тренировки

в заключении:

После 100-кратного обучения можно четко увидеть содержание чисел, а после 300-кратного обучения отчетливо виден эффект сгенерированных чисел, но после 300-кратного обучения эффект от 400-го и 500-кратного постепенно снижается. Содержимое изображения размыто.