自编码器模型

简介: 自编码器模型

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


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

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

目录
相关文章
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
深度探索变分自编码器在无监督特征学习中的应用
【4月更文挑战第20天】 在深度学习领域,无监督学习一直是研究的热点问题之一。本文聚焦于一种前沿的生成模型——变分自编码器(Variational Autoencoder, VAE),探讨其在无监督特征学习中的关键作用与应用潜力。不同于传统的摘要形式,本文将直接深入VAE的核心机制,分析其如何通过引入随机隐变量和重参数化技巧,实现对复杂数据分布的有效建模。文章还将展示VAE在多个实际数据集上的应用结果,验证其作为无监督特征提取工具的有效性和普适性。通过理论与实践的结合,本文旨在为读者提供关于VAE在无监督特征学习领域的全面认识。
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
Transformer:Attention机制、前馈神经网络、编码器与解码器
Transformer:Attention机制、前馈神经网络、编码器与解码器
278 1
|
7月前
|
机器学习/深度学习 编解码
LeViT-UNet:transformer 编码器和CNN解码器的有效整合
LeViT-UNet:transformer 编码器和CNN解码器的有效整合
184 0
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
128 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
2月前
|
机器学习/深度学习 自然语言处理 并行计算
Transformer模型
【10月更文挑战第3天】
95 0
|
5月前
|
机器学习/深度学习 自然语言处理
预训练语义模型作为特征提取器的方法
预训练语义模型作为特征提取器的方法
|
机器学习/深度学习
自动编码器(Autoencoder
自动编码器(Autoencoder)是一种无监督式学习模型,旨在通过降低数据维度来提高机器学习模型的性能。它由编码器(Encoder)和解码器(Decoder)两个主要部分组成。编码器的作用是将输入数据压缩成低维度的隐向量,从而捕获数据的主要特征;解码器的作用是将隐向量还原回原始数据空间。自动编码器可以实现类似 PCA 的数据降维和数据压缩功能。
128 2
|
7月前
|
机器学习/深度学习 运维 算法
自编码器(Autoencoder)在无监督学习和降维中的应用
自编码器(Autoencoder)在无监督学习和降维中的应用
339 0
自编码器(Autoencoder)在无监督学习和降维中的应用
|
机器学习/深度学习 自然语言处理 索引
【Transformer系列(4)】Transformer模型结构超详细解读
【Transformer系列(4)】Transformer模型结构超详细解读
588 0
【Transformer系列(4)】Transformer模型结构超详细解读
|
机器学习/深度学习 自然语言处理 Apache
Transformer 模型实用介绍:BERT
Transformer 模型实用介绍:BERT
231 0

热门文章

最新文章