【动手学深度学习笔记】之PyTorch实现多层感知机
时间:2022-07-23
本文章向大家介绍【动手学深度学习笔记】之PyTorch实现多层感知机,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
点击【拇指笔记】,关注我的公众号。
本篇文章全部代码可以在后台回复"MLP_PY"获取。
1.使用PyTorch实现多层感知机
导入需要的库。
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数据集。
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 定义模型
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)
此时通过
print(net)
可以看到现在的神经网络层结构如下图
1.3 定义损失函数和优化函数
PyTorch都有内置好的,两行代码。
loss = torch.nn.CrossEntropyLoss()#损失函数optimizer = torch.optim.SGD(net.paramters(),lr=0.5)#优化函数
1.4 计算分类准确率
首先我们需要得到预测的结果。
从一组预测概率(变量y_hat)中找出最大的概率对应的索引(索引即代表了类别)
#argmax(f(x))函数,对f(x)求最大值所对应的点x。我们令f(x)= dim=1,即可实现求所有行上的最大值对应的索引。A = y_hat.argmax(dim=1) #最终输出结果为一个行数与y_hat相同的列向量
然后我们需要将得到的最大概率对应的类别与真实类别(y)比较,判断预测是否是正确的
B = (y_hat.argmax(dim=1)==y).float()#由于y_hat.argmax(dim=1)==y得到的是ByteTensor型数据,所以我们通过.float()将其转换为浮点型Tensor()
最后我们需要计算分类准确率
我们知道y_hat的行数就对应着样本总数,所以,对B求平均值得到的就是分类准确率
(y_hat.argmax(dim=1)==y).float().mean()
上一步最终得到的数据为tensor(x)的形式,为了得到最终的pytorch number,需要对其进行下一步操作
(y_hat.argmax(dim=1)==y).float().mean().item()#pytorch number的获取统一通过.item()实现
整理一下,得到计算分类准确率函数
def accuracy(y_hat,y): return (y_hat.argmax(dim=1).float().mean().item())
作为推广,该函数还可以评价模型net在数据集data_iter上的准确率。
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都是可以调节的超参数,通过调节超参数的值可以获得分类更准确的模型。
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 识别测试集图像
使用训练好的模型对测试集进行预测
做一个模型的最终目的当然不是训练了,所以来识别数据集试试。
#将样本的类别数字转换成文本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])
识别结果
- 深度学习入门者必看:25个你一定要知道的概念
- 如何在CM中启用YARN的使用率报告
- 如何修改CDSW服务的DNS和HOSTNAME
- 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
- 如何查看集成Sentry后Hive作业的真实用户
- 如何在Impala中实现拉链表
- 多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用
- Hue禁止用户下载数据问题分析
- 如何在RedHat6上使用Bind搭建DNS服务
- 如何使用Cloudera Manager升级Spark2.1版本至Spark2.2
- Cloudera Manager分发Parcel异常分析
- 如何在Hue中配置Impala的负载均衡
- 35行代码实现千万级别字典的快速去重
- PIMS三个漏洞+里程密最新版V2.3 SQL注入漏洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python第二十四课——set中的函数
- python第二十五课——闭包
- LNMP架构应用实战——PHP扩展及缓存插件安装
- python第二十六课——装饰器
- LNMP架构应用实战——openssl升级最新版本
- python第二十七课——os模块
- python第二十八课——编码小常识
- Linux系统——KVM虚拟机安装与管理
- python第二十九课——文件读写(读取读取中文字符)
- python第二十九课——文件读写(readline()和readlines()的使用)
- linux系统运维企业常见面试题集合(一)
- python第二十九课——文件读写(写数据的操作)
- python第二十九课——文件读写(复制文件)
- python第三十课--异常(异常处理定义格式和常见类型)
- python第三十课--异常(finally讲解)