昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类


        首先,导入了 NumPy 库,并将其简称为 np 。要知道,NumPy 乃是用于科学计算的关键库,作用非凡。接着,从 mindspore.dataset 当中导入了 vision 模块。此外,还从 mindspore.dataset 里引入了 MnistDataset 和 GeneratorDataset 这两个与数据集紧密相关的类。最后,导入了 matplotlib 库的 pyplot 模块,并简称为 plt ,其主要用于实现数据的可视化。

        代码如下:

import numpy as np  

from mindspore.dataset import vision  

from mindspore.dataset import MnistDataset, GeneratorDataset  

import matplotlib.pyplot as plt  

数据集加载


        首先是从开放数据集去下载数据,随后导入了一个叫“download”的功能模块或者函数。接下来,设定了一个字符串变量“url”,这个“url”代表着要下载的数据所在的网址。最后呢,调用“download”这个函数来下载“url”所指定的那些数据,并且把数据存放到当前的目录(“./”)当中。要注意哦,下载的这些数据是压缩文件(zip 格式的),要是本地已经有相同的文件了,那就会进行替换操作。

        代码如下:

# Download data from open 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)   

        运行结果:

        创建了一个名为 train_dataset 的数据集对象,该数据集是基于“MNIST_Data/train”路径下的数据创建的 MnistDataset 类型,并且设置了不进行随机打乱(shuffle=False)。然后,打印出 train_dataset 的数据类型。

        代码如下:

train_dataset = MnistDataset("MNIST_Data/train", shuffle=False)  
print(type(train_dataset)) 

        运行结果:

        <class 'mindspore.dataset.engine.datasets_vision.MnistDataset'>

数据集迭代


        数据集加载后,一般以迭代方式获取数据,然后送入神经网络中进行训练。我们可以用create_tuple_iterator或create_dict_iterator接口创建数据迭代器,迭代访问数据。

        访问的数据类型默认为Tensor;若设置output_numpy=True,访问的数据类型为Numpy。

        以下定义了一个用于可视化的函数,其旨在对 9 张图片进行迭代展示。此函数的目的在于以 3x3 的布局对数据集中的图像及其对应的标签予以可视化呈现。

        代码如下:

def visualize(dataset):  
    #创建一个大小为 4x4 的图形窗口。  
    figure = plt.figure(figsize=(4, 4))  
    #定义了子图的列数和行数,均为 3。  
    cols, rows = 3, 3  
    #调整子图之间的水平间距(wspace)和垂直间距(hspace)为 0.5 。  
    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")  
        #在子图中显示图像,使用灰度颜色映射(cmap="gray")。  
        plt.imshow(image.asnumpy().squeeze(), cmap="gray")  
        #当达到 9 个(3x3)子图时,停止循环。  
        if idx == cols * rows - 1:  
            break  
        #显示图形窗口,展示所有的子图。  
    plt.show()  

        调用名为 visualize 的函数,并将 train_dataset 作为参数传递给这个函数进行可视化展示。

        代码如下:

visualize(train_dataset)  

        运行结果:(随机)

数据集的常用操作


shuffle

        数据集随机shuffle可以消除数据排列造成的分布不均问题。

        首先,对名为 train_dataset 的数据集进行打乱操作,打乱时使用的缓冲区大小为 64。然后,调用 visualize 函数,并将打乱后的 train_dataset 作为参数传递给这个函数,以进行相应的可视化展示。

        代码如下:

train_dataset = train_dataset.shuffle(buffer_size=64)  
visualize(train_dataset)

        运行结果:(随机)

map

        map操作是数据预处理的关键操作,可以针对数据集指定列(column)添加数据变换(Transforms),将数据变换应用于该列数据的每个元素,并返回包含变换后元素的新数据集。

        对数据集 train_dataset 中的数据进行处理和输出信息。

        首先,通过 next(train_dataset.create_tuple_iterator()) 获取数据集中的一组数据(图像 image 和标签 label),然后打印出图像的形状和数据类型。接着,使用 map 方法对数据集中的 'image' 列应用 vision.Rescale(1.0 / 255.0, 0) 这个缩放操作,将图像的像素值缩放到 0 到 1 之间。最后,再次获取一组经过缩放处理后的数据,并打印出此时图像的形状和数据类型,以查看缩放操作的效果。

        代码如下:

image, label = next(train_dataset.create_tuple_iterator())  
print(image.shape, image.dtype)  
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)  

        运行结果:

        (28, 28, 1) UInt8

        (28, 28, 1) Float32

batch

        将数据集打包为固定大小的batch是在有限硬件资源下使用梯度下降进行模型优化的折中方法,可以保证梯度下降的随机性和优化计算量。

        代码如下:

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

        分析:

        首先,train_dataset = train_dataset.batch(batch_size=32) 这行代码将数据集 train_dataset 按照每个批次 32 个样本进行分组。

        然后,通过 next(train_dataset.create_tuple_iterator()) 获取经过批次处理后的数据集的一组数据(图像 image 和标签 label)。

        最后,打印出获取到的这组图像数据的形状和数据类型。

        运行结果:

        (32, 28, 28, 1) Float32

自定义数据集


可随机访问数据集

        定义了一个名为 RandomAccessDataset 的类,其作用是创建一个可随机访问的数据集对象。

        __init__ 方法:这是类的初始化方法。在创建 RandomAccessDataset 对象时会被调用。它初始化了两个 NumPy 数组 _data 和 _label ,_data 是一个 5 行 2 列的全 1 数组,_label 是一个 5 行 1 列的全 0 数组。

        __getitem__ 方法:这个方法使得对象可以通过索引(index)来获取数据。当通过索引访问对象时(如 obj[index]),会调用这个方法,并返回指定索引处的 _data 和 _label 的值。

        __len__ 方法:这个方法返回数据集的长度,即 _data 的长度(这里是 5)。它用于一些需要知道数据集大小的操作,例如在循环中。

        代码如下:

# Random-accessible object as input source  
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) 

        创建了一个 RandomAccessDataset 类的实例 loader 。然后,使用这个实例 loader 作为数据源创建了一个 GeneratorDataset 对象 dataset ,并指定了列名为 ["data", "label"] 。最后,通过一个 for 循环遍历 dataset 中的数据,并打印每次循环得到的数据。

        代码如下:

loader = RandomAccessDataset()  
dataset = GeneratorDataset(source=loader, column_names=["data", "label"])  
for data in dataset:  
    print(data)  

        运行结果:

        [Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]

        [Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]

        [Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]

        [Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]

        [Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]

        创建了一个名为 loader 的列表,其中包含三个 numpy 数组:np.array(0) 、np.array(1) 和 np.array(2) 。

        接着使用 loader 作为数据源创建了一个名为 dataset 的 GeneratorDataset 对象,并指定列名为 ["data"] 。

        最后通过一个 for 循环遍历 dataset 中的数据,并打印每次循环得到的数据。

        代码如下:

# list, tuple are also supported.  
loader = [np.array(0), np.array(1), np.array(2)]  
dataset = GeneratorDataset(source=loader, column_names=["data"])  
for data in dataset:  
    print(data)  

            运行结果:

        [Tensor(shape=[], dtype=Int64, value= 0)]

        [Tensor(shape=[], dtype=Int64, value= 1)]

        [Tensor(shape=[], dtype=Int64, value= 2)]

可迭代数据集

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

        代码如下:

# Iterator as input source  
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  

        分析:定义了一个名为 IterableDataset 的类。

        __init__ 方法:用于初始化类的对象,接收 start 和 end 两个参数,用于表示数据的起始和结束范围。

        __next__ 方法:每次迭代时取出一个数据并返回。但这里的实现存在问题,因为代码中没有定义 self.data ,直接使用 next(self.data) 会导致错误。正确的实现应该是从已经初始化的 self.data 中获取下一个元素。

        __iter__ 方法:在每次迭代开始时,将 range(self.start, self.end) 转换为一个迭代器,并将其赋值给 self.data ,然后返回自身,使得该对象可用于迭代操作。

        总的来说,这个类的目的是创建一个可迭代的数据集对象,能够在迭代时依次返回指定范围内的整数。但需要注意 __next__ 方法中对 self.data 的使用需要在前面进行正确的初始化。

        创建了一个 IterableDataset 类的对象 loader ,其数据范围是从 1 到 5 。然后创建了一个 GeneratorDataset 对象 dataset ,将 loader 作为数据源,并指定了列名为 ["data"] 。最后通过一个 for 循环遍历 dataset 中的每个元素 d ,并将其打印出来。

        代码如下:

loader = IterableDataset(1, 5)  
dataset = GeneratorDataset(source=loader, column_names=["data"])  
for d in dataset:  
    print(d)  

        运行结果:

        [Tensor(shape=[], dtype=Int64, value= 1)]

        [Tensor(shape=[], dtype=Int64, value= 2)]

        [Tensor(shape=[], dtype=Int64, value= 3)]

        [Tensor(shape=[], dtype=Int64, value= 4)]

生成器

        定义了一个名为 my_generator 的生成器函数,它接受 start 和 end 两个参数,通过 for 循环使用 yield 关键字依次生成从 start 到 end - 1 的整数。由于生成器实例只能被迭代一次,所以使用 lambda 表达式来包装 my_generator 函数,以便能够生成多个实例。然后创建了一个 GeneratorDataset 对象 dataset ,将这个包装后的函数作为数据源,并指定列名为 ["data"] 。最后通过 for 循环遍历 dataset 中的每个元素 d ,并将其打印出来。

        代码如下:

# Generator  
def my_generator(start, end):  
    for i in range(start, end):  
        yield i  
# since a generator instance can be only iterated once, we need to wrap it by lambda to generate multiple instances  
dataset = GeneratorDataset(source=lambda: my_generator(3, 6), column_names=["data"])  
for d in dataset:  
    print(d)  

        运行结果:

        [Tensor(shape=[], dtype=Int64, value= 3)]

        [Tensor(shape=[], dtype=Int64, value= 4)]

        [Tensor(shape=[], dtype=Int64, value= 5)]

        打印时间:

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

        运行截图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++使用Poco库封装一个HTTP客户端类

0x00 前言 我们在使用HTTP协议获取接口数据时&#xff0c;通常需要在Header和Query中添加参数&#xff0c;还有一种就是在Body中追加XML或者JSON格式的数据。本文主要讲述使用Poco库提交HTTP Post请求的Body中附加XML格式的数据&#xff0c;JSON格式的数据类似。 0x01 HttpCl…

禹神electron学习~

最近时间比较富裕 咱们浅浅来学习下electron 视频在这禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 先看下流程模型 先决条件 首先第一步 查看你的node和npm版本 创建你的应用 创建一个文件夹 我创建的名称为my-electron-…

人工智能期末复习思维导图,参考人工智能及其应用(第6版)和柴玉梅老师教材

其中第一、六、七、八、九章不用重点看&#xff0c;计算题一般会考1.语义网络、谓词逻辑&#xff0c;2.可信度&#xff0c;3.主观贝叶斯&#xff0c;4.一般合一置换&#xff0c;5.证据理论&#xff0c;6.盲目搜索。 第一章&#xff1a;绪论 第二章&#xff1a;知识表示方法 第…

MQ - RabbitMQ、SpringAMQP --学习笔记

什么是MQ&#xff1f; MQ 是消息队列&#xff08;Message Queue&#xff09;的缩写&#xff0c;它是一种应用程序间异步通信的技术。消息队列允许应用程序或服务间通过发送消息来交换数据&#xff0c;而不是直接调用对方&#xff0c;从而实现解耦、异步处理和负载均衡等目的。…

无需高配置 怎么获得超流畅的VR体验?

传统VR眼镜在使用中存在一些显著不足&#xff0c;而实时渲染技术又是如何解决的&#xff1f;接下来与大家共同探讨遇到的问题以及实时渲染在VR眼镜中的实际应用。 1、高配置要求 目前主流VR一体机的眼镜需要较高配置才能运行普通VR内容&#xff0c;且受限于VR眼镜的算力限制&…

工作纪实51-手撸AB实验分流策略

前几天写了一篇关于哈希算法的文章&#xff0c;起源就是在构思AB实验平台的时候&#xff0c;用到了哈希&#xff0c;所以对其做了深入的了解 AB实验平台是一般互联网做策略、样式实验会用到的一个系统&#xff0c;一般开启某个实验之后&#xff0c;需要对线上流量进行分流&…

太速科技-FMC144 -八路 250MSPS 14bit AD FMC子卡

FMC144 -八路 250MSPS 14bit AD FMC子卡 一、板卡概述   FMC144是一款具有8通道模数转换器&#xff08;ADC&#xff09;的FMC卡&#xff0c;具有14bit分辨率&#xff0c;最大采样速率达250Msps。时钟配置芯片为AD9516-1&#xff0c;可由板载10MHz时钟提供参考&#xff0c;也可…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1&#xff0c;参数2&#xff0c;参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1&#xff1a;输出窗口归类使用&#xff0c;你写什么它就显示什么 参数2&#x…

node.js安装

下载地址 https://nodejs.org/en/download 安装教程

Stable Diffusion初体验——提示词指南

前言 Stable Diffusion是一种深度学习模型&#xff0c;它能够根据提示词生成高质量的图像。在Stable Diffusion模型中&#xff0c;提示词起着至关重要的作用&#xff0c;因为它们为模型提供了关于所需输出的指导。本文将探讨Stable Diffusion关于提示词的原理&#xff0c;包括…

k8s集群node节点加入失败

出现这种情况&#xff1a; [preflight] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yaml [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kub…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的链路。 链路(…

sheng的学习笔记-AI-K均值算法

ai目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识&#xff1a;聚类&#xff0c;可参考 sheng的学习笔记-聚类(Clustering)-CSDN博客 目录 什么是k均值算法 流程 伪代码 数据集 伪代码 代码解释 划分示意图 优化目标 随机初始化 选择聚类数…

酣客的“FFC模式”|白酒商业模式|分润制度顶层架构设计

酣客公社摒弃传统商业模式&#xff0c;提出“心联网”及“FFC模式”的商业模式。 坐标&#xff1a;厦门&#xff0c;我是肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 今天和大家分享“酣客”的营销模式&#xff…

Parallels Toolbox for mac(pd工具箱) 6.0.2激活版

Parallels Toolbox 是由 Parallels 公司开发的一款实用工具集合软件&#xff0c;它主要面向使用 Parallels Desktop 的用户&#xff0c;提供了许多方便用户在 macOS 和 Windows 之间进行切换和管理的工具。Parallels Desktop 是一款流行的虚拟化软件&#xff0c;允许用户在 mac…

【24医学顶刊】GANDALF:主动学习 + 图注意力变换器 + 变分自编码器,改善多标签图像分类

GANDALF&#xff1a;主动学习 图注意力变换器 变分自编码器&#xff0c;改善多标签图像分类 提出背景子解法1&#xff1a;多标签信息样本的选择子解法2&#xff1a;生成信息丰富且非冗余的合成样本 例子&#xff1a;胸部X射线图像分析传统方法的操作和局限GaNDLF方法的优势 工…

理解ABP的领域驱动设计

大家好&#xff0c;我是张飞洪&#xff0c;感谢您的阅读&#xff0c;我会不定期和你分享学习心得&#xff0c;希望我的文章能成为你成长路上的垫脚石&#xff0c;让我们一起精进。 关于玩转ABP框架相关的文章&#xff0c;之前在博客园陆续写了《ABP vNext系列文章和视频》&…

电路仿真王者之争:SmartEDA如何领跑业界,打破传统仿真软件格局?

在电子设计领域&#xff0c;电路仿真软件一直扮演着至关重要的角色。它们为工程师们提供了一个虚拟的实验室&#xff0c;可以在不耗费大量实际资源的情况下&#xff0c;进行电路设计、优化和测试。在众多电路仿真软件中&#xff0c;SmartEDA以其独特的优势&#xff0c;逐渐崭露…

嵌入式开发十九:SysTick—系统定时器

在前面实验中我们使用到的延时都是通过SysTick进行延时的。 我们知道&#xff0c;延时有两种方式&#xff1a;软件延时&#xff0c;即CPU 循环等待产生的&#xff0c;这个延时是不精确的。第二种就是滴答定时器延时&#xff0c;本篇博客就来介绍 STM32F4 内部 SysTick 系统定时…

浅谈API生态建设:API安全策略的6项原则

API作为连接系统与应用的桥梁&#xff0c;在助力实现高效业务流程的同时&#xff0c;也不可避免出现资产管理困难、敏感数据泄漏风险骤增等安全问题。前段时间&#xff0c;安全公司Fastly公布了一项重磅调查报告&#xff0c;报告中显示95%的企业在过去1年中遭遇过API安全问题。…