2_从MLP到AE_mlp ae-程序员宅基地

技术标签: 深度学习  pytorch  神经网络  # 实习项目  


学习了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.
译文:在其最简单的形式中,一个自动编码器不过是一个多层感知器,在中间有一个瓶颈层(一个具有少量隐藏单元的层)。

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

智能推荐

Onenet mqtt数据通信整理_topic=“$creq/(deviceid)/+”-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏22次。Onenet mqtt数据通信整理(wangxl@20200707)创建产品1、选多协议接入--mqtt(旧版)---添加产品创建设备设备列表--添加设备添加数据流模板power设备端连接1、建立mqtt连接(OneNET平台地址为183.230.40.39:6002)2、设备登陆上报信息(:CONNECT类型的数据包)设备登陆报文是在建立TCP连接之后,用于告知OneNET平台,该终端DTU对应的是平台上的哪一个设备,数..._topic=“$creq/(deviceid)/+”

Windows编程学习笔记04-Windows编程字符集_windows字符集-程序员宅基地

文章浏览阅读1.1k次。总的来讲,由于历史和发展的原因,产生了 Unicode 和 多字节字符集(MBCS、DBCS、ANSI)。在早期,使用Unicode占用内存多,使用多字节字符集又无法国际化。所以使用 WindowsAPI 以及C\C++ 进行Windows编程时有两种字符集,如一些WindowsAPI都会存在两个版本(比如`MessageBoxA`和`MessageBoxW`),C\C++语言有`char`和`wchar_t`两种字符类型。学习Windows编程,了解Unicode和 多字节字符集之间的区别是必不可少的。_windows字符集

使用JDK工具keytool生成RSA密钥库密钥_jdk1.8 生成秘钥-程序员宅基地

文章浏览阅读1.8k次。【使用JDK生成证书密钥 - 私钥和公钥】参考:https://www.cnblogs.com/dingshuanglei/p/10237710.htmlJWT令牌生成采用非对称加密算法1、生成密钥证书下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥keytool -genkeypair -alias xckey -keyalg RSA -keypass xuecheng -keystore xc.keystore -storepass xuechengkeystoreKe._jdk1.8 生成秘钥

活久见的重构 - iOS 10 UserNotifications 框架解析_unusernotificationcenter.current().removedelivered-程序员宅基地

文章浏览阅读441次。TL;DRiOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能。在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大。对于开发者来说,相较于之前版本,iOS 1_unusernotificationcenter.current().removedeliverednotifications(withidentifi

创建 SwiftUI 项目的 Dock 栏_xcode15创建swiftui项目-程序员宅基地

文章浏览阅读58次。打开 Xcode,选择 “Create a new Xcode project”,然后选择 “App” 模板,并选择 “SwiftUI” 作为用户界面。在这个示例中,我们创建了三个标签项(tab item),分别代表 “Home”、“Favorites” 和 “Settings”。来创建一个类似于 Dock 栏的界面,用于导航不同的视图。下面是一个详细的教程,展示如何使用 SwiftUI 创建一个简单的 Dock 栏。进一步的修改可以包括更改标签项的图标和文本,以及将每个标签项与自己的视图关联起来。_xcode15创建swiftui项目

vue结合CSS3实现超炫3D翻书效果(一)_vue+css实现好看的图册-程序员宅基地

文章浏览阅读5.3k次,点赞8次,收藏20次。效果预览基础知识储备-transform:CSS3新增的变形功能,其优点是全过程不改变DOM性能更高。在transform下有如下几个变形样式:1).translate() — 位置改变(平移)2).scale() — 缩放比例3)rotate() — 旋转角度4)skew() — 倾斜(斜切)以上的几个形式都支持X轴、Y轴、Z轴的变换方向。但需要注意..._vue+css实现好看的图册

随便推点

随机走步问题_随机行走问题-程序员宅基地

文章浏览阅读385次,点赞11次,收藏14次。以下在x-y坐标系上进行的游戏属于二维的随机行走。从原点(0,0)开始,每次迭代都是由向左、向上、向右和向下一个单位的随机步构成。当行走者返回原始点时,行走结束。在二维世界这种情况发生的概率为1,而在三维世界概率小于1。请编写一个进行100次独立随机行走程序,并计算每个方向的步数的平均数。_随机行走问题

【网站项目】智能停车场管理系统小程序-程序员宅基地

文章浏览阅读823次,点赞24次,收藏8次。本智能停车场管理系统以ssm作为框架,b/s模式以及MySql作为后台运行的数据库,同时使用Tomcat用为系统的服务器。本系统主要包括首页、个人中心、用户管理、车位信息管理、车位预

VSCode + PlatformIO + STM32/ESP32 ARDUINO_esp32 platformio-程序员宅基地

文章浏览阅读9.2k次,点赞14次,收藏88次。一.添加PlatformIO二.两种方式建立PlatformIO工程1.新建工程二,导入arduino工程可以将一些在arduino IDE中写的工程直接无缝导入VSCODE需要注意的是在导入时可能出现明明文件夹中有arduino的ino文件,却提示无法导入的情况 ,有可能是文件夹名字和ino名字不相同导致的,改为相同的就可以导入了............_esp32 platformio

Python Error fix-TypeError: _mean() got an unexpected keyword argument ‘dim‘_macd() got an unexpected keyword argument 'sigalpe-程序员宅基地

文章浏览阅读7.8k次,点赞4次,收藏11次。文章目录TypeError: _mean() got an unexpected keyword argument 'dim'报错解决【numpy中用axis和pytorch中用dim,因为一个是numpy变量一个是tensor变量】附:numpy中的axis和Pytorch中的dim参数TypeError: _mean() got an unexpected keyword argument 'dim’报错解决【numpy中用axis和pytorch中用dim,因为一个是numpy变量一个是tensor_macd() got an unexpected keyword argument 'sigalperiod

IBM DS3524磁盘阵列修改管理口IP地址-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏2次。1.DS3524双控制器有四个网口,背面看依次从左到右分别为网口1到网口4。其中默认的IP地址如下:网口1:192.168.128.101网口2:192.168.129.101网口3:192.168.128.102网口4:192.168.129.102 2.如果需要从网口1连接到DS3524上,首先将管理机的IP设置与网口1同一网段的,如192.168.128.100/24

oppo广告投放的成本介绍!oppo广告投放效果怎么样啊?_oppo应用市场投放成本-程序员宅基地

文章浏览阅读249次。男科保健品在哪些平台推广效果比较好啊,成本怎么样?接下来给大家介绍一些男科(nk)保健品跑的比较好的一些平台,一般跑得比较好的有:vivo广告推广平台、oppo广告推广平台、凤凰网广告推广平台、东方头条广告推广平台。这几个平台都是目前跑的比较好的一些平台哦!但是在以上平台当中跑的最好的还得说是oppo广告推广平台哦!目前nk保健品可以跑的形式还是有很多的,比如:表单、加粉、到付、免领。目前来说跑免领的客户是最多的,因为比起加粉和表单来说,跑到付更方便更快捷。oppo广告投放的成本介绍!oppo广告_oppo应用市场投放成本

推荐文章

热门文章

相关标签