动手学PyTorch | (5) Softmax回归实验
目录
1. 图像分类数据集(Fashion-Mnist)
2. Softmax回归从0开始实现
3. Softmax回归的简洁实现
1. 图像分类数据集(Fashion-Mnist)
在介绍softmax回归的实现前我们先引⼊一个多类图像分类数据集。它将在后面的实验中被多次使用, 以⽅便我们观察⽐较算法之间在模型精度和计算效率上的区别。图像分类数据集中最常⽤的是⼿写数字识别数据集MNIST。但⼤部分模型在MNIST上的分类精度都超过了95%。为了更直观地观察算法之间的差异,我们将使用一个图像内容更加复杂的数据集Fashion-MNIST(这个数据集也⽐较⼩,只有⼏十M,没有GPU的电脑也能吃得消)。
本节我们将使用torchvision包,它是服务于PyTorch深度学习框架的,主要⽤来构建计算机视觉模型。 torchvision主要由以下⼏部分构成:
1)torchvision.datasets:⼀些加载数据的函数及常⽤的数据集接口;
2) torchvision.models:包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
3)torchvision.transforms:常用的图⽚变换,例如裁剪、旋转等;
4)torchvision.utils:其他的一些有用的方法。
- 获取数据集
⾸先导⼊本节需要的包或模块:
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import time
import sys
sys.path.append(".") # 为了导入上层目录的d2lzh_pytorch.py模块
import d2lzh_pytorch as d2l
下⾯,我们通过torchvision的torchvision.dataset来下载这个数据集。第一次调⽤时会自动从⽹上获取数据。我们通过参数 train来指定获取训练数据集或测试数据集(testing data set)。测试数据集也叫测试集(testing set),只用来评价模型的表现,并不不⽤来训练模型。
另外我们还指定了参数transform = transforms.ToTensor()使所有数据转换为Tensor,如果不进行转换返回的是PIL图片。transforms.ToTensor()将尺寸为(H*W*C)且数据位于(0,255)的PIL图片或者数据类型为np.uint8的Numpy数组转换为尺寸为(C*H*W)且数据类型为torch.float32且位于(0.0,1.0)的Tensor。
注意:由于像素值为0到255的整数,所以刚好是uint8所能表示的范围,包括transforms.ToTensor()在内的⼀些关于图片的函数就默认输入的是uint8型,若不是,可能不会报错但可能得不到想要的结果。所以,如果⽤像素值(0-255整数)表示图⽚数据,那么一律将其类型设置成uint8,避免不必要的bug。
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())
上⾯的mnist_train和mnist_test都是torch.utils.data.Dataset的子类,所以我们可以用len()来获取该数据集的⼤小,还可以用下标来获取具体的⼀个样本。训练集中和测试集中的每个类别的图像数分别为6,000和1,000。因为有10个类别,所以训练集和测试集的样本数分别为60,000和 10,000。
print(type(mnist_train))
print(len(mnist_train), len(mnist_test))
我们可以通过下标来访问任意⼀个样本:
feature, label = mnist_train[0]
print(feature.shape, label) # Channel x Height x Width
变量feature对⾼和宽均为28像素的图像。由于我们使用了transforms.ToTensor(),所以每个像素的数值为[0.0, 1.0]的32位浮点数。需要注意的是,feature的尺寸是 (C x H x W) 的,⽽不是 (H x W x C)。第⼀维是通道数,因为数据集中是灰度图像,所以通道数为1。后⾯两维分别是图像的高和宽。
Fashion-MNIST中⼀共包括了10个类别,分别为t-shirt(T恤)、trouser(裤⼦子)、pullover(套衫)、 dress(连⾐衣裙)、coat(外套)、sandal(凉鞋)、shirt(衬衫)、sneaker(运动鞋)、 bag(包)和ankle boot(短靴)。以下函数可以将数值标签转成相应的⽂本标签。
#可以把本函数保存在d2lzh包中方便以后使用
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]
下⾯定义一个可以在一行⾥画出多张图像和对应标签的函数。
#可以把本函数保存在d2lzh包中方便以后使用
def show_fashion_mnist(images, labels):d2l.use_svg_display()# 这里的_表示我们忽略(不使用)的变量_, 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()
现在,我们看一下训练数据集中前9个样本的图像内容和文本标签。
X, y = [], []
for i in range(10):X.append(mnist_train[i][0])y.append(mnist_train[i][1])
show_fashion_mnist(X, get_fashion_mnist_labels(y))
- 读取小批量
我们将在训练数据集上训练模型,并将训练好的模型在测试数据集上评价模型的表现。前⾯说过,mnist_train是torch.utils.data.Dataset的子类,所以我们可以将其传入torch.utils.data.DataLoader来创建一个读取⼩批量数据样本的DataLoader实例。
在实践中,数据读取经常是训练的性能瓶颈,特别当模型较简单或者计算硬件性能较高时。PyTorch的DataLoader中一个很⽅便的功能是允许使用多进程来加速数据读取。这⾥我们通过参数num_workers来设置4个进程读取数据。
batch_size = 256
if sys.platform.startswith('win'):num_workers = 0 # 0表示不用额外的进程来加速读取数据
else:num_workers = 4
train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)
test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)
我们将获取并读取Fashion-MNIST数据集的逻辑封装在d2lzh_pytorch.load_data_fashion_mnist函数中供后面实验调用。该函数将返回train_iter和test_iter两个变量。随着内容的不断深入,我们会进⼀步改进该函数。
最后我们查看读取一遍训练数据需要的时间:
start = time.time()
for X, y in train_iter:continue
print('%.2f sec' % (time.time() - start))
- 小结
1)Fashion-MNIST是⼀个10类服饰分类数据集,之后的实验将使用它来检验不同算法的表现。
2)我们将高和宽为h和w像素的图像的形状记为h*w或(h,w).
2. Softmax回归从0开始实现
这⼀节我们来动⼿实现softmax回归。首先导⼊本节实现所需的包或模块。
import torch
import torchvision
import numpy as np
import sys
sys.path.append(".") # 为了导入上层目录的d2lzh_pytorch
import d2lzh_pytorch as d2l
- 获取和读取数据
def load_data_fashion_mnist(batch_size):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())if sys.platform.startswith('win'):num_workers = 0 # 0表示不用额外的进程来加速读取数据else:num_workers = 4train_iter = torch.utils.data.DataLoader(mnist_train,batch_size=batch_size, shuffle=True, num_workers=num_workers)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)return train_iter,test_iter
我们将使用Fashion-MNIST数据集,并设置批量⼤小为256。
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
- 初始化模型参数
跟线性回归中的例子⼀样,我们将使⽤向量表示每个样本。已知每个样本输⼊是⾼和宽均为28像素的图像。模型的输⼊向量量的⻓度是28*28=784:该向量的每个元素对应图像中每个像素。由于图像有 10个类别,单层神经⽹络输出层的输出个数为10,因此softmax回归的权
动手学PyTorch | (5) Softmax回归实验相关推荐
- 动手学深度学习——softmax回归之OneHot、softmax与交叉熵
目录 一.从回归到多类分类 1. 回归估计一个连续值 2. 分类预测一个离散类别 二.独热编码OneHot 三.校验比例--激活函数softmax 四.损失函数--交叉熵 五.总结 回归可以用于预测多 ...
- 深度学习 第3章线性分类 实验四 pytorch实现 Softmax回归 鸢尾花分类任务 下篇
目录: 第3章 线性分类 3.3 实践:基于Softmax回归完成鸢尾花分类任务 3.3.1 数据处理 3.3.1.1 数据集介绍 3.3.1.2 数据清洗 1. 缺失值分析 2. 异常值处理 3.3 ...
- 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络
1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作: (2)掌握广义线性回归模型(logistic模型.sofmax模型).前馈神经网络模型的原理: (3)熟练掌握基于mind ...
- 【深度学习】基于Pytorch的softmax回归问题辨析和应用(一)
[深度学习]基于Pytorch的softmax回归问题辨析和应用(一) 文章目录 1 概述 2 网络结构 3 softmax运算 4 仿射变换 5 对数似然 6 图像分类数据集 7 数据预处理 8 总 ...
- 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)
[深度学习]基于Pytorch的softmax回归问题辨析和应用(二) 文章目录1 softmax回归的实现1.1 初始化模型参数1.2 Softmax的实现1.3 优化器1.4 训练 2 多分类问题 ...
- pytorch之Softmax回归
理论推导 简介 softmax回归模型,实际是一个分类模型,与线性回归模型有很多不同的地方(与线性回归一样都是一个单层的神经网络) 分类问题介绍 输入图片的每一个像素值都可以用一个标量表示,我们将图片 ...
- 跟李沐学深度学习-softmax回归
softmax回归 分类和回归的区别 无校验比例 校验比例 交叉熵 常见损失函数 均方误差 L2 loss 绝对值损失L1 loss 鲁棒损失 图像分类数据集 分类和回归的区别 回归:估计一个连续值 ...
- 动手学pytorch之tensor数据(一)
tensor数据类型 Tensor在使用时可以有不同的数据类型,官方给出了 7种CPU Tensor类型与8种GPU Tensor类型.16位半精度浮点是专为GPU模型设计的,以尽可能地节省GPU显存 ...
- 动手学PyTorch | (35) 长短期记忆(LSTM)
本节将介绍另一种常⽤的⻔控循环神经网络:长短期记忆(long short-term memory,LSTM).它⽐⻔控循环单元的结构稍微复杂一点. 目录 1. 长短期记忆 2. 读取数据集 3. 从0 ...
最新文章
- Java之 javaObject与jsonString的转换
- postman 请求 页面出现 Could not get any response 解决方法
- win10北通手柄没反应_《动物森友会》怎么玩出新花样?北通宙斯游戏手柄宏玩法了解下...
- Mybatis更新和删除数据
- 相机参数设置程序_自定义拍摄模式怎么设置?教你学会相机设置。
- word菜单删除,小常识,删除word菜单,WORD菜单栏,删除词霸2003菜单,删除adobe菜单
- 斯坦福大学机器学习公开课视频及课件
- 中国首家干线物流联合创新中心成立
- 2步轻松搞定SpringBoot2.x分布式session共享,极少配置
- Linux设备驱动模型-Bus
- 超级炫酷个人引导页自适应HTML源码
- 模拟京东快递单号查询案例
- 百度网站收录批量查询 介绍百度网站收录批量查询3种方式
- 冯仑《企业领导最容易犯的十大错误》 .
- JZOJ5444. 【NOIP2017提高A组冲刺11.2】救赎
- JavaFX教程资源
- 程序员应该常去的网站
- 重磅!图灵奖,公布!
- 踩实底子|每日学习|02-特征工程和文本特征提取【下】
- CF763D·Timofey and a flat tree