文章目录

  • 前言
  • 一、稀疏编码
    • 1.基本概念
    • 2. 模型算法
  • 二、自编码
    • 1. 概念
      • 自编码用途
      • 结构
      • 去噪编码器
    • 2.自编码核心代码
    • 3.去噪编码核心代码
  • 总结

前言


一、稀疏编码

1.基本概念

稀疏编码这一概念来源于神经生物学,例如看到的每幅画都是上亿像素的,但在初级视觉皮层中。每个神经元只对特定的刺激信号做出响应(例如特殊条纹,特定方向的边缘),每幅画像经过大脑处置之后只用较小的代价取重建和储存,仅存入重要的信息。
以此类比,外界的信息在经过编码后仅有一部分神经元被激活,即外界信息在神经系统的表示上有稀疏性。
稀疏编码的目的:在大量的数据集中,选取很小部分作为元素来重建新的数据。
编码的概念:(线性)编码指将输入样本X∈RDX \in R^DX∈RD,表示为一组基向量A=[α1,...αM]A=[\alpha_1,...\alpha_M]A=[α1​,...αM​]的线性组合。
x=Σm=1Mzmαmx =\Sigma_{m=1} ^M z_m \alpha_mx=Σm=1M​zm​αm​
X 表示D维空间的样本,例如一幅图片

A为标准化 的基础矩阵,表示构成组成元素的基本原子,可称为字典,在图像中可表示为构成图像的基本边,角。

  • A为基向量(字典)。Z为编码(基向量的系数),AZ表示经过编码后的x,表示外界环境经过编码后只有一小部分神经元被激活,则外界刺激在系统的表示中具有很高的稀疏性。

  • 注:稀疏性的定义:非零元素的比例。若向量z中仅有几个非零元素则说明该向量是稀疏的。

    维度角度:D维空间中的样本x 找到其在P维空间的表示,为了稀疏编码需要找到一组“过完备的基向量,因为过完备的基向量下往往存在冗余,因此会出现很多有效的编码。(根据线代知识,P>D ,则说明这个稀疏矩阵有很多解)
    对这些编码加一个稀疏性限制,将减少解空间大小,得到唯一的稀疏性编码。

2. 模型算法

给定一组N个输入向量。目标函数为
ρ\rhoρ表示衡量稀疏性函数-z越稀疏,ρ(z)\rho(z)ρ(z)越小,η\etaη超参数,用来控制稀疏性强度。
其中,衡量稀疏性函数有多种形式:

二、自编码

1. 概念


上面两组数据如果让你记忆,哪一行数据会更容易记住呢?咋一看,可能会觉得肯定是第一行,但仔细分析后发现第二组数据长,但存在一定规律,偶数项的后一项是除2得到的数,奇数项的后一项是三倍加一。这个过程就涉及到记忆、感知、和模式匹配的关系。
和这样的记忆模式类似,一个自编码器接收输入,将其转换成高效的内部表示,然后再输出输入数据的类似物。自编码器通常包括两部分:encoder(也称为识别网络)将输入转换成内部表示,decoder(也称为生成网络)将内部表示转换成输出。
自编码器通过简单地学习将输入复制到输出来工作。这一任务就是输入训练数据, 再输出训练数据的任务,输入数据进行一高效表示,其维度一般远小于输入数据。

自编码用途

  1. 限制内部表示的尺寸,从而实现降维
  2. 作为强大的特征检测器(feature detectors),应用于深度神经网络的预训练
  3. 随机生成与训练数据类似的数据,这被称作生成模型。例如用人脸图片训练一个自编码器,它可以生成新的图片。
  4. 对训练数据增加噪声并训练自编码器使其能恢复原有。这些限制条件防止自编码器机械地将输入复制到输出,并强制它学习数据的高效表示
  5. 若让编码的输出只能取K个不同的值,则自编码器转化为K聚类

结构

学习目标:最小化重构错误

  • 特征空间的维度小于原始空间的维度,相当于降维/特征抽取;
  • 特征空间的维度大于原始空间的维度,则一定可以找到一组或多组解将f。gf 。gf。g变为单位函数,从而使重构错误为0,这样的解没有多大意义,但如果加上编码的稀疏性等约束则可以解决一些有意义的问题。

  • -自编码器的结构和多层感知机类似,除了输入神经元和输出神经元的个数相等。

去噪编码器

一种强制自编码器学习有用特征的方式是输入增加噪声,通过训练之后得到无噪声的输出。这防止了自编码器简单的将输入复制到输出,从而提取出数据中有用的模式。
提升编码系统的鲁棒性。高维数据一般具有信息冗余,比如从一张部分损坏的图像去联想其完整的数据。同比,我们希望从部分损坏的数据中得到有效数据然后恢复完整的原始信息。
噪声可以是添加到输入的纯高斯噪声,也可以是随机丢弃输入层的某个特征,类似于dropout。

2.自编码核心代码

代码如:

class autoencoder(nn.Module):#moduledef __init__(self):super(autoencoder,self).__init__()self.encoder = nn.Sequential(#sequential一定要记得大写nn.Linear(28*28,1000),nn.ReLU(True),nn.Linear(1000,500),nn.ReLU(True),nn.Linear(500,250),nn.ReLU(True),nn.Linear(250,2))self.decoder = nn.Sequential(nn.Linear(2,250),nn.ReLU(True),nn.Linear(250,500),nn.ReLU(True),nn.Linear(500,1000),nn.ReLU(True),nn.Linear(1000,28*28),nn.Tanh())#用tanh来激活def forward(self,x):x = self.encoder(x)x = self.decoder(x)return x

3.去噪编码核心代码

以手写数据集为例,用训练的模型来生成新的图片

导入数据集和库

#加载库和配置参数
#去噪自编码器
import torch
import torch.nn as nn
import torch.utils as utils
from torch.autograd import Variable
import torchvision.datasets as dset
import torchvision.transforms as transforms
import numpy as np
import matplotlib.pyplot as plt
#配置参数
torch.manual_seed(2)
n_epoch=100
batch_size=100
learning_rate=0.002#下载图片库训练集
mnist_train=dset.MNIST("./",train=True,transform=transforms.ToTensor(),target_transform=None,download=True)
train_loader=torch.utils.data.DataLoader(dataset=mnist_train,batch_size=batch_size,shuffle=True)

Encoder和Decoder模型设置

class Encoder(nn.Module):def __init__(self):super(Encoder,self).__init__()self.layer1=nn.Sequential(nn.Conv2d(1,32,3,padding=1),#batch*32*28*28nn.ReLU(),nn.BatchNorm2d(32),nn.Conv2d(32,32,3,padding=1),#batch*32*28*28nn.ReLU(),nn.BatchNorm2d(32),nn.Conv2d(32,64,3,padding=1),#batch*64*28*28nn.ReLU(),nn.BatchNorm2d(64),nn.Conv2d(64,64,3,padding=1),#batch*64*28*28nn.ReLU(),nn.BatchNorm2d(64),nn.MaxPool2d(2,2)#batch*64*14*14)self.layer2=nn.Sequential(nn.Conv2d(64,128,3,padding=1),#batch*128*14*14nn.ReLU(),nn.BatchNorm2d(128),nn.Conv2d(128,128,3,padding=1),#batch*128*14*14nn.ReLU(),nn.BatchNorm2d(128),nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,padding=1),#batch*256*14*14nn.ReLU())def forward(self,x):out=self.layer1(x)out=self.layer2(out)out=out.view(batch_size,-1)return outencoder=Encoder()

解码

class Decoder(nn.Module):def __init__(self):super(Decoder,self).__init__()self.layer1=nn.Sequential(nn.ConvTranspose2d(256,128,3,2,1,1),#batch*128*14*14nn.ReLU(),nn.BatchNorm2d(128),nn.ConvTranspose2d(128,128,3,1,1),#batch*128*14*14nn.ReLU(),nn.BatchNorm2d(128),nn.ConvTranspose2d(128,64,3,1,1),#batch*64*14*14nn.ReLU(),nn.BatchNorm2d(64),nn.ConvTranspose2d(64,64,3,1,1),#batch*64*14*14nn.ReLU(),nn.BatchNorm2d(64))self.layer2=nn.Sequential(nn.ConvTranspose2d(64,32,3,1,1),#batch*32*14*14nn.ReLU(),nn.BatchNorm2d(32),nn.ConvTranspose2d(32,32,3,1,1),#batch*32*14*14nn.ReLU(),nn.BatchNorm2d(32),nn.ConvTranspose2d(32,1,3,2,1,1),#batch*1*28*28nn.ReLU())def forward(self,x):out=x.view(batch_size,256,7,7)out=self.layer1(out)out=self.layer2(out)return out
decoder=Decoder()
###Loss 函数和优化器
parameters=list(encoder.parameters())+list(decoder.parameters())
loss_func=nn.MSELoss()
optimizer=torch.optim.Adam(parameters,lr=learning_rate)###自编码器训练
#添加噪声
noise=torch.rand(batch_size,1,28,28)
for I in range(n_epoch):for image,label in train_loader:image_n=torch.mul(image+0.25,0.1*noise)image=Variable(image)image_n=Variable(image_n)optimizer.zero_grad()#loss关于weight的导数变成0.output=encoder(image_n)output=decoder(output)loss=loss_func(output,image)loss.backward()optimizer.step()#更新所有的参数breakprint('epoch[{}/{}],loss:{:.4f}'.format(I+1,n_epoch,loss.item()))

训练100次后的损失函数:

####带噪图片和去噪图片对比
img=image[0].cpu()
input_img=image_n[0].cpu()
output_img=output[0].cpu()origin=img.data.numpy()
inp=input_img.data.numpy()
out=output_img.data.numpy()plt.figure('denoising autoencoder')#一个figure对象包含了多个子图,可以使用subplot()函数来绘制子图
#这是第一个图
plt.subplot(131)
plt.imshow(origin[0])
plt.subplot(132)
plt.imshow(inp[0],cmap='gray')
plt.subplot(133)
plt.imshow(out[0],cmap='gray')plt.show()
print(label[0])


第一幅图为原始的图片,第二幅是增加噪声后的数据,第三幅图将其解码后的图片,保留9的基本特征。

总结

无监督学习之稀疏编码,自编码相关推荐

  1. 李宏毅(2020)作业9:无监督学习降维、聚类、自编码

    文章目录 数据集 作业 任务1 任务2 任务3 数据 下载数据集 准备训练数据 一些工具函数 模型 训练 降维和聚类 问题1(作图) 问题2 问题3 数据集 valX.npy valY.npy tra ...

  2. Stanford UFLDL教程 稀疏编码自编码表达

    稀疏编码自编码表达 Contents [hide] 1稀疏编码 2拓扑稀疏编码 3稀疏编码实践 3.1将样本分批为"迷你块" 3.2良好的s初始值 3.3可运行算法 4中英文对照 ...

  3. 省编码市编码区县编码_无浪费编码

    省编码市编码区县编码 本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题. Java通常被视为无法在低内存环境中有效运行的内存猪. 目的是证明许多人认为不可能的事情,有意义的java ...

  4. 三维点云去噪无监督学习:ICCV2019论文分析

    三维点云去噪无监督学习:ICCV2019论文分析 Total Denoising: Unsupervised Learning of 3D Point Cloud Cleaning 论文链接: htt ...

  5. 【机器学习】无监督学习

    [机器学习]无监督学习 https://mp.weixin.qq.com/s/NV84o6Jd_z8evjq05n2jzA 作者:水奈樾  人工智能爱好者 博客专栏:http://www.cnblog ...

  6. 图像翻译、语义分割、域适应、图像检索、无监督学习cvpr2021

    CV君一直在整理 CVPR 2021 论文: https://github.com/52CV/CVPR-2021-Papers 本文分享几篇近期值得关注的 CVPR 2021 的开源论文,包括图像到图 ...

  7. ML之UL:无监督学习Unsupervised Learning的概念、应用、经典案例之详细攻略

    ML之UL:无监督学习Unsupervised Learning的概念.应用.经典案例之详细攻略 目录 无监督学习Unsupervised Learning的概念 无监督学习Unsupervised ...

  8. 无监督学习 k-means_无监督学习-第2部分

    无监督学习 k-means 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU' ...

  9. 深度 | 一篇文章带你进入无监督学习:从基本概念到四种实现模型(附论文)

    作者:Eugenio Culurciello 机器之心编译 参与:李亚洲.武竞 微信公众号:(almosthuman2014)授权转载,禁止二次转载,点此为原文链接 这是今年 6 月份普渡大学副教授 ...

  10. (转)【重磅】无监督学习生成式对抗网络突破,OpenAI 5大项目落地

    [重磅]无监督学习生成式对抗网络突破,OpenAI 5大项目落地 [新智元导读]"生成对抗网络是切片面包发明以来最令人激动的事情!"LeCun前不久在Quroa答问时毫不加掩饰对生 ...

最新文章

  1. 电脑无法安装python-无法安装Python库
  2. 基于 Spring Cloud 的服务治理实践
  3. Python 缓冲区
  4. python时间戳转换并pandas批量转换时间戳
  5. python向端口发出数据_Python写的简单的端口监听,显示端口上收到的数据,TCP的...
  6. unbuntu 启动任务脚本_Ubuntu下服务启动脚本编写
  7. 华为海选开发者状元?还送14件豪礼?
  8. ubuntu memcached php,如何在 Ubuntu 18.04 上安装 Memcached
  9. redis没有bin目录_分布式缓存 Redis 集群搭建,这里一次性帮你搞定!
  10. 晶振两端的谐振电容有特殊要求吗_“吃瓜群众”也能秒懂的晶振电路原理
  11. 我们教授编程的方式统统不对!
  12. 统计处理包Statsmodels: statistics in python
  13. 手动实现一个vue的mvvm,思路解析
  14. 揭秘阿里巴巴的客群画像
  15. 撬动百亿台设备,让物联网“造”起来!
  16. matlab 函数pdf怎么用_PDF剪裁页面工具怎么用?怎么剪裁PDF页面
  17. MySQL学习笔记10(流程控制、函数)
  18. consonant combination
  19. 中考计算机易错知识点,【中考备考】易错知识点归类
  20. python成语接龙

热门文章

  1. AutoCAD 经典
  2. 清除/收缩SQL Server数据库日志
  3. R语言(四)——十折交叉验证/机器学习回归【决策树(随机森林)、组合方法、SVR】
  4. 控制电机正反转的c语言程序,步进电机正反转控制C语言程序,只为初学者.docx
  5. java springboot宠物医院管理系统(毕业设计)
  6. QTQString(UTF8)数据转GBK
  7. IDEA汉化包插件无法下载解决办法
  8. 小福利,介绍excel高阶函数2
  9. gpio引脚介绍 树莓派3b_树莓派引脚对照表
  10. 系统发育树的美化~Figtree(图文教程)