深度学习——自编码器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pony1001/article/details/89840812

无监督学习(Unsupervised learning)是机器学习的一种方法,是指从无标签的数据中学习出一些有用的信息或模式。

应用广泛:现实世界中的数据都是无标签的

目的:将纷繁复杂的数据归类,进而分类管理

典型应用:电商、银行等行业对不同类型客户定向营销

 

无监督特征学习(Unsupervised Feature Learning)是从无标签的数据中挖掘有效地特征或表示,从而帮助后继的机器学习模型(比如聚类、数据可视化等)更快速地达到更好的性能。

深度学习中最经典最重要的无监督特征学习方式:自编码器(Autoencoder)

自编码器的目的是对一组数据学习出一种表示(也称表征,编码),并且希望这组表示可以重构出原来的样本。(输出数据和输入数据尽量一致,如下图所示。压缩表示即为输出)

无监督学习:聚类(Clustering)是将数据集划分为若干相似对象组成的多个组(group)或簇(cluster)的过程,使得同一组中对象间的相似度最大化,不同组中对象间的相似度最小化。

import torch.nn as nn
class AutoEncoder(nn.Module):
    '''
    Inputs :in_dim,h_dim
    '''
    def __init(self,in_dim=256,h_dim=128):
        super(AutoEncoder,self).__init__()
        # encoder : input ----------->map(1)---->hidden layer
        self.encoder = nn.Sequential(
            nn.Linear(in_dim,h_dim),
            nn.LeakyReLU()
        )
        # decoder: hidden ----->output
        self.decoder = nn.Sequential(
            # output and input share the same dim
            nn.Linear(h_dim,in_dim)

        )

    def forward(self,X):
        # RETURN : embedding,output
        embedding = self.encoder(X)
        out = self.decoder(embedding)
        return embedding,out

过拟合问题,机器学习在训练的过程中,总是有过拟合的风险。
Dropout是解决过拟合问题的有效方法。在每次forward传递时,随机的将一定比例的神经元置零。常见的比例是0.5。

import torch.nn as nn
import torch.nn.functional as F
class AutoEncoder(nn.Module):
    '''
    Inputs :in_dim,h_dim
    '''
    def __init__(self,in_dim=256,h_dim=128,dropout=0.5):
        super(AutoEncoder,self).__init__()
        # encoder : input ----------->map(1)---->hidden layer
        self.encoder = nn.Sequential(
            nn.Linear(in_dim,h_dim),
            nn.LeakyReLU()
        )
        # decoder: hidden ----->output
        self.decoder = nn.Sequential(
            # output and input share the same dim
            nn.Linear(h_dim,in_dim)

        )
        self.dropout = dropout    #1. 初始化dropout

    def forward(self,X):
        # RETURN : embedding,output
        embedding = self.encoder(X)
        embedding = F.dropout(embedding, p=self.dropout, training=self.training) #2设置dropout
        out = self.decoder(embedding)
        return embedding,out
    

        

 

训练和测试时注意模式切换

# 设置为训练模式,让dropout起作用

self.model.train()

 

#切换回评估模式

self.model.eval()

展开阅读全文

没有更多推荐了,返回首页