Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【动手学深度学习笔记】之PyTorch实现多层感知机

【动手学深度学习笔记】之PyTorch实现多层感知机

作者头像
树枝990
发布于 2020-08-19 23:47:31
发布于 2020-08-19 23:47:31
77700
代码可运行
举报
文章被收录于专栏:拇指笔记拇指笔记
运行总次数:0
代码可运行

点击【拇指笔记】,关注我的公众号。


本篇文章全部代码可以在后台回复"MLP_PY"获取。

1.使用PyTorch实现多层感知机

导入需要的库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torchfrom torch import nnimport numpy as npimport syssys.path.append("..")
import torchvisionfrom IPython import displayfrom time import timeimport matplotlib.pyplot as pltimport torchvision.transforms as transformsfrom time import time

1.1 读取数据

这一部分依然使用之前的Fashion-MNIST数据集。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
batch_size = 256
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,transform=transforms.ToTensor())#获取训练集mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,transform=transforms.ToTensor())#获取测试集
#生成迭代器train_iter = torch.utils.data.DataLoader(mnist_train,batch_size=batch_size,shuffle = True,num_workers = 0)
test_iter = torch.utils.data.DataLoader(mnist_test,batch_size = batch_size,shuffle=False,num_workers=0)

1.2 定义模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_inputs ,num_outputs,num_hiddens = 784,10,256
class MLP(nn.module):    def __init__(self,num_inputs,num_outputs,num_hiddens):        super(MLP,self).__init__()        #使用父类的初始化参数        self.mlp = nn.Sequential(        	nn.Linear(num_inputs,num_hiddens)            nn.ReLU()            nn.Linear(num_hiddens,num_outputs)        	)        #定义神经网络里的输入、隐藏和输出层            def forward(self,x):    #定义前向传播    	y = self.mlp(x.view(x.shape[0],-1))        reyurn y        net = MLP(x,num_inputs,num_outputs,num_hiddens)

此时通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(net)

可以看到现在的神经网络层结构如下图

1.3 定义损失函数和优化函数

PyTorch都有内置好的,两行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
loss = torch.nn.CrossEntropyLoss()#损失函数optimizer = torch.optim.SGD(net.paramters(),lr=0.5)#优化函数

1.4 计算分类准确率

首先我们需要得到预测的结果。

从一组预测概率(变量y_hat)中找出最大的概率对应的索引(索引即代表了类别)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#argmax(f(x))函数,对f(x)求最大值所对应的点x。我们令f(x)= dim=1,即可实现求所有行上的最大值对应的索引。A = y_hat.argmax(dim=1)	#最终输出结果为一个行数与y_hat相同的列向量

然后我们需要将得到的最大概率对应的类别与真实类别(y)比较,判断预测是否是正确的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
B = (y_hat.argmax(dim=1)==y).float()#由于y_hat.argmax(dim=1)==y得到的是ByteTensor型数据,所以我们通过.float()将其转换为浮点型Tensor()

最后我们需要计算分类准确率

我们知道y_hat的行数就对应着样本总数,所以,对B求平均值得到的就是分类准确率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(y_hat.argmax(dim=1)==y).float().mean()

上一步最终得到的数据为tensor(x)的形式,为了得到最终的pytorch number,需要对其进行下一步操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(y_hat.argmax(dim=1)==y).float().mean().item()#pytorch number的获取统一通过.item()实现

整理一下,得到计算分类准确率函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def accuracy(y_hat,y):    return (y_hat.argmax(dim=1).float().mean().item())

作为推广,该函数还可以评价模型net在数据集data_iter上的准确率。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def net_accurary(data_iter,net):    right_sum,n = 0.0,0    for X,y in data_iter:    #从迭代器data_iter中获取X和y        right_sum += (net(X).argmax(dim=1)==y).float().sum().item()        #计算准确判断的数量        n +=y.shape[0]        #通过shape[0]获取y的零维度(列)的元素数量    return right_sum/n

1.5 训练模型

在训练模型时,迭代周期数num_epochs、隐藏层神经单元数num_hiddens和学习率lr都是可以调节的超参数,通过调节超参数的值可以获得分类更准确的模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num_epochs = 5
def train_MLP(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer,net_accurary):    for epoch in range(num_epochs):        #损失值、正确数量、总数 初始化。        train_l_sum,train_right_sum,n= 0.0,0.0,0                for X,y in train_iter:            y_hat = net(X)            l = loss(y_hat,y).sum()            #数据集损失函数的值=每个样本的损失函数值的和。            optimizer.zero_grad()			#对优化函数梯度清零            #for param in params:            #    param.grad.data.zero_()            l.backward()	#对损失函数求梯度                        optimizer.step()                        train_l_sum += l.item()            train_right_sum += (y_hat.argmax(dim=1) == y).sum().item()            n += y.shape[0]                    test_acc = net_accurary(test_iter, net)	#测试集的准确率        print('epoch %d, loss %.4f, train right %.3f, test right %.3f' % (epoch + 1, train_l_sum / n, train_right_sum / n, test_acc))        start = time()train_MLP(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer,net_accurary)print('%.3f'% (time()-start),'s')

1.6 训练结果

五个学习周期,四线程读取数据,一共耗时50秒。

1.7 识别测试集图像

使用训练好的模型对测试集进行预测

做一个模型的最终目的当然不是训练了,所以来识别数据集试试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#将样本的类别数字转换成文本def get_Fashion_MNIST_labels(labels):    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']    return [text_labels[int(i)] for i in labels]    #labels是一个列表,所以有了for循环获取这个列表对应的文本列表
#显示图像def show_fashion_mnist(images,labels):    display.set_matplotlib_formats('svg')    #绘制矢量图    _,figs = plt.subplots(1,len(images),figsize=(12,12))    #设置添加子图的数量、大小    for f,img,lbl in zip(figs,images,labels):        f.imshow(img.view(28,28).numpy())        f.set_title(lbl)        f.axes.get_xaxis().set_visible(False)        f.axes.get_yaxis().set_visible(False)    plt.show()
#从测试集中获得样本和标签X, y = iter(test_iter).next()
true_labels = get_Fashion_MNIST_labels(y.numpy())pred_labels = get_Fashion_MNIST_labels(net(X).argmax(dim=1).numpy())
#将真实标签和预测得到的标签加入到图像上titles = [true + '\n' + pred for true, pred in zip(true_labels, pred_labels)]
show_fashion_mnist(X[0:9], titles[0:9])

识别结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 拇指笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【动手学深度学习笔记】之多层感知机实现
Fashion-MNIST数据集中的图像为28*28像素,也就是由784个特征值。Fashion-MNIST数据集一共有十个类别。因此模型需要784个输入,10个输出。假设隐藏单元为256(超参数,可调节)。
树枝990
2020/08/19
6330
【动手学深度学习笔记】之PyTorch实现softmax回归
由softmax回归模型的定义可知,softmax回归模型只有权重参数和偏差参数。因此可以使用神经网络子模块中的线性模块。
树枝990
2020/08/20
1.8K0
从0到1,实现你的第一个多层神经网络
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。如图所示的隐藏层一共有5个隐藏单元。由于输入层不涉及计算,因此这个多层感知机的层数为2。如图所示的多层感知机中的隐藏层和输出层都是全连接层。
树枝990
2020/08/19
7740
【动手学深度学习笔记】之实现softmax回归模型
设置小批量数目为256。这一部分与之前的线性回归的读取数据大同小异,都是转换类型-->生成迭代器。
树枝990
2020/08/20
8570
动手学深度学习(三) 多层感知机
深度学习主要关注多层模型。在这里,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
致Great
2020/02/24
1.1K0
从零开始学Pytorch(三)之多层感知机的实现
我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
墨明棋妙27
2022/08/24
1.2K0
从零开始学Pytorch(三)之多层感知机的实现
从零开始学Pytorch(四)softmax及其实现
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
墨明棋妙27
2022/09/23
1.2K0
【动手学深度学习】多层感知机之暂退法问题研究详情
如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论
SarPro
2024/06/06
1560
【动手学深度学习】多层感知机之暂退法问题研究详情
动手学深度学习(二) Softmax与分类模型
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
致Great
2020/02/24
8360
pytorch学习笔记(十):MLP[通俗易懂]
多层感知机(multilayer perceptron, MLP) 在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。
全栈程序员站长
2022/07/04
1.5K0
pytorch学习笔记(十):MLP[通俗易懂]
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
4240
【深度学习基础】多层感知机 | 多层感知机的实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
1390
【深度学习基础】多层感知机 | 多层感知机的实现
多层感知机实现(单层感知器和多层感知器)
前面利用了softmax来对图像进行分类,也可以使用多层感知机的方法对图像进行分类。
全栈程序员站长
2022/07/31
1.2K0
多层感知机实现(单层感知器和多层感知器)
【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
除了上一篇文章介绍的权重衰减法,深度学习常用的缓解过拟合问题的方法还有丢弃法。本文介绍倒置丢弃法及其实现。
树枝990
2020/08/19
1K0
多层感知机
多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换,多层感知机的层数个各个隐藏层中隐藏单元个数都是超参数,输出可以通过以下公式计算得出:
村雨遥
2022/06/15
6350
多层感知机
动手学DL——MLP多层感知机【深度学习】【PyTorch】
加入一个或多个隐藏层+激活函数来克服线性模型的限制, 使其能处理更普遍的函数关系类型,这种架构通常称为多层感知机(multilayer perceptron)。
来杯Sherry
2023/08/10
1.6K0
动手学DL——MLP多层感知机【深度学习】【PyTorch】
【动手学深度学习】多层感知机之暂退法研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/14
1350
【动手学深度学习】多层感知机之暂退法研究详情
【深度学习基础】线性神经网络 | softmax回归的从零开始实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
940
【深度学习基础】线性神经网络 | softmax回归的从零开始实现
动手学深度学习(四) 过拟合欠拟合及其解决方案
在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
致Great
2020/02/25
1.3K0
动手学深度学习(四) 过拟合欠拟合及其解决方案
【动手学深度学习】softmax回归从零开始实现的研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
3180
【动手学深度学习】softmax回归从零开始实现的研究详情
推荐阅读
相关推荐
【动手学深度学习笔记】之多层感知机实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验