Это 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. Особенности ГАН:
-
По сравнению с традиционной моделью она имеет две разные сети вместо одной сети, а метод обучения использует метод состязательного обучения.
-
Информация об обновлении градиента G в GAN поступает от дискриминатора D, а не от выборок данных.
5. Преимущества ГАН:
-
GAN является генеративной моделью.По сравнению с другими генеративными моделями (машинами Больцмана и GSN) используется только обратное распространение без сложных цепей Маркова.
-
По сравнению со всеми другими моделями GAN может создавать более четкие и реалистичные образцы.
-
GAN обучен методу обучения без учителя и может широко использоваться в области обучения без учителя и обучения с полуучителем.
-
По сравнению с вариационными автоэнкодерами GAN не вносят никакого детерминированного смещения, а вариационные методы вносят детерминированное смещение, потому что они оптимизируют нижнюю границу логарифмической вероятности, а не саму вероятность, что, по-видимому, приводит к тому, что экземпляры, генерируемые VAE, более размыты, чем GAN
-
По сравнению с VAE, GAN не имеют вариационной нижней границы. Если дискриминатор хорошо обучен, генератор может отлично изучить распределение обучающих выборок. Другими словами, GAN асимптотически непротиворечивы, но VAE смещены.
-
GAN применяется к некоторым сценариям, таким как передача стиля изображения, сверхвысокое разрешение, завершение изображения, шумоподавление, что позволяет избежать сложности проектирования функции потерь. остальные Следующие будут переданы на тренировку противостояния.
6. Недостатки ГАН:
-
Обучение GAN необходимо для достижения равновесия Нэша, что иногда может быть достигнуто с помощью градиентного спуска, иногда нет.Мы не нашли хорошего способа достичь равновесия Нэша, поэтому обучение GAN нестабильно по сравнению с VAE или PixelRNN, но я думаю, что на практике это все же намного стабильнее, чем тренировка машины Больцмана
-
GAN не подходят для обработки дискретных форм данных, таких как текст
-
У GAN есть проблемы с нестабильным обучением, исчезающими градиентами и коллапсом режима (в настоящее время решено)
7. Несколько советов по обучению GAN:
-
Вход нормализуется до (-1, 1), а функция активации последнего слоя использует tanh (кроме BEGAN).
-
Используя функцию потерь вассертеина GAN,
-
Если у вас есть данные меток, попробуйте использовать метки. Некоторые считают, что использование обратных меток очень эффективно. Кроме того, используется сглаживание меток, одностороннее сглаживание меток или двустороннее сглаживание меток.
-
Используйте норму мини-партии, если вам не нужна норма партии, вы можете использовать норму экземпляра или норму веса
-
Избегайте использования RELU и объединенных слоев, чтобы уменьшить вероятность разреженных градиентов, вы можете использовать функцию активации Leakrelu.
-
Оптимизатор должен попытаться выбрать ADAM, и скорость обучения не должна быть установлена слишком большой.Можно сослаться на начальный 1e-4.Кроме того, скорость обучения может постоянно снижаться по мере обучения.
-
Добавление гауссовского шума к сетевому слою 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-кратного постепенно снижается. Содержимое изображения размыто.