当前位置: 首页 > news >正文

动手学深度学习(三)线性神经网络—softmax回归

分类任务是对离散变量预测,通过比较分类的概率来判断预测的结果。

softmax回归和线性回归一样也是将输入特征与权重做线性叠加,但是softmax回归的输出值个数等于标签中的类别数,这样就可以用于预测分类问题。

分类问题和线性回归的区别:分类任务通常有多个输出,作为不同类别的置信度。

一、softmax回归

1.1 网络架构

为了解决线性模型的分类问题,我们需要和输出一样多的仿射函数,每个输出对应它自己的仿射函数。

与线性回归一样,softmax回归也是一个单层神经网络。

在softmax回归中,输出层的输出值大小就代表其所属类别的置信度大小,置信度最大的那个类别我们将其作为预测。

1.2 softmax运算

首先,分类任务的目标是通过比较每个类别的置信度大小来判断预测的结果。但是,我们不能选择未规范化的最大输出值的 o_i 的类别作为我们的预测,原因有两点:

1. 输出值 o_i的总和不一定为1

2. 输出值 o_i有可能为负数。

这违反了概率论基本公理,很难判断所预测的类别是否真符合真实值。

softmax函数通过如下公式,解决了以上问题

softmax函数确保了输出值的非负,和为1,这一种规范手段。

1.3 交叉熵损失函数

交叉熵损失常用来衡量两个概率之间的差别

根据公式推断, 交叉熵损失函数的偏导数是我们softmax函数分配的概率与实际发生的情况之间的差距,换句话来说,其梯度是真实概率 y 和预测概率 \hat{y} 之间的差距。

二、图像分类数据集

MNIST数据集是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但更复杂的Fashion-MNIST数据集。

2.1 导包

import torch
import torchvision
from torch.utils import data
from torchvision import transforms
from d2l import torch as d2ld2l.use_svg_display()  # 用SVG显示图片

2.2 创建数据集

通过框架中的内置函数将Fashion-MNIST数据集下载并读取到内存中。

# 通过ToTensor实例将图像数据从PIL类型转化成32位的浮点数格式
# 并除以255使得所有像素的数值均在0到1之间
trans = transforms.ToTensor()
mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)
mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)

查看Fashion-MNIST训练集和测试集大小,分别包含60000,10000张图片。

print(len(mnist_train), len(mnist_test))

查看图片分辨率,图片分辨率大小为[1, 28, 28]。

print(mnist_train[0][0].shape)

补充

torchvision.datasets 是Torchvision提供的标准数据集。

torchvision.transforms是包含一系列常用图像变换方法的包,可用于图像预处理、数据增强等工作。

torchvision.transforms.ToTensor()把一个取值范围是[0,255]PIL.Image或者shape(H,W,C)numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]torch.FloadTensor(浮点型的tensor)。

 

2.3 可视化数据集函数

# 可视化数据集函数
def get_fashion_mnist_labels(labels):"""返回Fashion-MNIST数据集的文本标签"""text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat','sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']return [text_labels[int(i)] for i in labels]def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):"""绘制图像列表"""figsize = (num_cols * scale, num_rows * scale)_, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize) # 创建绘制num_rows*num_cols个子图的位置区域axes = axes.flatten() # 降维成一维数组for i, (ax, img) in enumerate(zip(axes, imgs)):if torch.is_tensor(img):# 图片张量ax.imshow(img.numpy()) # 负责对图像进行处理,并存入内存,并不显示else:# PIL图片ax.imshow(img)ax.axes.get_xaxis().set_visible(False) #不显示y轴ax.axes.get_yaxis().set_visible(False) #不显示x轴if titles:ax.set_title(titles[i])return axes

可视化展示训练集中前18个图片。

X, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
show_images(X.reshape(18, 28, 28), 2, 9, titles=get_fashion_mnist_labels(y))
d2l.plt.show() # 将plt.imshow()处理后的数据显示出来

plt.subplots(num_rows, num_cols, figsize):创建绘制num_rows*num_cols个子图的位置区域,其中子图大小为figsize。

enumerate():获取可迭代对象的每个元素的索引值及该元素值。

zip():用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

imshow():负责对图像进行处理,并存入内存,并不显示。

plt.show():将plt.imshow()处理后的数据显示出来。

2.4 读取小批量

使用4个进程,以批量大小为256,来读取数据集。

# 读取小批量
batch_size = 256def get_dataloader_workers(): """使用4个进程来读取数据"""return 4train_iter = data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers())

2.5 整合所有组件

这个函数包含了以上所有工作。

def load_data_fashion_mnist(batch_size, resize=None):"""下载Fashion-MNIST数据集,然后将其加载到内存中"""trans = [transforms.ToTensor()]if resize:trans.insert(0, transforms.Resize(resize)) #修改图片大小trans = transforms.Compose(trans)mnist_train = torchvision.datasets.FashionMNIST(root="../data", train=True, transform=trans, download=True)mnist_test = torchvision.datasets.FashionMNIST(root="../data", train=False, transform=trans, download=True)return (data.DataLoader(mnist_train, batch_size, shuffle=True,num_workers=get_dataloader_workers()),data.DataLoader(mnist_test, batch_size, shuffle=False,num_workers=get_dataloader_workers()))

http://www.lryc.cn/news/118043.html

相关文章:

  • ios swift alert 自定义弹框 点击半透明部分弹框消失
  • HCIP STP(生成树)
  • 【Unity开发必备】100多个 Unity 学习网址 资源 收藏整理大全【持续更新】
  • Alpine Ridge控制器使其具备多种使用模式 - 英特尔发布雷电3接口:竟和USB Type-C统一了
  • 容器——2.Collection 子接口之 List
  • 【工作记录】docker安装gitlab、重置密码@20230809
  • 数据挖掘的基本概念和大数据的特点
  • LabVIEW开发分段反射器测试台
  • 二级python和二级c哪个简单,二级c语言和二级python
  • E: Package ‘curl‘ has no installation candidate/ E:软件包没有可用的安装源
  • 代理模式及常见的3种代理类型对比
  • 8.6 校招 内推 面经
  • 【大数据之Flume】七、Flume进阶之自定义Sink
  • vue对于时间的处理
  • Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug
  • 科技云报道:一波未平一波又起?AI大模型再出邪恶攻击工具
  • 深度对话|如何设计合适的网络经济激励措施
  • opencv带GStreamer之Windows编译
  • Java并发编程之锁的升级
  • 多核异构处理器A核与M核通信过程
  • 面试热题(反转链表)
  • 竞赛项目 深度学习的水果识别 opencv python
  • Java项目部署云windows细节
  • 软件功能测试有什么注意事项?功能测试报告起到什么作用?
  • Kubernetes 调度 约束
  • Grafana技术文档-概念-《十分钟扫盲》
  • 【JavaEE进阶】Spring 更简单的读取和存储对象
  • KafKa集群搭建和知识点
  • 剑指 Offer 56 - I. 数组中数字出现的次数题解
  • CSDN付费专栏写作协议