昇思25天学习打卡营第3天|数据集Dataset

news2024/11/27 18:25:01

一、简介:

数据是深度学习的基础,高质量的数据输入将在整个深度神经网络中起到积极作用。有一种说法是模型最终训练的结果,10%受到算法影响,剩下的90%都是由训练的数据质量决定。(doge)

MindSpore提供基于Pipeline的数据引擎,通过数据集(Dataset)和数据变换(Transforms)实现高效的数据预处理。其中Dataset是Pipeline的起始,用于加载原始数据。MindSpore自带的mindspore.dataset方法提供了内置的文本、图像、音频等数据集加载接口,并提供了自定义数据集加载接口。此外MindSpore的领域开发库也提供了大量的预加载数据集,可以使用API一键下载使用。

下面开始我们的实践打卡吧!

二、环境准备:

在开始之前我们先导入下面数据集处理所需的相关依赖包:

import numpy as np
import time
from mindspore.dataset import vision
from mindspore.dataset import MnistDataset, GeneratorDataset
import matplotlib.pyplot as plt

如果没有下载Mindspore包的宝子,可以看我的昇思25天学习打卡营第1天|快速入门-CSDN博客,按照我的过程走一遍(和pytorch的下载几乎一样)。

三、数据集准备:

1、数据集下载:

使用download方法从开源数据集上下载mnist数据集,并保存在本地的notebook/datasets/目录下

from download import download

url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/" \
      "notebook/datasets/MNIST_Data.zip"
path = download(url, "./", kind="zip", replace=True)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

2、数据集迭代:

数据集加载后,一般以迭代方式获取数据,然后送入神经网络中进行训练。我们可以使用create_tuple_iterator(元组)和create_dict_iterator(字典)接口创建数据迭代器,迭代访问数据。访问的数据类型默认为Tensor;若设置output_numpy=Ture,访问的数据类型为Numpy。

# 使用matplotlib构建一个可视化的画布
def visualize(dataset):
    figure = plt.figure(figsize=(4, 4))
    cols, rows = 3, 3

    plt.subplots_adjust(wspace=0.5, hspace=0.5)

    for idx, (image, label) in enumerate(dataset.create_tuple_iterator()):
        figure.add_subplot(rows, cols, idx + 1)
        plt.title(int(label))
        plt.axis("off")
        plt.imshow(image.asnumpy().squeeze(), cmap="gray")
        if idx == cols * rows - 1:
            break
    plt.show()

visualize(train_dataset)
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 figure = plt.figure(figsize=(4, 4)): 这行创建了一个新的图形对象 figure,并设置了图形的大小为 4x4 英寸。

cols, rows = 3, 3 :这行设置了图形中的列数和行数为 3,这意味着函数将显示一个 3x3 的图像网格。

plt.subplots_adjust(wspace=0.5, hspace=0.5): 这行设置了子图之间的水平和垂直间距分别为0.5。

plt.axis("off"):这行关闭了子图的坐标轴,以便只显示图像。plt.imshow(image.asnumpy().squeeze(), cmap="gray"):这行将图像数据 image 显示在子图上。asnumpy() 可能是一个方法,用于将图像数据转换为 NumPy 数组,以便 Matplotlib 可以处理它。squeeze() 用于移除数组中的单一维度。cmap="gray" 指定了使用灰度颜色映射来显示图像。

3、常用操作:

对数据集进行处理,以适应深度学习模型的训练和测试要求:

 (1)Shuffle:

shuffle用于打乱数据集中的元素排列,以消除数据排列造成的分布不均问题。

mindspore.dataset()提供了在加载数据集中shuffle数据的快捷方法:

train_dataset = train_dataset.shuffle(buffer_size=64)

visualize(train_dataset)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

(2)Map:

map是数据处理的关键操作之一,可以针对数据集指定的列(当然也可以不指定)进行数据变换,并将数据变换应用于该列数据的每个元素,并返回包含变换后元素的新数据集。

image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)

# 对Mnist数据集做数据缩放处理,将图像统一除以255,数据类型由uint8转为了float32
train_dataset = train_dataset.map(vision.Rescale(1.0 / 255.0, 0), input_columns='image')

image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 (3) Batch:

这是在算力有限的情况下,将数据集进行划分成数个批次,每次只训练一个批次,以节约硬件资源和提升硬件使用效率。

train_dataset = train_dataset.batch(batch_size=32)

image, label = next(train_dataset.create_tuple_iterator())
print(image.shape, image.dtype)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

四、自定义数据集:

 mindspore.dataset()提供了一些常用的公开数据集和标准数据集的加载API,MindSpore暂时不支持直接加载数据集,可以构造自定义数据加载类或自定义数据集生成函数的方式来生成数据集,然后通过GeneratorDataset接口实现自定义方式的数据集加载(比pytorch略显复杂)。GeneratorDataset支持通过可随机访问数据集对象、可迭代数据集对象和生成器(generator)构造自定义数据集。

1、可随机访问数据集:

可随机访问数据集是指实现了__getitem__和__len__方法的数据集,即可以通过索引/键直接访问对应位置的数据样本。

# 生成一个可随机访问数据集以便下面的实践:
class RandomAccessDataset:
    def __init__(self):
        self._data = np.ones((5, 2))
        self._label = np.zeros((5, 1))

    def __getitem__(self, index):
        return self._data[index], self._label[index]

    def __len__(self):
        return len(self._data)

loader = RandomAccessDataset()
dataset = GeneratorDataset(source=loader, column_names=["data", "label"])

for data in dataset:
    print(data)
# 支持其他类型的数据
loader = [np.array(0), np.array(1), np.array(2)]
dataset = GeneratorDataset(source=loader, column_names=["data"])

for data in dataset:
    print(data)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

 __getitem__ 方法使得类的实例可以被索引。当对象被当作函数调用,并且传入一个索引 index 时,这个方法返回对应索引的数据和标签。在机器学习中,这通常用于获取单个数据样本及其对应的标签。

 __len__方法用于返回数据的长度。

 

2、可迭代数据集对象:

可迭代的数据集是实现了__iter____next__方法的数据集,表示可以通过迭代的方式逐步获取数据样本。这种类型的数据集特别适用于随机访问成本太高或者不可行的情况。

class IterableDataset():
    def __init__(self, start, end):
        '''init the class object to hold the data'''
        self.start = start
        self.end = end
    def __next__(self):
        '''iter one data and return'''
        return next(self.data)
    def __iter__(self):
        '''reset the iter'''
        self.data = iter(range(self.start, self.end))
        return self
loader = IterableDataset(1, 4)
dataset = GeneratorDataset(source=loader, column_names=["data"])

for data in dataset:
    print(data)

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

3、生成器:

生成器也属于可迭代的数据集类型,其直接依赖Python的生成器类型generator返回数据,直至生成器抛出StopIteration异常。

def my_generator(start, end):
    for i in range(start, end):
        yield i

dataset = GeneratorDataset(source=lambda: my_generator(3, 6), column_names=["data"])

for d in dataset:
    print(d)


print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), "VertexGeek")

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

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

相关文章

基于STM32的智能病房监控和人脸识别系统设计(毕业设计)

摘 要 随着技术的不断进步和医疗需求的不断增长,智能病房控制系统有望在医疗领域发挥更大的作用。基于此,本文研究设计了一款低成本、操作简单、适用性强的基于STM32的智能病房监控和人脸识别系统。该系统通过STM32作为控制器和OpenMV对人脸分辨进行门…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

同一天里,两位大厂程序员猝死。。。

2024年&#xff0c;真的不是平静的一年。在几天前&#xff0c;IT行业接连发生了两件不幸的事情。 6月17日下午&#xff0c;东南亚电商公司Sh**ee位于北京的研发中心&#xff0c;一位负责研发的女员工突然在工位上晕倒。 同事们赶紧拨打了120&#xff0c;然而还是没能抢救过来&a…

USB2.0网卡安装驱动

有三种安装方式&#xff1a; 驱动精灵驱动总裁USB2.0网卡自带安装程序 前两种很简单&#xff0c;下载驱动精灵或者驱动总裁&#xff0c;然后检测本地硬件&#xff0c;安装相应驱动。 本文重点要介绍的是第三种&#xff0c;利用USB2.0网卡自带的安装程序。有的时候驱动精灵或…

高考志愿填报,如何避免报错专业?

高考志愿填报绝对是关键一环节&#xff0c;分数高低暂且不论&#xff0c;因为这个填报志愿&#xff0c;大概率是决定了余生的职业&#xff0c;也有人说&#xff0c;大学可以转专业&#xff0c;毕业还可以跨行就业&#xff0c;工作了还可以转行.....确实有这个可能性&#xff0c…

如何生成protobuf文件

背景 protobuf是一种用于序列化结构数据的工具&#xff0c;实现数据的存储与交换&#xff0c;与编程语言和开发平台无关。 序列化&#xff1a;将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化&#xff1a;在其他的计算环境中&#xff0c;将序列化后的数据还原为…

【React】AntD组件---极客园--01.项目前置准备

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

【鸿蒙】创建第⼀个鸿蒙项⽬

点击 Create Project 配置项目 开发工具界面 工程介绍

工业边缘计算网关

1 介绍 HINETG系列边缘计算网关&#xff08;Linux操作系统&#xff09;&#xff0c;是华辰智通的—款面向工业现场设备接入、数据采集、设备监控的工业级边缘计算网关。采用ARM Cortex-A7 800MHz高性能CPU,拥有以太网、串口、CAN口、IO口等丰富的接口&#xff0c;支持以太网、…

docker基础使用教程

1.准备工作 例子&#xff1a;工程在docker_test 生成requirements.txt文件命令&#xff1a;&#xff08;使用参考链接2&#xff09; pip list --formatfreeze > requirements.txt 参考链接1&#xff1a; 安装pipreqs可能比较困难 python 项目自动生成环境配置文件require…

教程:LVM操作讲解

LVM简介 在系统运维过程中&#xff0c;对磁盘扩缩容是常见的操作。如何高效的管理磁盘容量&#xff0c;lvm提供了很好的解决方案。 LVM将磁盘抽象成PV、VG、LV&#xff0c;方便用户进行磁盘管理&#xff0c;简单来讲&#xff0c;是由物理磁盘划分成PV&#xff0c;PV加入到具体…

Ubuntu 22.04.4 LTS openresty(Nginx) 通过Lua+Redis 实现动态封禁IP

1 系统环境 testiZbp1g7fmjea77vsqc5hmmZ:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.4 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.4 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HOME…

蓝桥杯 经典算法题 实现归并排序

题目&#xff1a; 题解&#xff1a; 不断地将数组不断向下平均分为两部分&#xff0c;直到每个子数组中元素数量为1&#xff0c;这样就可以将相邻两个数组长度为1的数组看作是单调数组合并为一个大的单调数组&#xff0c;如此不断向上合并出最终的单调数组。 #include <bi…

Golang | Leetcode Golang题解之第173题二叉搜索树迭代器

题目&#xff1a; 题解&#xff1a; type BSTIterator struct {stack []*TreeNodecur *TreeNode }func Constructor(root *TreeNode) BSTIterator {return BSTIterator{cur: root} }func (it *BSTIterator) Next() int {for node : it.cur; node ! nil; node node.Left {it…

jemeter基本使用

后端关验签&#xff0c;设置请求头编码和token 配置编码和token

用全志T113做了块多功能卡片电脑,成本只要60块

FunnyPi-T113是一款基于全志T113-S3/D1S处理器的完全开源多功能开发板&#xff0c;设计FunnyPi最初的目的是想借此T113卡片电脑来满足日常学习&#xff0c;并结合T113高效能和低功耗的特点&#xff0c;来满足像语音助手&#xff0c;智能家居屏幕、桌面摆件屏、博客服务器等嵌入…

激励-保健理论和公平理论

激励-保健理论 herzberg的激励-保健理论中&#xff0c;保健因素是context of a job&#xff0c;激励因素是content of a job。 context of a job是受组织控制的因素&#xff0c;比如工作条件&#xff0c;基本工资&#xff0c;公司政策等&#xff0c;个人无法支配。content of…

R语言——绘图与数据可视化

1、练习将25个点的符号绘制出来&#xff0c;然后用rainbow()返回25个颜色&#xff0c;后5个符号形状的背景颜色用蓝色填充&#xff0c;图的标题为"符号图"&#xff0c;x轴标题为符号索引&#xff0c;y轴标题为符号形状。 2、根据员工的销售业绩画饼状图&#xff0c;添…

Vitis Accelerated Libraries 学习笔记--OpenCV 运行测试

目录 1. 简介 2. 实例测试 2.1 实例介绍 2.1 创建工程 3 常见错误 3.1 核心共享库报错 4. 总结 1. 简介 在《Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南-CSDN博客》一文中&#xff0c;我详尽地介绍了 OpenCV 的安装过程。尽管 Vitis Vision 库的实现本身并…

BioCLIP 生物界的图文对比模型

参考&#xff1a; https://imageomics.github.io/bioclip/ CLIP模型引入到生物领域&#xff0c;针对生物分类&#xff1a;界门纲目科属种&#xff0c;进行文本与图像的对比学习训练对其&#xff0c;可以快速对图像进行分类到可能的界门纲目科属种 在线体验&#xff1a; https:…