版权声明:本文为博主原创文章,未经博主允许不得转载。
一、程序代码
【步骤】
- 定义对抗生成网络结构:
D(判别)网络 :识别G生成的假数据
G(生成)网络:
输入格式、初始化: - 训练:
传入2组数据:真实数据x:高斯分布
随机初始化z
# 【一】导入必要的包
import argparse # 参数解析包:解析命令行参数和选项
import numpy as np # 科学计算的库,可以提供矩阵运算
from scipy.stats import norm # scipy数值计算库
import tensorflow as tf
import matplotlib.pyplot as plt # matplotlib绘图库
import seaborn as sns # 数据模块可视化
from matplotlib import animation
sns.set(color_codes=True) # set() 设置主题,调色板更常用
seed = 42 # 设置seed,用于随机初始化 ,使得每次生成的随机数相同
np.random.seed(seed)
tf.set_random_seed(seed)
# 【二】定义真实的数据分布(高斯分布)
class DataDistribution(object):
def __init__(self):
# 均值
self.mu = 4
# 标准差
self.sigma = 0.5
def sample(self, N):
samples = np.random.normal(self.mu, self.sigma, N)
samples.sort()
return samples
# 【三】随机初始化一个分布,作为G网络的输入
class GeneratorDistribution(object):
def __init__(self, range):
self.range = range
def sample(self, N):
return np.linspace(-self.range, self.range, N) + np.random.random(N) * 0.01
# 【四】定义线性运算函数,其中参数output_dim = h_dim * 2 = 8
def linear(input, output_dim, scope=None, stddev=1.0):
# 定义一个随机初始化
norm = tf.random_normal_initializer(stddev = stddev)
# b初始化为0
const = tf.constant_initializer(0.0)
with tf.variable_scope(scope or 'linear'):
# 声明 w 的shape,输入为(12,1)* w,故 w 为(1,8),w 的初始化方式为高斯初始化
w = tf.get_variable('w', [input.get_shape()[1], output_dim], initializer=norm)
# b 初始化为常量
b = tf.get_variable('b', [output_dim], initializer=const)
# 执行线性运算
return tf.matmul(input, w) + b
def generator(input, h_dim):
h0 = tf.nn.softplus(linear(input, h_dim, 'g0'))
h1 = linear(h0, 1, 'g1')
return h1
# 【五】初始化w 和 b 的函数,其中h0,h1,h2,h3 为层,将mlp_hidden_size = 4 传给 h_dim
def discriminator(input, h_dim):
# 第一层:linear 控制w和b的初始化,这里linear函数的第二个参数为 4*2=8
h0 = tf