深度学习——深度⽣成模型(GAN,VAE)
背景
⽣成模型从某个分布中获取输⼊训练样本, 并学习表⽰该分布的模型
作⽤  1. 产⽣真实数据, 艺术创作, 超分辨率图⽚
2.帮助我们发现数据集中的隐变量
3.异常检测
4.⽣成模型可以以多种⽅式被应⽤到强化学习中
5.进⾏隐变量表⽰的推理, 这些隐变量表⽰可以⽤做通⽤特征
变分⾃编码器VAE
AE与VAE AE: 通过编码器输出单个值来
刻画每个隐变量
VAE:将变量表⽰为可能的取值
范围(概率分布)
编码器输出隐变量分布, 从这些
分布中随机采样输⼊到解码器.
对于任何隐变量分布的采样, 希
望解码器能够准确地重构输⼊
数据
模型推导  1. 理想: 根据训练数据X得到真实分布, 根据分布P(x)采样, 得
到可能的X(包括数据外的), 即计算后验概率p(z|x)
2.设到q(z|x)与p(z|x), 最⼩化两者之间的KL散度, 则问题转变
成最⼤化下界, 等价于最⼩
化模型的损失函数:
再参数化隐变量不再从分布中采样, ⽽是对均值和⽅差进⾏放缩
:
总结  1. 是AE的概率版本, 是⼀种⽣成模型, 可以⽣成数据
2. VAE相当于在AE重构损失的基础上, 加⼊⼀个KL散度的正
则化项
3. 优点:
3. 优点:
(1)通过最⼤化变分下界优化模型, 有⽐较漂亮的数学原理
(2)通过重构可以实现⽆监督学习
(3)利⽤参数化技巧实现端到端训练
(4)通过推断出的隐变量可以获得⽐较好的可解释性特征
1. 缺点:⽣成的图像和GAN相⽐有些模糊
⽣成对抗⽹络
采取博弈论⽅法, 通过2⼈博弈游戏从训练分布中⽣成数据.
具体通过两个神经⽹络相互竞争来构建⼀个⽣成模型
⽣成器将随机噪声变换为模仿的”假”样本, 视图欺骗判别器
判别器从真实样本和⽣成器⽣成的样本识别真实样本
损失函数
获得新样本训练结束后, 去掉判别器, 可以⽤以⽣成新样本
优点⽣成的结果很逼真, 是当前最好的结果
缺点训练更难/ 更不稳定
当前研究热点更好的损失函数, 更稳定的训练学习算法⼤量的应⽤
VAE对⽐GAN VAE:优化数据似然的变分下界.  数学原理⽐较漂亮. 隐变量表⽰有⽤, 能推理查询, 但⽣成结果质量不是最好
GAN:基于博弈论⽅法, 当前⽣成结果最佳, 但训练起来可能会复杂和很不稳定, 没有推理查询
⼀.GAN的基本要素
1.真实数据集,初始化虚假数据集(噪⾳)
2.⽣成器,鉴别器:
⽣成器:
输⼊:原始数据的维数(⼀条数据)
输出:原始数据的维数(⼀条数据)
除了最后⼀层都要经sigmoid()
鉴别器:
输⼊:原始数据的维数(⼀个batch的数据)
输出:⼀维(以判别结果的真假)
经sigmoid,在(0,1)范围(切确地说输⼊层,隐藏层,输出层都要经过)
3.训练环(每⼀次epoch):(PS:这⾥冻结不冻结还是不理解,待补。。。)
每⼀次eopch⾥⾯,D和G都要训练,并且各⾃训练多次。(在代码中见到的情况是先D后G)
⽣成器训练周期:
真实数据训练:
(1)判别器出来的结果向“1”靠近
(2)反向传播
⽣成器产⽣数据训练:
(1)冻结⽣成器并产⽣数据
(2)判别器出来的结果向“0”靠近
(3)反向传播
鉴别器训练周期:
(1)不冻结⽣成器并产⽣数据(喂如D前转置了以下)
(2)判别器出来的结果向“1”靠近
(3)反向传播
⼆.GAN的损失函数(价值函数:从强化学习来)
解释:
对于判别器来说:损失函数的值越⼤越好
包括式⼦的两项
公式理解:
希望:真判1,假判0,  经log都输出0(最⼤值:log在(0,1上))
对于⽣成器来说:损失函数的值越⼩越好
只包括式⼦的后⼀项
公式理解:
希望: , 经上式---->负⽆穷(最⼩值)
三.公式和代码的转换技巧
1.损失函数的max,min,“+”,“-”等等:基本只体现在,代码的criterion()函数⾥。在代码⾥⾯的思路很简单:criterion()就
是为了度量你想要的和真实训练出来的差距;反向传播的过程就是改变⽹络的参数,使criterion()的值越来越⼩(即⽹络训练出来的会更加靠
近你想要的)。
PS:所以看⽂章的时候要⼩⼼,损失函数等max,还是min(⽼师和师兄都落坑了啊)。
2.⽹络的结构框图:基本只体现在代码的训练周期⾥。
3.看代码,运⾏代码真的是和刷题⼀样重要论⽂摘要就像教科书⾥的重点,论⽂⽂本基本是⽞学。只看课本⽂字不刷题,想
想后果就知道,基本学不会本质的东西并且还浪费时间。
四.⽂章所辅助的代码
1#!/usr/bin/env python
2
3# Generative Adversarial Networks (GAN) example in PyTorch. Tested with PyTorch 0.4.1, Python 3.6.7 (Nov 2018)
4# See related blog post at medium/@devnag/generative-adversarial-networks-gans-in-50-lines-of-code-pytorch-e81b79659e3f#.sch4xgsa9 5>>>>>>>>>>##导⼊包>>>>>>>>>>>>####
5>>>>>>>>>>##导⼊包>>>>>>>>>>>>#### 6import numpy as np
7import os
8import torch
as nn
10import torch.optim as optim
11from torch.autograd import Variable
12
13matplotlib_is_available = True
14try:
15  from matplotlib import pyplot as plt
16except ImportError:
17  print("Will skip plotting; matplotlib is not available.")
18  matplotlib_is_available = False
19>>>>>>>>>>##导⼊包>>>>>>>>>>>>#### 20
21>>>>>>>>>>##获取数据>>>>>>>>>>>>#### 22# 使⽤第⼆张GPU卡
24
25
26# Data params
27data_mean = 4
28data_stddev = 1.25
29
30# ### Uncomment only one of these to define what data is actually sent to the Discriminator
31#(name, preprocess, d_input_func) = ("Raw data", lambda data: data, lambda x: x)
32#(name, preprocess, d_input_func) = ("Data and variances", lambda data: decorate_with_diffs(data, 2.0), lambda x: x * 2)
33#(name, preprocess, d_input_func) = ("Data and diffs", lambda data: decorate_with_diffs(data, 1.0), lambda x: x * 2)
34(name, preprocess, d_input_func) = ("Only 4 moments", lambda data: get_moments(data), lambda x: 4)
35
36print("Using data [%s]" % (name))
37
38# > DATA: Target data and generator input data
39
40def get_distribution_sampler(mu, sigma):
41    return lambda n: torch.Tensor(al(mu, sigma, (1, n)))  # Gaussian
42
43def get_generator_input_sampler():
44    return lambda m, n: torch.rand(m, n)  # Uniform-dist data into generator, _NOT_ Gaussian
45
46>>>>>>>>>>##获取数据>>>>>>>>>>>>#### 47
48# > MODELS: Generator model and discriminator model
49
50>>>>>>>>>>##⽣成器和判别器>>>>>>>>>>>#### 51class Generator(nn.Module):
52    def __init__(self, input_size, hidden_size, output_size, f):
53        super(Generator, self).__init__()
54        self.map1 = nn.Linear(input_size, hidden_size)
55        self.map2 = nn.Linear(hidden_size, hidden_size)
56        self.map3 = nn.Linear(hidden_size, output_size)
57        self.f = f
58
59    def forward(self, x):
60        x = self.map1(x)
61        x = self.f(x)
62        x = self.map2(x)
63        x = self.f(x)
64        x = self.map3(x)
65        return x
66
67class Discriminator(nn.Module):
68    def __init__(self, input_size, hidden_size, output_size, f):
69        super(Discriminator, self).__init__()
70        self.map1 = nn.Linear(input_size, hidden_size)
70        self.map1 = nn.Linear(input_size, hidden_size)
71        self.map2 = nn.Linear(hidden_size, hidden_size)
72        self.map3 = nn.Linear(hidden_size, output_size)
73        self.f = f
74
75    def forward(self, x):
76        x = self.f(self.map1(x))
77        x = self.f(self.map2(x))
78        return self.f(self.map3(x))
79    >>>>>>>>>>##⽣成器和判别器>>>>>>>>>>>## 80
81def extract(v):
82    return v.data.storage().tolist()
variable used in lambda83
84def stats(d):
85    return [np.mean(d), np.std(d)]
86
87def get_moments(d):
88    # Return the first 4 moments of the data provided
89    mean = an(d)  #⽣成的⾼斯分布求均值
90    diffs = d - mean
91    var = an(torch.pow(diffs, 2.0))
92    std = torch.pow(var, 0.5)  #⽣成的⾼斯分布求标准差元素与
93    zscores = diffs / std
94    skews = an(torch.pow(zscores, 3.0))
95    kurtoses = an(torch.pow(zscores, 4.0)) - 3.0  # excess kurtosis, should be 0 for Gaussian
96    final = torch.cat((shape(1,), shape(1,), shape(1,), shape(1,)))  #⼀个向量,有四个元素,如代码
97    return final
98
99def decorate_with_diffs(data, exponent, remove_raw_data=False):
100    mean = an(data.data, 1, keepdim=True)
101    mean_broadcast = torch.s(data.size()), list()[0][0])
102    diffs = torch.pow(data - Variable(mean_broadcast), exponent)
103    if remove_raw_data:
104        return torch.cat([diffs], 1)
105    else:
106        return torch.cat([data, diffs], 1)
107
108def train():
109    # Model parameters
110    g_input_size = 1      # Random noise dimension coming into generator, per output vector
111    g_hidden_size = 5    # Generator complexity
112    g_output_size = 1    # Size of generated output vector
113    d_input_size = 500    # Minibatch size - cardinality of distributions
114    d_hidden_size = 10    # Discriminator complexity
115    d_output_size = 1    # Single dimension for 'real' vs. 'fake' classification
116    minibatch_size = d_input_size
117
118    d_learning_rate = 1e-3
119    g_learning_rate = 1e-3
120    sgd_momentum = 0.9
121
122    num_epochs = 5000
123    print_interval = 100
124    d_steps = 20
125    g_steps = 20
126
127    dfe, dre, ge = 0, 0, 0
128    d_real_data, d_fake_data, g_fake_data = None, None, None
129
130    discriminator_activation_function = torch.sigmoid
131    generator_activation_function = torch.tanh
132
133    d_sampler = get_distribution_sampler(data_mean, data_stddev)
134    gi_sampler = get_generator_input_sampler()
135    G = Generator(input_size=g_input_size,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论