AutoEncoder (自编码/非监督学习)

2023-11-18

神经网络也能进行非监督学习, 只需要训练数据, 不需要标签数据. 自编码就是这样一种形式. 自编码能自动分类数据, 而且也能嵌套在半监督学习的上面, 用少量的有标签样本和大量的无标签样本学习.

这次我们还用 MNIST 手写数字数据来压缩再解压图片.

然后用压缩的特征进行非监督分类.

训练数据

自编码只用训练集就好了, 而且只需要训练 training data 的 image, 不用训练 labels.

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.utils.data as Data
import torchvision

# 超参数
EPOCH = 10
BATCH_SIZE = 64
LR = 0.005
DOWNLOAD_MNIST = True   # 下过数据的话, 就可以设置成 False
N_TEST_IMG = 5          # 到时候显示 5张图片看效果, 如上图一

# Mnist digits dataset
train_data = torchvision.datasets.MNIST(
    root=\'./mnist/\',
    train=True,                                     # this is training data
    transform=torchvision.transforms.ToTensor(),    # Converts a PIL.Image or numpy.ndarray to
                                                    # torch.FloatTensor of shape (C x H x W) and normalize in the range [0.0, 1.0]
    download=DOWNLOAD_MNIST,                        # download it if you don\'t have it
)

这就是一张我们要训练的手写数字 4.

AutoEncoder

AutoEncoder 形式很简单, 分别是 encoder  和 decoder , 压缩和解压, 压缩后得到压缩的特征值, 再从压缩的特征值解压成原图片.

class AutoEncoder(nn.Module):
    def __init__(self):
        super(AutoEncoder, self).__init__()

        # 压缩
        self.encoder = nn.Sequential(
            nn.Linear(28*28, 128),
            nn.Tanh(),
            nn.Linear(128, 64),
            nn.Tanh(),
            nn.Linear(64, 12),
            nn.Tanh(),
            nn.Linear(12, 3),   # 压缩成3个特征, 进行 3D 图像可视化
        )
        # 解压
        self.decoder = nn.Sequential(
            nn.Linear(3, 12),
            nn.Tanh(),
            nn.Linear(12, 64),
            nn.Tanh(),
            nn.Linear(64, 128),
            nn.Tanh(),
            nn.Linear(128, 28*28),
            nn.Sigmoid(),       # 激励函数让输出值在 (0, 1)
        )

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

autoencoder = AutoEncoder()

训练

训练, 并可视化训练的过程. 我们可以有效的利用 encoder 和 decoder 来做很多事, 比如这里我们用 decoder 的信息输出看和原图片的对比, 还能用 encoder 来看经过压缩后, 神经网络对原图片的理解. encoder 能将不同图片数据大概的分离开来. 这样就是一个无监督学习的过程.

optimizer = torch.optim.Adam(autoencoder.parameters(), lr=LR)
loss_func = nn.MSELoss()

for epoch in range(EPOCH):
    for step, (x, y) in enumerate(train_loader):
        b_x = Variable(x.view(-1, 28*28))   # batch x, shape (batch, 28*28)
        b_y = Variable(x.view(-1, 28*28))   # batch y, shape (batch, 28*28)
        b_label = Variable(y)               # batch label

        encoded, decoded = autoencoder(b_x)

        loss = loss_func(decoded, b_y)      # mean square error
        optimizer.zero_grad()               # clear gradients for this training step
        loss.backward()                     # backpropagation, compute gradients
        optimizer.step()                    # apply gradients

画3D图

3D 的可视化图挺有趣的, 还能挪动观看, 更加直观, 好理解.

# 要观看的数据
view_data = Variable(train_data.train_data[:200].view(-1, 28*28).type(torch.FloatTensor)/255.)
encoded_data, _ = autoencoder(view_data)    # 提取压缩的特征值
fig = plt.figure(2)
ax = Axes3D(fig)    # 3D 图
# x, y, z 的数据值
X = encoded_data.data[:, 0].numpy()
Y = encoded_data.data[:, 1].numpy()
Z = encoded_data.data[:, 2].numpy()
values = train_data.train_labels[:200].numpy()  # 标签值
for x, y, z, s in zip(X, Y, Z, values):
    c = cm.rainbow(int(255*s/9))    # 上色
    ax.text(x, y, z, s, backgroundcolor=c)  # 标位子
ax.set_xlim(X.min(), X.max())
ax.set_ylim(Y.min(), Y.max())
ax.set_zlim(Z.min(), Z.max())
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AutoEncoder (自编码/非监督学习) 的相关文章

随机推荐

  • PMSM学习笔记1——永磁同步电机的工作原理与数学模型

    文章目录 一 PMSM工作原理 1 同步电机工作原理 来源 电机学 李发海 2 永磁同步电机数学模型及坐标变换 来源 现代电机控制技术 王成元 2 1旋转磁场 2 2三相PMSM的基本数学模型 2 3三相PMSM的坐标变换 2 3 1 Cl
  • 【Unity 3D】学习笔记 - 粒子系统制作

    这次的任务是制作一个简单的粒子系统 并用代码控制使之在不同的场景下呈现出不同的效果 我想要制作出颜色渐变的烟花效果 关于粒子系统 可以参考 Unity 3D 学习笔记 粒子系统初探 粒子系统基本设置如下 其中Simulation Rotat
  • 学生用计算机怎么恢复出厂设置,电脑怎么恢复出厂设置

    关机或重启时 按住电脑键盘的 Del 键进入BIOS 使用Enter回车键选中 Load Optimized Defaults 选项 使用方向键选中 Y 确认 点击 Save Exit Step 或者按 F10 退出即可 以下是详细介绍 电
  • Go语言实现Onvif客户端:2、获取设备信息

    Go语言实现Onvif客户端 2 获取设备信息 文章目录 Go语言实现Onvif客户端 2 获取设备信息 1 思路 2 代码 1 思路 搜索设备 获取设备能力 通过设备能力的设备接口读取设备信息 我们上节说了 主要是通过设备信息中的内容来区
  • 线性代数 【基础1】

    文章目录 行列式 方阵的行列式公式 矩阵 矩阵的逆 矩阵的秩 伴随矩阵 初等变换与初等矩阵 分块矩阵 向量 正交矩阵 正交化 线性表示 线性无关与线性相关 极大无关组与向量组的秩 线性方程组 解的性质与判定 齐次线性方程组 非齐次线性方程组
  • 大型网站在架构上应当考虑哪些问题?

    分层 分层是处理任何复杂系统最常见的手段之一 将系统横向切分成若干个层面 每个层面只承担单一的职责 然后通过下层为上层提供的基础设施和服务以及上层对下层的调用来形成一个完整的复杂的系统 计算机网络的开放系统互联参考模型 OSI RM 和In
  • Java8 CompletableFuture处理多个异步任务

    CompletableFuture Java5引入了Future和 FutureTask 用于异步处理 Future可以通过get 方法获取异步的返回值 在Java8引入了CompletableFuture CompletableFutur
  • 设置GPU及显存大小

    20210128 引言 之前搜索过设置GPU和显存大小的方式 但是升级了新的版本的keras以及tensorflow 导致之前的代码失效了 这里记录一下 本质上 就是版本更换的原因 很多api可能被取消 或者改了别的 原始代码 import
  • 计算机网络ip尽最大努力交付,计算机网络知识(IP、TCP、UDP)--持续更新

    互联网的两个重要的基本特点 连通性和共享 计算机网络由若干结点和连接这些结点的链路组成 互联网的组成 边缘部分 核心部分 网络边缘的端系统之间的通信可分为两大类 客户 服务器方式 C S方式 和对等方式 P2P方式 互联网的核心部分 许多网
  • 原始传奇手游服务器不显示,原始传奇手游为什么进不去 无法登录游戏解决方法...

    近日有一款由古力娜扎代言的手游 原始传奇 上线了 不少玩家也很想体验一番 可是却发现原始传奇手游进不去 不知道是为什么 下面悠小悠就为大家详细介绍下无法登录游戏的原因和解决方法 一起探讨下吧 原始传奇手游进不去原因及解决方法 1 如果是登录
  • tomcat没有日志输出--解决办法

    程序没有问题 只是控制台信息卡 感觉像程序休眠了一样 然后在控制台点backspace或是enter 程序恢复正常 控制台日志正常输出 静态文件访问可以 解决办法 转载于 https blog 51cto com 13693838 2398
  • BIND9的架构与机制笔记1

    BIND9采用的是事件驱动的机制来工作 而事件的源头则是IO IO在linux使用的EPOLL的边缘触发模式 本篇说的是epoll BIND9如果创建了watcher线程 宏USE WATCHER THREAD控制 这里就讨论有线程的情况
  • Redis第五讲 Redis内存淘汰策略之LRU与LFU算法详细介绍

    前面介绍了Redis的一些内存淘汰策略 一般比较常用的两种淘汰策略为LRU LFU 而且他们的算法考察的也比较多 LRU 最近最久未使用 标准LRU算法是这样的 它把数据存放在链表中按照 最近访问 的顺序排列 当某个key被访问时就将此ke
  • 机器学习——无监督学习

    机器学习的分类 一般分为下面几种类别 监督学习 supervised Learning 无监督学习 Unsupervised Learning 强化学习 Reinforcement Learning 增强学习 半监督学习 Semi supe
  • Vue 中实现 excel文件上传功能

    Duang 最近搭建了一个自己的博客小破站 欢迎各位小伙伴来访吖 ares coder blog portalhttps www ares stack cn blog service game 场景 上传excel表 并将excel表中的数
  • Django实现前后端分离开发

    前后端分离开发 在传统的Web应用开发中 大多数的程序员会将浏览器作为前后端的分界线 将浏览器中为用户进行页面展示的部分称之为前端 而将运行在服务器 为前端提供业务逻辑和数据准备的所有代码统称为后端 所谓前后端分离的开发 就是前后端工程师约
  • Hadoop 之上的数据建模 - Data Vault 2.0

    对比传统的基于 RDBMS 之上的数据仓库和商业智能项目 尝试着说说 Hadoop 之上的数据仓库 从ETL 数据存储 到分析展现 重点围绕数据建模方面做分析 因为这是本文的重点 介绍一份新的数据建模方式 Data Vault 2 0 ET
  • HTML框架构建

    HTML框架构建 1 划分框架 A 使用标签决定如何划分框架 必须要有标签设定每个小窗口的网页 该标签中有src属性为每个URL值指定一个HTML文件 这个文件必须事先做好 B 标签常用的属性 属性 描述 cols 用 像素数 或 分个左右
  • Android-PullToRefresh下拉刷新库基本用法

    PullToRefresh是一套实现非常好的下拉刷新库 它支持 ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager 等
  • AutoEncoder (自编码/非监督学习)

    神经网络也能进行非监督学习 只需要训练数据 不需要标签数据 自编码就是这样一种形式 自编码能自动分类数据 而且也能嵌套在半监督学习的上面 用少量的有标签样本和大量的无标签样本学习 这次我们还用 MNIST 手写数字数据来压缩再解压图片 然后