6.3 PyTorch实现Auto Encoder模型

欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

  • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
  • 第三章:学习PyTorch如何读入各种外部数据
  • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
  • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
  • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
  • 第七章:利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
  • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

6.2 Auto Enocder模型

自编码器是很经典的模型,分为encoder和decoder两个部分,特征输入encoder后输出编码,这个编码又做为decoder端的输入,经过decoder后做预测。

下面时一个非常简单的自编码器的构建与训练。

import torch
import torch.nn as nn
import torch.nn.functional as F


class AutoEncoderDecoder(nn.Module):
    def __init__(self, dim_in, dim_out=128, dropout=0.2):
        """模型结构"""
        super(AutoEncoderDecoder, self).__init__()

        self.encoder = nn.Sequential(
            nn.Linear(dim_in, dim_out),
            nn.LeakyReLU()
        )

        self.decoder = nn.Sequential(
            nn.Linear(dim_out, dim_in)
        )

        self.dropout = dropout

    def forward(self, x):
        e = self.encoder(x)
        e = F.dropout(e, self.dropout)   # 可以增加dropout, 也可以去掉,将一定比例的数据设置为0
        d = self.decoder(e)

        return e, d


class TrainAE():
    def __init__(self, epoch=5):
        """训练,将X输入encoder->decoder,最小化输出与输入的损失,及让自己生成自己"""
        self.epoch = epoch

    def train(self, X):
        # 创建模型
        N, dim_in = X.shape()
        model = AutoEncoderDecoder(dim_in)

        # 优化器
        optim = torch.optim.Adam(model.parameters(), lr=0.0001)

        # 损失
        loss_f = torch.nn.MSELoss()

        for e in range(self.epoch):
            optim.zero_grad()

            embedding, Y_pred = model(X)
            loss = loss_f(Y_pred, X)

            loss.backward()

            optim.step()

        embedding, Y_pred = model(X)
        return embedding.data.numpy()
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页