自编码器模型

简介: 自编码器模型

自编码神经网络是一种无监督学习算法,目标是让输出值与输入值尽可能相似


1.网络结构


简单的自编码器模型是一种三层神经网络模型,包含了输入层、隐藏层、输出重构层。

在实际中,我们往往设计成两层模型


  • 编码层
  • 解码层


编码层负责将数据读取,并且进行一系列线性变换,把输入样本压缩到隐藏层中。

解码层需要将复杂的网络结构进行还原,尽可能地把还原后的值与输入值做到相似


image.png

image.png

2.功能


自编码神经网络,目标是实现输出的结果和输入的结果尽可能相似,并且有很重要的一个步骤就是将输入的数据进行了“压缩”,也就是把输入的特征映射到隐藏层,而隐藏层其实样本的维度是大大小于输入样本的维度的,这就是自编码器的第一个功能实现特征降维:    它总会学习到最主要的特征,从而为后续的解码操作做好铺垫,所以我们在编码层之后就可以得到输入数据的主要特征向量


第二个功能就是它的设计初衷,实现近似输出。模型学会了编码和解码之后,我们可以先进行编码,得到输入的主要特征,然后再进行解码得到一个近似于原始输入的输出。那我们也可以自己设置一些编码后的特征,然后使用解码器进行解码,可以得到一些“令人惊喜”的输出。讲到这里,其实就跟后面的生成对抗网络可以联系起来,当我们训练好一个GAN的时候,我们可以利用生成模型将输入的随机噪音生成图片;而特别是在styleGAN中,我们输入潜在因子,通过映射网络得到中间潜在空间,并且由于映射网络和AdaIN,我们甚至可以不用在意初始输入,只需要在卷积、AdaIN之前添加一些随机噪音就可以控制生成图片的特征。

image.png


3.代码部分


这次demo代码是基于pytorch写的,以后用空补上tensorflow版本的


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn,optim
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import datasets,transforms
from torchvision.utils import save_image
import seaborn as sns
import os
import warnings 
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
warnings.filterwarnings('ignore')
%matplotlib inline
复制代码
# 设置参数
batch_size = 100
learning_rate=1e-2
num_epoches=3
# 导入数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=1, shuffle=False)
复制代码
# 定义网络
class autoencoder(nn.Module):
    def __init__(self):
        super().__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),
        )
        # 解码器
        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(),
        )
    def forward(self, x):
        encode = self.encoder(x)
        decode = self.decoder(encode)
        return encode, decode
复制代码
# 实例化
net = autoencoder().cuda()
# 损失函数以及优化函数
loss_func = nn.MSELoss().cuda()
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
# 训练过程可视化   
def list_img(i, img, title):
    img = img.reshape(28, 28)
    plt.subplot(2, 5, i+1)
    plt.imshow(img)
    plt.title('%s' % (title))
def generate_test(inputs, title=''):
    plt.figure(figsize=(15, 6))
    for i in range(len(inputs)):
        img = inputs[i].view(-1, 28*28).cuda()
        hidden, outputs = net(img)
        list_img(i, outputs.cpu().detach().numpy(), title)
    plt.show()
复制代码
# 训练部分
result = []
test_inputs = []
hiddens=[]
plt.figure(figsize=(15, 6))
for i, (img, _) in enumerate(test_loader):
    if i > 4 : break
    test_inputs.append(img)
    list_img(i, img.numpy(), 'truth')
plt.show()
for e in range(num_epoches):
    for i, (inputs, _) in enumerate(train_loader):
        inputs = inputs.view(-1, 28*28).cuda()
        optimizer.zero_grad() 
        hidden, outputs = net(inputs)
        hiddens.append(hidden)
        loss = loss_func(outputs, inputs)
        loss.backward()
        optimizer.step()
        if i % 100 == 0:
            result.append(float(loss))
        if i % 500 == 0:
            generate_test(test_inputs, 'generation')
复制代码


image.png

image.png


到最后可以看出模型训练生成的图片以及和输入的真实图片十分接近了


image.png


误差也只有0.03


from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
# 可视化结果
view_data = Variable((train_dataset.train_data[:500].type(torch.FloatTensor).view(-1, 28*28) / 255. - 0.5) / 0.5).cuda()
encode, _ = net(view_data)    # 提取压缩的特征值
fig = plt.figure(2)
ax = Axes3D(fig)    # 3D 图
# x, y, z 的数据值
X = encode.data[:, 0].cpu().numpy()
Y = encode.data[:, 1].cpu().numpy()
Z = encode.data[:, 2].cpu().numpy()
values = train_dataset.train_labels[:500].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()
复制代码


在三维空间中,各个数字的分布如下


image.png

最后,根据图上的位置,自己写一些随机的输入特征给解码器,看它能否得到我们想要的图像


# 看图上4的位置大概在0附近,-0.5附近,-0.5-0之间
code = Variable(torch.FloatTensor([[0.02,-0.543,-0.012]])).cuda()
decode = net.decoder(code)
decode_img = decode.data.reshape(28,28).cpu().numpy() * 255
plt.imshow(decode_img.astype('uint8')) # 生成图片
plt.show()
复制代码


image.png


我自己随机设置的输入已经很好的满足了我的预期,如果我设置一些图上没有的数据呢,会怎样?


image.png

结果生成了一个问号,挺有意思的

目录
相关文章
|
2月前
|
异构计算 Python
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
279 1
|
11月前
|
机器学习/深度学习 算法 TensorFlow
深度学习中的自编码器:从理论到实践
在这篇文章中,我们将深入探讨深度学习的一个重要分支——自编码器。自编码器是一种无监督学习算法,它可以学习数据的有效表示。我们将首先介绍自编码器的基本概念和工作原理,然后通过一个简单的Python代码示例来展示如何实现一个基本的自编码器。最后,我们将讨论自编码器的一些变体,如稀疏自编码器和降噪自编码器,以及它们在实际应用中的优势。
|
6月前
|
人工智能 安全 Go
Go语言中 Mutex 的实现原理
本文深入解析了 Go 中 `sync.Mutex` 的实现原理及其工作机制。`Mutex`(互斥锁)是并发编程中的基础同步机制,用于保护共享资源不被多个 Goroutine 同时访问。Go 的 `sync.Mutex` 通过轻量级的结构体实现,包含 `state` 和 `sema` 两个字段,分别用于表示锁状态和管理 Goroutine 的阻塞与唤醒。 文章详细分析了锁的获取(`Lock()`)和释放(`Unlock()`)过程,包括快速路径和慢速路径的实现逻辑。在慢速路径中,介绍了自旋锁优化、饥饿模式以及信号量机制的应用,确保高效且公平地管理锁竞争。
146 6
|
7月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
348 14
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】BERT模型:揭秘LLM主要类别架构(上)
【AI大模型】BERT模型:揭秘LLM主要类别架构(上)
1126 1
|
机器学习/深度学习 生物认证 语音技术
声纹识别入门:原理与基础知识
【10月更文挑战第16天】声纹识别(Voice Biometrics)是生物特征识别技术的一种,它通过分析个人的语音特征来验证身份。与指纹识别或面部识别相比,声纹识别具有非接触性、易于远程操作等特点,因此在电话银行、客户服务、智能家居等领域得到了广泛应用。
2424 0
|
机器学习/深度学习 存储 自然语言处理
【机器学习】LoRA:大语言模型中低秩自适应分析
【机器学习】LoRA:大语言模型中低秩自适应分析
640 5
|
存储 小程序 云计算
云计算概念与架构设计介绍
云计算概念与架构设计介绍
|
机器学习/深度学习 数据可视化 PyTorch
使用Python实现深度学习模型:自动编码器(Autoencoder)
使用Python实现深度学习模型:自动编码器(Autoencoder)
755 0