当前位置: 首页 > news >正文

tensorflow2从入门到精通——自编码器系列原理以及实现

自编码器

  • 无监督学习,常用于数据去噪,数据降维、图像重构

无监督学习

  • 监督学习
    • 样本数据对应着标签,称之为有监督学习
  • 难点
    • 绝大部分标签为人工标注
    • 有些数据对于标注者的先验知识要求过高,且难以标注,如医学数据,具有一定的专业性
    • 人工标注数据成果过高
    • 人工标注容易引起主观先验偏差
  • 典型无监督学习
    • PCA,聚类,自编码器

自编码器介绍

本质上是一个数据编码与解码的过程,数据通过压缩之后解压恢复为元数据,编码时模型会将输入数据映射到低维向量,而解码时模型再将向量映射回输入数据的空间。与平常使用 的文件压缩和解压操作了类似。

普通自编码器

组成形式:输入层,单层隐藏层、输出层

深度自编码器

在隐藏层部分采用更深的多层网络结构进行表示,增加其中的特征提取层数

欠完备自编码器

隐藏层的维度比输入维度小,强制自编码器捕捉训练输入数据中最有用的特征。

正则自编码器

在损失函数上加上正则项等强制自编码器学习一些其他特性,如稀疏特征。

去噪自编码器

将输入数据进行一些人为破坏,如加噪等,强制自编码器学习相关特征并输出无噪数据。

  • 自编码器
import tensorflow as tf
form tensorflow.keras import layers
class Autoencoder(tf.keras.Model):
    def __init__(self):
        super(Autoencoder,self).__init__()
        self.Encoder = tf.keras.models.Sequential([   #编码器网络
            layers.Dense(512, kernel_initializer = 'normal', activation = 'relu'),
            layers.Dense(256, kernel_initializer = 'normal', activation = 'relu'),
            layers.Dense(60, kernel_initializer = 'normal', activation = 'relu')
        ])
        self.Decoder = tf.keras.models.Sequential([   #解码器网络
            layers.Dense(256, kernel_initializer = 'normal', activation = 'relu'),
            layers.Dense(512, kernel_initializer = 'normal', activation = 'relu'),
            layers.Dense(784, kernel_initializer = 'normal', activation = 'sigmoid')
        ])
    def call(self,input_features,training = None):   #前向传播
        code = self.Encoder(input_features)   #数据编码
        reconstructed = self.Decoder(code)   #数据解码
        return reconstructed
conv 自编码器
class Conv_Autoencoder(tf.keras.Model):
    def __init__(self):
        super(Conv_Autoencoder,self).__init__()
        self.Encoder = tf.keras.models.Sequential([   #编码器网络
            layers.Conv2D(16,(3,3),kernel_initializer = 'normal',padding = 'same',activation = 'relu'),
            layers.MaxPool2D((2,2)),
            layers.Conv2D(8,(3,3),kernel_initializer = 'normal',padding = 'same',activation = 'relu'),
            layers.MaxPool2D((2,2))
        ])
        self.Decoder = tf.keras.models.Sequential([   #解码器网络
            layers.UpSampling2D((2,2)),
            layers.Conv2D(8,(3,3),kernel_initializer = 'normal',padding = 'same', activation = 'relu'),
            layers.UpSampling2D((2,2)),
            layers.Conv2D(16,(3,3),kernel_initializer = 'normal',padding = 'same', activation = 'relu'),
            layers.Conv2D(1,(3,3),kernel_initializer = 'normal',padding = 'same', activation = 'sigmoid')
        ])
    def call(self,input_features,training = None):   #前向传播         
        code = self.Encoder(input_features)                      
        reconstructed = self.Decoder(code)                       
        return reconstructed
变分自编码器
class VAE(tf.keras.Model):
    def __init__(self,latent_dim):
        super(VAE,self).__init__()
        self.latent_dim = latent_dim
        self.epsilon_std = 1.0
        self.Encoder = tf.keras.models.Sequential([   #编码器网络
            layers.Dense(256,activation='relu'),
            layers.Dense(2)
        ])
        self.Decoder = tf.keras.models.Sequential([   #解码器网络
            layers.Dense(256, activation='relu'),
            layers.Dense(784,activation = 'sigmoid')
        ])
        
    def encode(self,x):
        z_mean = self.Encoder(x)   #均值
        z_log_var = self.Encoder(x)   #方差
        return z_mean, z_log_var
    
    def sampling(self, z_mean, z_log_var):
        z_mean, z_log_var = z_mean, z_log_var
        epsilon = K.random_normal(shape=(K.shape(z_mean)[0], self.latent_dim), mean=0.,stddev=self.epsilon_std)
        return z_mean + K.exp(z_log_var / 2) * epsilon
    
    def decode(self,z):
        x_decoded_mean = self.Decoder(z)
        return x_decoded_mean
class Autoencoder(tf.keras.Model):
    def __init__(self):
        super(Autoencoder, self).__init__()
        self.encoder = tf.keras.Sequential([
          tf.keras.layers.Dense(64, activation="relu"),
          tf.keras.layers.Dense(32, activation="relu"),
          tf.keras.layers.Dense(16, activation="relu")])

        self.decoder = tf.keras.Sequential([
          tf.keras.layers.Dense(32, activation="relu"),
          tf.keras.layers.Dense(64, activation="relu"),
          tf.keras.layers.Dense(140, activation="sigmoid")])

    def call(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)
        return decoded

相关文章:

  • python的opencv操作记录(五) - 空间域与频域转换
  • java学习day41(JavaWeb)JavaScript高级
  • 训练数据有缺陷?TrustAI来帮你!
  • WebSocket的使用,前后端发送消息的例子
  • MDM属性跳转功能说明
  • java计算机毕业设计物流信息管理系统录像演示源码+系统+数据库+lw文档+mybatis+运行部署
  • 没有基础能否学Java
  • 【CSS】笔记3-三大样式
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • redis 为什么这么快,你真的知道吗?
  • 【湖仓一体化】存OR算之争?SPL 我都要
  • 学习偏态分布的相关知识和原理的4篇论文推荐
  • 【 java 面向对象】包装类的使用
  • 【Leetcode刷题】搜索插入位置
  • 面向对象编程的Python实例教程-区间的插入
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • android图片蒙层
  • Create React App 使用
  • HTML中设置input等文本框为不可操作
  • python_bomb----数据类型总结
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Cloud中负载均衡器概览
  • XML已死 ?
  • 从零开始学习部署
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 力扣(LeetCode)22
  • 前端面试之闭包
  • 学习ES6 变量的解构赋值
  • 移动端唤起键盘时取消position:fixed定位
  • 再谈express与koa的对比
  • 你对linux中grep命令知道多少?
  • # 飞书APP集成平台-数字化落地
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #pragma pack(1)
  • #QT(智能家居界面-界面切换)
  • ${factoryList }后面有空格不影响
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (MATLAB)第五章-矩阵运算
  • (ZT)薛涌:谈贫说富
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Linux下编译安装log4cxx
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *Django中的Ajax 纯js的书写样式1
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net分布式压力测试工具(Beetle.DT)
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [1525]字符统计2 (哈希)SDUT