文章目录

  • 1.AE实战
  • 2.VAE实战

1.AE实战

# 图片的重建
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from PIL import Image
from tensorflow import keras
from tensorflow.keras import Sequential,layers
# 设置随机数种子
tf.random.set_seed(22)
np.random.seed(22)
assert tf.__version__.startswith('2.')# 定义Image保存函数,将多张Image保存到一张Image里面去
def save_images(imgs,name):news_im = Image.new('L',(280,280))index = 0# 将10张Image保存到一张Image里面去for i in range(0,280,28):for j in range(0,280,28):im = imgs[index]im = Image.fromarray(im,mode='L')news_im.paste(im,(i,j))index += 1news_im.save(name)h_dim = 10      # 将原来的784维的数据降维到20维上
batchsz = 512
lr = 1e-3# 加载数据集
(x_train,y_train),(x_test,y_test) = keras.datasets.fashion_mnist.load_data()
x_train,x_test = x_train.astype(np.float32) / 255.,x_test.astype(np.float32) / 255.
# 无监督学习,我们不需要使用label,即y_train、y_test不使用
train_db = tf.data.Dataset.from_tensor_slices((x_train))
train_db = train_db.shuffle(batchsz*5).batch(batchsz)
test_db = tf.data.Dataset.from_tensor_slices((x_test))
test_db = test_db.batch(batchsz)print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)# 建立模型
class AE(keras.Model):def __init__(self):super(AE, self).__init__()# Encoders-编码self.encoder = Sequential([layers.Dense(256,activation=tf.nn.relu),layers.Dense(128,activation=tf.nn.relu),layers.Dense(h_dim)])# Decoders-解码self.decoder = Sequential([layers.Dense(128,activation=tf.nn.relu),layers.Dense(256,activation=tf.nn.relu),layers.Dense(784)])def call(self,inputs,training = None):# [b,784] -> [b,10]h = self.encoder(inputs)# [b,10] -> [b,784]x_hat = self.decoder(h)return x_hatmodel = AE()
model.build(input_shape = (None,784))
# 查看网络结构
model.summary()optimizer = tf.optimizers.Adam(lr=lr)
# training
for epoch in range(50):for step,x in enumerate(train_db):# [b,28,28] -> [b,784]x = tf.reshape(x,[-1,784])with tf.GradientTape() as tape:x_rec_logits = model.call(x)rec_loss = tf.losses.binary_crossentropy(x,x_rec_logits,from_logits=True)rec_loss = tf.reduce_mean(rec_loss)grads = tape.gradient(rec_loss,model.trainable_variables)optimizer.apply_gradients(zip(grads,model.trainable_variables))# 打印training进度if step % 100 == 0:print(epoch,step,float(rec_loss))# evaluationx = next(iter(test_db))# training时,将x打平了logits = model(tf.reshape(x,[-1,784]))x_hat = tf.sigmoid(logits)# [b,784] => [b,28,28]x_hat = tf.reshape(x_hat,[-1,28,28])# [b,28,28] => [2b,28,28]x_concat = tf.concat([x,x_hat],axis=0)x_concat = x_hatx_concat = x_concat.numpy() * 255.x_concat = x_concat.astype(np.uint8)save_images(x_concat,'ae_images/rec_epoch_%d.png'%epoch)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
Model: "ae"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
sequential (Sequential)      multiple                  235146
_________________________________________________________________
sequential_1 (Sequential)    multiple                  235920
=================================================================
Total params: 471,066
Trainable params: 471,066
Non-trainable params: 0
_________________________________________________________________
0 0 0.6929969787597656
0 100 0.3294386863708496
1 0 0.31267669796943665
1 100 0.30951932072639465
2 0 0.2991226315498352
2 100 0.30571430921554565
3 0 0.30124884843826294
3 100 0.29927968978881836
4 0 0.29633498191833496
4 100 0.29800713062286377
5 0 0.28601688146591187
...

2.VAE实战



公式

import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'import tensorflow as tf
import numpy as np
from tensorflow import keras
from PIL import Image
from tensorflow.keras import Sequential, layers# 生成随机数种子
tf.random.set_seed(22)
np.random.seed(22)
assert tf.__version__.startswith('2.')def save_images(imgs, name):new_im = Image.new('L', (280, 280))index = 0for i in range(0, 280, 28):for j in range(0, 280, 28):im = imgs[index]im = Image.fromarray(im, mode='L')new_im.paste(im, (i, j))index += 1new_im.save(name)# h_dim = 20
batchsz = 256
lr = 1e-3# 加载数据集
(x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data()
x_train, x_test = x_train.astype(np.float32) / 255., x_test.astype(np.float32) / 255.
# 无监督学习,我们不需要使用label,即y_train、y_test不使用
train_db = tf.data.Dataset.from_tensor_slices((x_train))
train_db = train_db.shuffle(batchsz * 5).batch(batchsz)
test_db = tf.data.Dataset.from_tensor_slices((x_test))
test_db = test_db.batch(batchsz)print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)z_dim = 10class VAE(keras.Model):def __init__(self):super(VAE, self).__init__()# Encoder - 编码self.fc1 = layers.Dense(128)self.fc2 = layers.Dense(z_dim)  # get mean predictionself.fc3 = layers.Dense(z_dim)  # get var  prediction# Decoderself.fc4 = layers.Dense(128)self.fc5 = layers.Dense(784)# 定义编码函数def encoder(self, x):h = tf.nn.relu(self.fc1(x))# get meanmu = self.fc2(h)# get variancelog_var = self.fc3(h)return mu, log_var# 定义解码函数def decoder(self, z):out = tf.nn.relu(self.fc4(z))out = self.fc5(out)return out# 定义z函数def reparameterize(self, mu, log_var):eps = tf.random.normal(log_var.shape)# 标准差std = tf.exp(log_var) ** 0.5# std = tf.exp(log_var * 0.5)z = mu + std * epsreturn z# 定义前向传播def call(self, inputs, training=None):# [b,784] => [b,z_dim],[b,z_dim]mu, log_var = self.encoder(inputs)# reparameterization trickz = self.reparameterize(mu, log_var)x_hat = self.decoder(z)# 除了前向传播不同以外,还有一个约束,使得mu,var趋向于正态分布return x_hat, mu, log_varmodel = VAE()
model.build(input_shape=(4, 784))               # 这一个与往常构造的时候有区别
optimizer = tf.optimizers.Adam(lr=lr)for epoch in range(50):for step, x in enumerate(train_db):# [b,28,28] => [b,784]x = tf.reshape(x, [-1, 784])with tf.GradientTape() as tape:x_hat, mu, log_var = model(x)rec_loss = tf.nn.sigmoid_cross_entropy_with_logits(labels = x,logits = x_hat)rec_loss = tf.reduce_sum(rec_loss) / x.shape[0]# rec_loss = tf.reduce_mean(rec_loss) # compute KL divergence (mu, var) ~N(0,1)# p~N(mu,∨var) q~N(0,1) 故u2=0,σ2=1kl_div = -0.5 * (log_var + 1 - mu ** 2 - tf.exp(log_var))kl_div = tf.reduce_mean(kl_div) / x.shape[0]loss = rec_loss + 1. * kl_divgrads = tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(grads, model.trainable_variables))if step % 100 == 0:print(epoch, step, 'kl div:', float(kl_div), 'rec loss:', float(loss))# evaluation-测试生成效果z = tf.random.normal((batchsz,z_dim))logits = model.decoder(z)x_hat = tf.sigmoid(logits)x_hat = tf.reshape(x_hat,[-1,28,28]).numpy()* 255.x_hat = x_hat.astype(np.uint8)save_images(x_hat,'vae_image/sampled_epoch%d.png'%epoch)# 重建图片x = next(iter(test_db))x = tf.reshape(x, [-1, 784])x_hat_logits, _, _ = model(x)x_hat = tf.sigmoid(x_hat_logits)x_hat = tf.reshape(x_hat, [-1, 28, 28]).numpy() * 255.x_hat = x_hat.astype(np.uint8)save_images(x_hat,'vae_image_1/sampled_epoch%d.png'%epoch)

深度学习2.0-43.AE实战与VAE实战相关推荐

  1. 【深度学习】:《PyTorch入门到项目实战》第五天:从0到1实现Softmax回归(含源码)

    [深度学习]:<PyTorch入门到项目实战>第五天:从0到1实现Softmax回归 ✨本文收录于[深度学习]:<PyTorch入门到项目实战>专栏,此专栏主要记录如何使用Py ...

  2. 深度学习之卷积神经网络(4)LeNet-5实战

    深度学习之卷积神经网络(4)LeNet-5实战 加载数据集 创建网络 训练阶段 测试阶段 完整代码  1990年代,Yann LeCun等人提出了用于手写数字和机器打印字符图片识别的神经网络,被命名为 ...

  3. 深度学习(4)手写数字识别实战

    深度学习(4)手写数字识别实战 Step0. 数据及模型准备 1. X and Y(数据准备) 2. out=relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}out=relu ...

  4. 深度学习之自编码器(5)VAE图片生成实战

    深度学习之自编码器(5)VAE图片生成实战 1. VAE模型 2. Reparameterization技巧 3. 网络训练 4. 图片生成 VAE图片生成实战完整代码  本节我们基于VAE模型实战F ...

  5. 深度学习读书笔记之AE(自动编码)

    深度学习读书笔记之AE 声明: 1)该博文是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的 ...

  6. 深度学习笔记(43) Siamese网络

    深度学习笔记(43) Siamese网络 1. Siamese网络 2. 建立人脸识别系统 3. 训练网络 1. Siamese网络 深度学习笔记(42) 人脸识别 提到的函数ddd的作用: 输入两张 ...

  7. 【深度学习】:《PyTorch入门到项目实战》(十二)卷积神经网络:填充(padding)和步幅(stride)

    [深度学习]:<PyTorch入门到项目实战>(十二)填充(padding)和步幅(stride) ✨本文收录于[深度学习]:<PyTorch入门到项目实战>专栏,此专栏主要记 ...

  8. halcon 深度学习标注_HALCON深度学习工具0.4 早鸟版发布了

    原标题:HALCON深度学习工具0.4 早鸟版发布了 HALOCN深度学习工具在整个深度学习过程中扮演着重要的作用,而且在将来将扮演更重要的辅助作用,大大加快深度学习的开发流程,目前发布版本工具的主要 ...

  9. halcon显示坐标_HALCON深度学习工具0.4 早鸟版发布了

    HALOCN深度学习工具在整个深度学习过程中扮演着重要的作用,而且在将来将扮演更重要的辅助作用,大大加快深度学习的开发流程,目前发布版本工具的主要作用是图像数据处理和目标检测和分类中的标注. 标注训练 ...

  10. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(开发环境介绍)

    开发环境介绍 Python3 1.结构清晰,简单易学 2.丰富的标准库 3.强大的的第三方生态系统 4.开源.开放体系 5.高可扩展性:胶水语言 6.高可扩展性:胶水语言 7.解释型语言,实现复杂算法 ...

最新文章

  1. 案例 | 河小象:智办事高效驱动组织升级
  2. 元气满满 开工大吉 2020「升职加薪,走好这三步...」
  3. Java模式(适配器模式)
  4. Spring Aop实例之xml配置
  5. 点击一次铵钮产生一个新文本框,分别输入值,然后获取
  6. 视频版权检测算法​​
  7. 我的Spring MVC第一个应用
  8. 数字金字塔MySQL存储过程_千金良方——MySQL性能优化金字塔法则
  9. Ubuntu 18.04 安装 RoboWare
  10. 如何使用视频转换器将kux格式转换成mp4格式
  11. python 进程池pool使用详解
  12. Python爬虫入门记录1.0:获取网站某板块首页面资讯文章标题
  13. SD 格式化錯誤提示Windows無法完成格式化
  14. 树莓派4B命令行安装网易云音乐播放在线歌曲
  15. 惠普笔记本连接wifi无internet,手机连接正常
  16. 重构之美-浴火重生的火凤凰CSS3【前传:Gradient】
  17. 子类重写方法不能抛出新的异常
  18. Android开发实用小工具十一——亲戚称呼计算器
  19. python爬虫开发与项目实战pdf下载_python爬虫开发与项目实战PDF高清文档下载
  20. mysql 二级索引原理_你真的理解索引吗?从数据结构层面解析mysql索引原理

热门文章

  1. HDU 1500(经典的恶心DP)
  2. HDU3746 Cyclic Nacklace KMP求循环节
  3. python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式...
  4. PYTHON_错误处理
  5. NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
  6. 三种图象处理的效率比较,用指针法最快
  7. Collection的另外一个子类LinkedListSet集合
  8. SingalR 构建 推送服务器初探
  9. 包机项目源码分析笔记
  10. Spring学习笔记(一) 简介