【李沐深度学习笔记】图片分类数据集

news2024/11/29 20:30:00

课程地址和说明

图片分类数据集p3
本系列文章是我学习李沐老师深度学习系列课程的学习笔记,可能会对李沐老师上课没讲到的进行补充。本文还参考了【李沐3】3.5、图像分类数据集

图片分类数据集

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

导入数据集

%matplotlib inline
import torch
import torchvision
from torch.utils import data
from torchvision import transforms
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" # jupyter notebook运行d2l内核挂掉解决方法
from d2l import torch as d2l
# 设置中文字体
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]   # 设置显示中文字体
mpl.rcParams["axes.unicode_minus"] = False   # 设置正常显示符号
d2l.use_svg_display()
# 导入必要的库和模块
# - torch:PyTorch库,用于构建和训练神经网络
# - torchvision:PyTorch中用于处理图像数据的库
# - torch.utils.data:PyTorch中用于处理数据加载的模块
# - torchvision.transforms:用于定义和应用数据转换的模块
# - d2l.torch:Dive into Deep Learning(《动手深度学习》)书中提供的PyTorch实用函数和工具

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

首先下载数据集

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式,
# 并除以255使得所有像素的数值均在0-1之间
trans = transforms.ToTensor()

# 创建FashionMNIST数据集的训练集实例
mnist_train = torchvision.datasets.FashionMNIST(
    root="../data",  # 数据集存放的根目录(根目录的上一级目录(父级目录)下的data文件夹)
    train=True,      # 表示加载训练集
    transform=trans, # 数据变换,将图像数据转换为Tensor格式并归一化
    download=True    # 是否下载数据集(如果尚未下载的话)
)
# 创建FashionMNIST数据集的测试集实例
mnist_test = torchvision.datasets.FashionMNIST(
    root="../data",  # 数据集存放的根目录
    train=False,     # 表示加载测试集(测试数据集是用来验证模型好坏的数据集)
    transform=trans, # 数据变换,将图像数据转换为Tensor格式并归一化
    download=True    # 是否下载数据集(如果尚未下载的话)
)

运行结果:

# 查看一下数据集和训练集的个数
print(len(mnist_train))
print(len(mnist_test))

运行结果:
60000
10000

# 查看数据集中一个图片的大小和颜色通道数(黑白图片,通道数为1)
print(mnist_train[0][0].shape)

运行结果:
torch.Size([1, 28, 28])

展示样本

# 将标签从数字转成具体的文字
def get_fashion_mnist_labels(labels):
    """
    返回Fashion-MNIST数据集的文本标签
    参数:
        labels: 包含数值标签的列表或数组
    返回:
        包含对应文本标签的列表
    """
    text_labels = ['T恤衫', '裤子', '套头衫', '裙子', '大衣',
                   '凉鞋', '衬衫', '运动鞋', '包', '短靴']
    # 比如1表示苹果,这里以前标记的是1,现在转换为苹果
    return [text_labels[int(i)] for i in labels]

def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5): #@save
    """
    绘制图像列表
    参数:
        imgs: 包含图像的列表
        num_rows: 图像展示的行数
        num_cols: 图像展示的列数
        titles: 可选参数,图像标题的列表
        scale: 可选参数,控制图像的缩放比例
    返回:
        无返回值,显示绘制的图像
    """
    # 计算绘图区域的尺寸
    figsize = (num_cols * scale, num_rows * scale)
    # 创建一个具有指定尺寸的子图
    _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
    # 将子图数组展平,以便逐个访问每个子图
    axes = axes.flatten()
    
    # 遍历图像列表并在每个子图中绘制图像
    for i, (ax, img) in enumerate(zip(axes, imgs)):
        if torch.is_tensor(img):
            # 如果图像是PyTorch的张量,将其转换为NumPy数组并在子图上显示
            ax.imshow(img.numpy())
        else:
            # 如果图像是PIL图像,直接在子图上显示
            ax.imshow(img)
        # 隐藏子图的x轴和y轴
        ax.axes.get_xaxis().set_visible(False)
        ax.axes.get_yaxis().set_visible(False)
        if titles:
            # 如果提供了标题列表,设置当前子图的标题
            ax.set_title(titles[i])
    
    # 返回绘制的子图数组
    return axes
# 大小为固定数字批量的数据,用next拿到第一个小批量
x, y = next(iter(data.DataLoader(mnist_train, batch_size=18)))
# 18个图片,28x28像素,2行9列,展示第一批训练集样本和其对应的标签
show_images(x.reshape(18,28,28),2,9,titles=get_fashion_mnist_labels(y))

运行结果:

读取一小批量数据,大小为batch_size

batch_size = 256
def get_dataloader_workers(): #@save
    """使用4个进程来读取数据"""
    return 4

# 创建训练数据迭代器
train_iter = data.DataLoader(
    mnist_train,                       # 使用的数据集实例
    batch_size,                        # 每个批次的样本数量
    shuffle=True,                      # 是否在每个epoch前打乱数据顺序
    num_workers=get_dataloader_workers() # 用于加载数据的进程数量
)
# 计算运行时间(4进程读数据,根据自己的CPU核心数和性能自主决定用几个进程(几个核心))
timer = d2l.Timer()
for X,y in train_iter:
    continue
print(f"{timer.stop():.2f}秒")

运行结果:
3.09秒

定义load_data_fashion_mnist函数

把上面的所有功能都整合到load_data_fashion_mnist函数中

def load_data_fashion_mnist(batch_size, resize=None): #@save
    """
    下载Fashion-MNIST数据集,然后将其加载到内存中
    参数:
        batch_size: 批次大小,用于小批量训练
        resize: 可选参数,指定图像调整的大小
    返回:
        包含训练数据迭代器和测试数据集的元组
    """
    # 创建数据变换列表,将图像转换为Tensor格式
    trans = [transforms.ToTensor()]
    
    # 如果提供了resize参数,将图像调整大小添加到变换列表
    if resize:
        trans.insert(0, transforms.Resize(resize))
        
    # 将变换列表组合成一个组合变换
    trans = transforms.Compose(trans)
    
    # 创建FashionMNIST数据集的训练集实例
    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data",              # 数据集存放的根目录
        train=True,                  # 表示加载训练集
        transform=trans,             # 数据变换,包括调整大小和转换为Tensor
        download=True                # 是否下载数据集(如果尚未下载的话)
    )
    
    # 创建FashionMNIST数据集的测试集实例
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data",              # 数据集存放的根目录
        train=False,                 # 表示加载测试集
        transform=trans,             # 数据变换,包括调整大小和转换为Tensor
        download=True                # 是否下载数据集(如果尚未下载的话)
    )
    
    # 创建训练数据迭代器,并指定批次大小、是否打乱顺序和数据加载进程数量
    train_data = data.DataLoader(
        mnist_train,                 # 使用的训练数据集实例
        batch_size,                  # 每个批次的样本数量
        shuffle=True,                # 是否在每个epoch前打乱数据顺序
        num_workers=get_dataloader_workers()  # 数据加载进程数量
    )
    
    # 创建测试数据迭代器,并指定批次大小、不打乱顺序和数据加载进程数量
    test_data = data.DataLoader(
        mnist_test,                  # 使用的测试数据集实例
        batch_size,                  # 每个批次的样本数量
        shuffle=False,               # 不打乱数据顺序
        num_workers=get_dataloader_workers()  # 数据加载进程数量
    )
    
    # 返回训练数据迭代器和测试数据迭代器的元组
    return train_data, test_data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言——动态内存管理详解(内存结构、动态内存函数、易错题、柔性数组)

本篇概要 本篇文章从基本出发讲述为什么要存在动态内存分配,动态内存函数有哪些,常见的动态内存错误,一些关于内存分配的练习题以及柔性数组的相关知识。 文章目录 本篇概要1.为什么存在动态内存分配1.1为什么要动态分配内存1.2内存结构 2.常…

Unity实现设计模式——状态模式

Unity实现设计模式——状态模式 状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。 在实际开发中一般用到FSM有限状态机的实现&…

idea Springboot 教师标识管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 教师标识管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统 具有完整的源代码和数据库&…

8个居家兼职,帮助自己在家搞副业

越来越多的人开始追求居家工作的机会,无论是为了获得更多收入以改善生活质量,还是为了更好地平衡工作和家庭的关系,居家兼职已成为一种趋势。而在家中从事副业不仅能够为我们带来额外的收入,更重要的是,它可以让我们在…

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…

ConcurrentHashMap 并发

1 ConcurrentHashMap 并发 1.1 减小锁粒度 减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)类的…

【分布式计算】二、架构 Architectures

1.中心化架构(Centralized Architectures) 1.1.经典C/S模型 服务器:一个或多个进程提供服务 客户端:一个或多个进程使用服务 客户端和服务器可以在不同的机器上 客户端遵循请求/回复模型 1.2.传统三层视图 用户界面层&#x…

并查集LRUCache

文章目录 并查集1.概念2. 实现 LRUCache1. 概念2. 实现使用标准库实现自主实现 并查集 1.概念 并查集是一个类似于森林的数据结构,并、查、集指的是多个不相干的集合直接的合并和查找,并查集使用于N个集合。适用于将多个元素分成多个集合,在…

Python分支结构和循环结构

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一.分支结构 分支结构是根据判断条件结果而选择不同向前路径的运行方式,分支结构分为:单分支,二分支和多分支。 1&#xff0…

No154.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

关于Java的IO流里面的方法read()的细究

我们会经常看到上面的代码,很显然read(b),是把字节读入到b这个字节数组里,然后read()返回一个成功读取的字节长度,如果现在用不带参的read()去一个一个字节的读了?那么len bInput.read()就是把这一个节字读入到len&am…

消息队列实现进程间通信

write.c #include<myhead.h>typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_s;#define SIZE sizeof(Msg_s)-sizeof(long) //消息正文的大小int main(int argc, const char *argv[]) {key_t key; //定义一个键值if((key ftok("./&q…

【每日一题】种花问题

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心 写在最后 Tag 【贪心】【数组】【2023-09-29】 题目来源 605. 种花问题 题目解读 种花要种在空地&#xff08;没有种过花的位置&#xff09;上&#xff0c;花不能种在相邻位置上否则会抢夺水资源无法正常生长&a…

统计模型----决策树

决策树 &#xff08;1&#xff09;决策树是一种基本分类与回归方法。它的关键在于如何构建这样一棵树。决策树的建立过程中&#xff0c;使用基尼系数来评估节点的纯度和划分的效果。基尼系数是用来度量一个数据集的不确定性的指标&#xff0c;其数值越小表示数据集的纯度越高。…

管理与系统思维

技术管理者不仅仅需要做事情&#xff0c;还需要以系统思维的方式推动组织变革&#xff0c;从而帮助团队和个人做到更好。原文: Management and Systems Thinking 图片来源: Dall-E "除非管理者考虑到组织的系统性&#xff0c;否则大多数提高绩效的努力都将注定失败。"…

有效括号——括号的匹配

给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有…

C++ 迭代器(iterator)

迭代器介绍 迭代器&#xff08;iterator&#xff09;&#xff1a;容器类型内置的“指针” - 使用迭代器可以访问某个元素&#xff0c;迭代器也能从一个元素移动到另一个元素。 - 有迭代器的类型都拥有 begin 和 end 成员- begin&#xff1a;返回指向第一个元素&#xff08;或字…

LaTex的学习(学习于b站西北农林科技大学耿楠教授的教学视频)

目录 一、LaTeX软件的安装与环境配置  1.LaTeX软件texlive的下载  2. texlive的安装 二、用命令行实现LaTeX文档的编写  1.通过命令行演示LaTeX编写的过程  2.将编译LaTeX并生成pdf文件的过程封装成一个bat文件  3.演示一个含有中文的LaTeX文件 三、用TexStudio IDE实…

性格孤僻怎么办?改变性格孤僻的4种方法

性格孤僻是比较常见的说法&#xff0c;日常中我们说某人性格孤僻&#xff0c;意思就是这人不太合群&#xff0c;喜欢独来独往&#xff0c;话少&#xff0c;人际关系不太好&#xff0c;其言行往往不符合大众的价值观。从性格孤僻的角度来看&#xff0c;可能跟很多种心理疾病存在…

布隆过滤器Bloom Filter

本章代码gitee仓库&#xff1a;布隆过滤器 文章目录 0. 前言1. 布隆过滤器的概念2. 布隆过滤器的实现2.1 哈希函数2.2 插入和判断 3. 布隆过滤器的删除4. 布隆过滤器的误判 0. 前言 我们在玩某款游戏的时候&#xff0c;刚注册的话&#xff0c;我们需要取一个昵称&#xff0c;这…