最简单的AutoEncoder不过是一个拥有瓶颈层(bottleneck layer)的MLP 【1】 ,所以在神经网络的结构上只需要做出一点改动即可。其功能是通过将输入信息作为学习目标,对输入信息进行表征学习(representation learning)。
程序通过encoder将mnist数据中的部分图片(高维输入图片x)由高维降维为低维,从而实现图片数据特征的提取;之后通过decoder将低维信息还原为高维信息(高维输出图片y),通过x与y之间的差异进行损失函数的评估,从而去优化神经网络中的参数,进而优化我们所需的特征数据。
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就显示出 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.
译文:在其最简单的形式中,一个自动编码器不过是一个多层感知器,在中间有一个瓶颈层(一个具有少量隐藏单元的层)。