TensoFlow 实现变分自编码(VAE)神经网络
1. 网络结构
自上而下,先搭骨架,在实现
1. 主网络:net
1. init
1. 初始化编码器类
2. 初始化解码器类
2. forward
1. 获取编码器输出:$\delta $ 和 $\mu$(方差)
2. 获取一个标准正态分布
3. 获取log标准方差`tf.sqrt(tf.exp(方差))`
4. 获取解码器的输入(编码器的最后输出):decode_x = $\delta$ x 标准正态分布+ log标准方差
5. 获取解码的输出
3. backward
1. loss(1):编码器的输出-输入的平方差
2. loss(2):KL散度
3. 总loss:loss(1)+ loss(2)
1. 可以在损失前加一个变量,用于对单个损失的提升(重点损失)
4. 测试:获取解码器 生成的图片:
1. 生成一个标准的正态分布
2. 使用解码器做一个前向计算
2. 子网络:编码器
1. 返回$\delta $ 和 $log $方差
2. 一个输入,
3. 一次激活
4. 两个输出,两个权重,无激活
3. 子网络:解码器
1. 全连接
2. 一个输入
3. 一个输出
4. 无激活函数:因为所需输出不是概率而是图片
知识点:
- 方差和标准方差的关系
- 方差:无平方
- 标准方差:有平方
- 如何求损失
- 求图片的损失:生成图片和原有图片的损失
- 求正太分布的损失:匹配正态分布的损失
- 两者相加,优化
- 如何设初值
- 截断随机正态分布
- 对以下内容的更改对神经网络的损失、输出值的改变
- 截断随机正态分布的截断
- 损失函数
- 平方差
- KL散度(相对熵)
- 优化器的选择
- Adm:
实现代码1:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib.pyplot as plt
mnist = input_data.read_data_sets(r'C:\Users\liev\Desktop\myproject\yin_test\MNIST_DATA_TensorFlow',one_hot=True)
# 编码类
class EncodeNet:
def __init__(self):
# 定义输入层到第一隐层的全连接权重和偏值
self.encode_w = tf.Variable(tf.truncated_normal([784, 100], stddev=0.01))
self.encode_b = tf.Variable(tf.zeros([100]))
# 定义第一隐层delta 输出的权重
self.log_var_w = tf.Variable(tf.truncated_normal([100,128], stddev=0.01))
# 定义第一隐层mu 输出的权重
self.mean_w = tf.Variable(tf.truncated_normal([100,128