2_从MLP到AE

本文介绍了如何使用PyTorch构建一个简单的自动编码器,应用于MNIST数据集,通过神经网络的编码解码过程提取和学习图片特征。通过visdom展示训练过程和重构结果。解决visdom连接问题的步骤也详细说明。
摘要由CSDN通过智能技术生成


学习了MLP的构建后进入到AE(AutoEncoder,自动编码器)的学习,
本文的代码来着 sherry大佬,做了一些改动,比如把两个文件合为一个,还有其他一些细节的改动还有我作为一个小白的注释等。

最简单的AutoEncoder不过是一个拥有瓶颈层(bottleneck layer)的MLP 【1】 ,所以在神经网络的结构上只需要做出一点改动即可。其功能是通过将输入信息作为学习目标,对输入信息进行表征学习(representation learning)。

程序通过encoder将mnist数据中的部分图片(高维输入图片x)由高维降维为低维,从而实现图片数据特征的提取;之后通过decoder将低维信息还原为高维信息(高维输出图片y),通过x与y之间的差异进行损失函数的评估,从而去优化神经网络中的参数,进而优化我们所需的特征数据。

一、python代码(基于pytorch)
import torch
import torch.nn as nn
import torch.nn.functional as F
import visdom
from torchvision import datasets,transforms
from torch.utils.data import DataLoader


# 创建模型
class AE_Net(nn.Module):
    def __init__(self):
        super(AE_Net,self).__init__()
        self.encoder1=nn.Linear(784,256)
        self.encoder2=nn.Linear(256,64)
        self.encoder3=nn.Linear(64,20)

        self.decoder1=nn.Linear(20,64)
        self.decoder2=nn.Linear(64,256)
        self.decoder3=nn.Linear(256,784)


    def forward(self,x):

        x=x.flatten(1)    # 展开为1维
        x = F.relu(self.encoder1(x))
        x = F.relu(self.encoder2(x))
        x = F.relu(self.encoder3(x))
        x = F.relu(self.decoder1(x))
        x = F.relu(self.decoder2(x))
        x = torch.sigmoid(self.decoder3(x))
        x=x.view(-1,1,28,28)  # 相当于reshape

        return x


# 数据在输入神经网咯前的预处理吧
mnist_train = datasets.MNIST('data/',train=True,download=True,transform=transforms.Compose([transforms.ToTensor()]))
mnist_test = datasets.MNIST('data/',train=False,download=True,transform=transforms.Compose([transforms.ToTensor()]))

train_loader=DataLoader(mnist_train,batch_size=32,shuffle=True)  # 一次性输入32张图片给网络进行训练和shuffle=True用于打乱数据集
test_loader=DataLoader(mnist_test,batch_size=32,shuffle=False)

x,y=iter(train_loader).next()   # 生成迭代器,并返回迭代器的下一个项目
print(x.shape)

# 神经网络的三大法宝:
net=AE_Net()  # 模型
optimizer=torch.optim.Adam(net.parameters(),lr=1e-3)  # 优化
loss=nn.MSELoss()  # 损失

# vis=visdom.Visdom()  # 定义一个visdom
vis = visdom.Visdom(env=u'withstand')

# 多次训练
for epoch in range(10):   # 这个训练过程很久,所以训练次数暂时定为10次
    for batch_idx,(x,y) in enumerate(train_loader):
        x_hat=net(x)
        los=loss(x_hat,x)
        optimizer.zero_grad()  # 三大固定步骤  优化阶梯归零
        los.backward()   # 后向传递
        optimizer.step()  # 更新参数

    print(epoch,'loss:',los.item())
    x,y=iter(test_loader).next()
    with torch.no_grad():    # 强制之后的内容不进行图构建
        x_hat=net(x)
    vis.images(x,nrow=8,win='x-ae',opts=dict(title='x'))
    vis.images(x_hat,nrow=8,win='x_hat',opts=dict(title='x_hat'))
二、程序运行结果

在这里插入图片描述
打开网页http://localhost:8097,输入环境名,即可得到运行结果
在这里插入图片描述
在这里插入图片描述

三、总结

深度神经网络的代码框架可以归纳如下:
1、class net 建模
(1)结构定义
(2)forward函数,正向传播函数
2、训练
(1)对训练数据集的引入以及初始化
(2)建完三大法宝:模型,优化,损失
(3)进入多次训练循环:调用网络;计算损失函数;三个固定语句
(4)对结果进行print或者plt展示
(5)test测试

四、关于运行visdom[WinError10061]问题的解决

出现问题,一旦使用visdom就显示出 ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接 然后显示不出结果

打开【Anaconda Prompt】

第一步,激活环境,键入:

activate (环境名)

第二步,启动visdom的服务器,键入:

python -m visdom.server

等一小会就会出现以下信息,
在这里插入图片描述

接着打开他给的网页,运行程序,就可以显示了,
在这里插入图片描述

但是在跑代码之前都必须按这个步骤打开visdom server才不会出错。

五、注释

【1】Wang H, Yeung D Y. Towards Bayesian deep learning: A framework and some existing methods[J]. IEEE Transactions on Knowledge and Data Engineering, 2016, 28(12): 3395-3408.
这话来着这篇文章,原文:In its simplest form, an autoencoder is no more than a multilayer perceptron with a bottleneck layer (a layer with a small number of hidden units) in the middle.
译文:在其最简单的形式中,一个自动编码器不过是一个多层感知器,在中间有一个瓶颈层(一个具有少量隐藏单元的层)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值