目录

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回归实验相关推荐

  1. 动手学深度学习——softmax回归之OneHot、softmax与交叉熵

    目录 一.从回归到多类分类 1. 回归估计一个连续值 2. 分类预测一个离散类别 二.独热编码OneHot 三.校验比例--激活函数softmax 四.损失函数--交叉熵 五.总结 回归可以用于预测多 ...

  2. 深度学习 第3章线性分类 实验四 pytorch实现 Softmax回归 鸢尾花分类任务 下篇

    目录: 第3章 线性分类 3.3 实践:基于Softmax回归完成鸢尾花分类任务 3.3.1 数据处理 3.3.1.1 数据集介绍 3.3.1.2 数据清洗 1. 缺失值分析 2. 异常值处理 3.3 ...

  3. 【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

    1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作: (2)掌握广义线性回归模型(logistic模型.sofmax模型).前馈神经网络模型的原理: (3)熟练掌握基于mind ...

  4. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(一)

    [深度学习]基于Pytorch的softmax回归问题辨析和应用(一) 文章目录 1 概述 2 网络结构 3 softmax运算 4 仿射变换 5 对数似然 6 图像分类数据集 7 数据预处理 8 总 ...

  5. 【深度学习】基于Pytorch的softmax回归问题辨析和应用(二)

    [深度学习]基于Pytorch的softmax回归问题辨析和应用(二) 文章目录1 softmax回归的实现1.1 初始化模型参数1.2 Softmax的实现1.3 优化器1.4 训练 2 多分类问题 ...

  6. pytorch之Softmax回归

    理论推导 简介 softmax回归模型,实际是一个分类模型,与线性回归模型有很多不同的地方(与线性回归一样都是一个单层的神经网络) 分类问题介绍 输入图片的每一个像素值都可以用一个标量表示,我们将图片 ...

  7. 跟李沐学深度学习-softmax回归

    softmax回归 分类和回归的区别 无校验比例 校验比例 交叉熵 常见损失函数 均方误差 L2 loss 绝对值损失L1 loss 鲁棒损失 图像分类数据集 分类和回归的区别 回归:估计一个连续值 ...

  8. 动手学pytorch之tensor数据(一)

    tensor数据类型 Tensor在使用时可以有不同的数据类型,官方给出了 7种CPU Tensor类型与8种GPU Tensor类型.16位半精度浮点是专为GPU模型设计的,以尽可能地节省GPU显存 ...

  9. 动手学PyTorch | (35) 长短期记忆(LSTM)

    本节将介绍另一种常⽤的⻔控循环神经网络:长短期记忆(long short-term memory,LSTM).它⽐⻔控循环单元的结构稍微复杂一点. 目录 1. 长短期记忆 2. 读取数据集 3. 从0 ...

最新文章

  1. Java之 javaObject与jsonString的转换
  2. postman 请求 页面出现 Could not get any response 解决方法
  3. win10北通手柄没反应_《动物森友会》怎么玩出新花样?北通宙斯游戏手柄宏玩法了解下...
  4. Mybatis更新和删除数据
  5. 相机参数设置程序_自定义拍摄模式怎么设置?教你学会相机设置。
  6. word菜单删除,小常识,删除word菜单,WORD菜单栏,删除词霸2003菜单,删除adobe菜单
  7. 斯坦福大学机器学习公开课视频及课件
  8. 中国首家干线物流联合创新中心成立
  9. 2步轻松搞定SpringBoot2.x分布式session共享,极少配置
  10. Linux设备驱动模型-Bus
  11. 超级炫酷个人引导页自适应HTML源码
  12. 模拟京东快递单号查询案例
  13. 百度网站收录批量查询 介绍百度网站收录批量查询3种方式
  14. 冯仑《企业领导最容易犯的十大错误》 .
  15. JZOJ5444. 【NOIP2017提高A组冲刺11.2】救赎
  16. JavaFX教程资源
  17. 程序员应该常去的网站
  18. 重磅!图灵奖,公布!
  19. 踩实底子|每日学习|02-特征工程和文本特征提取【下】
  20. CF763D·Timofey and a flat tree

热门文章

  1. 标准15针 VGA 显示接口定义及焊接方法
  2. 在VMware上创建新的虚拟机
  3. RC有源滤波器之高通滤波器(二)
  4. ios 设备获取idfa_获取iOS设备唯一标示UUID
  5. 爬虫学习案例2:异步爬取
  6. ffmpeg命令操作音频格式转换
  7. android afw模式,[HUAWEI-TITANC328]手机加密功能开启后,工作区中添加超级备份手机不断重启的分析报告...
  8. PageAdmin Cms网站管理系统如何修改后台目录
  9. VS2022安装教学(超详细易上手)
  10. 据说为了增加访问量这样就可以了