判别式模型和生成是模型的区别:
假设研究对象为变量为x,类别变量为y,则:
判别式模型:
只是对给定的样本进行分类,不关心数据如何生成。
按照一定的判别准则,从数据中直接学习决策函数y=f(x)或者条件概率分布p(y|x;a)作为预测的模型
典型的判别模型包括:k近邻法,决策树,最大熵模型,支持向量机等
生成式模型:
根据生成假设,哪个类别最有可能生成这个样本
从数据中学习联合概率分布p(x,y),其之后可以转变为p(y|x)作为预测模型,例如利用条件概率分布p(y|x)=p(x,y)/p(x)
生成对抗网络GAN基本原理:
GAN包括两部分:生成器和判别器
生成器:从随机噪声中生成图像(随机噪声通常从均匀分布或高斯分布中获取)
判别器:其输入为生成器生成的图像和来自训练集中的真实图像,并对其进行判别。得到输出值为一个0到1之间的数,表示图像为真实图像的概率,real为1,fake为0.
来自真实数据的概率越大越好,来自生成样本的概率越小越好
尽量正确的判断接受到的图像是生成的还是真实的图像
生成的图片让判别器难以判别真假
尽量生成接近真实数据的图片
先更新判别器
固定生成器G,更新判别器D
固定判别器D,更新判别器G
更新要使梯度下降
GAN在生成模型之外引入一个判别模型,通过两者之间的对抗训练达到优化目的
生成器:
GAN生成器网络
import tensorflow as tf
import keras
from keras import layers
import numpy as np
latent_dim=32
height=32
width=32
channels=3
generator_input=keras.Input(shape=(latent_dim,))
x=layers.Dense(128*16*16)(generator_input)#将输入转换为大小为16*16的128个通道的特征图
x=layers.LeakyReLU()(x)
x=layers.Reshape((16,16,128))(x)
x=layers.Conv2D(256,5,padding='same')(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2DTranspose(256,4,strides=2,padding='same')(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(256,5,padding='same')(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(256,5,padding='same')(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(channels,7,activation='tanh',padding='same')(x)
generator=keras.models.Model(generator_input,x)
generator.summary()
GAN判别器网络
discriminator_input=layers.Input(shape=(height,width,channels))
x=layers.Conv2D(128,3)(discriminator_input)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(128,4,strides=2)(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(128,4,strides=2)(x)
x=layers.LeakyReLU()(x)
x=layers.Conv2D(128,4,strides=2)(x)
x=layers.LeakyReLU()(X)
x=layers.Flatten()(x)
x=layers.Dropout(0.4)(x)
x=layers.Dense(1,activation='sigmoid')(x)
discriminator=keras.models.Model(discriminator_input,x)#将输入转换为一个二进制分类决策
discriminator.summary()
discriminator_optimizer=keras.optimizers.RMSprop(
lr=0.0008,
clipvalue=1.0,#限制梯度值的范围
decay=1e-8 #使用学习率衰减
)
discriminator.compile(optimizer=discriminator_optimizer,loss='binary_crossentropy')