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

news2024/11/26 1:28:08

导入数据集相关库和类


        首先,导入了 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.coloradmin.cn/o/1873375.html

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

相关文章

感染与疾病,感染的逐步进阶以及伴随的疾病发展

病原微生物和/或有害微生物成功入侵、繁殖并定居于宿主的体内或体内&#xff0c;从而导致健康障碍&#xff0c;称为感染。简单地说&#xff0c;它可以定义为由微生物引起的疾病。感染也被称为传染病或传染病或传染性疾病。 感染每年导致 1300多万 人死亡&#xff1b;2019 年死亡…

Liunx部署java项目Tomcat、Redis、Mysql教程

常用命令 查看,停止服务 服务进程情况&#xff0c;这里拿redis服务举例,其他服务查询更改名字即可 ps -ef|grep redis端口号是否被占用 lsof -i :6379显示tcp的端口和进程等相关情况 netstat -tnlp强制停止服务 kill -9 pidnum 防火墙 查看是否安装了firewalld sudo system…

Open WebUI升级到最新版本

背景介绍 open-webui是一个用于构建Web用户界面的开源库&#xff0c;它仿照 ChatGPT 的图形化界面&#xff0c;可以非常方便的调试、调用本地大语言模型。 目前该开源库更新较为活跃&#xff0c;从3个月前的版本&#xff08;v0.1.108&#xff09;到截止到2024年6月中旬发布的…

全网最详细Gradio教程系列——Gradio的安装与运行

全网最详细Gradio教程系列——Gradio的安装与运行 前言实战导论&#xff1a;2. Gradio的安装与运行2.1 安装2.1.1 Windows安装Gradio2.1.2 MacOS/Linux安装Gradio 2.2 运行2.2.1 普通方式运行2.2.2 热重载运行2.2.2.1 命令行式热重载2.2.2.2 Notebook热重载2.2.2.3 控制热重载 …

【LLM 论文】Self-Refine:使用 feedback 迭代修正 LLM 的 output

论文&#xff1a;Self-Refine: Iterative Refinement with Self-Feedback ⭐⭐⭐⭐ CMU, NeurIPS 2023, arXiv:2303.17651 Code: https://selfrefine.info/ 论文速读 本文提出了 Self-Refine 的 prompt 策略&#xff0c;可以在无需额外训练的情况下&#xff0c;在下游任务上产…

Python应用开发——30天学习Streamlit Python包进行APP的构建(11)

st.bokeh_chart 显示互动式虚化图。 Bokeh 是 Python 的一个图表库。此函数的参数与 Bokeh 的 show 函数的参数非常接近。有关 Bokeh 的更多信息,请访问 https://bokeh.pydata.org。 要在 Streamlit 中显示 Bokeh 图表,请在调用 Bokeh 的 show 时调用 st.bokeh_chart。 Fu…

Jmeter 进行http接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现。 Jmeter工具设计之初是用于做性…

Qt项目实战[MP3音乐播放器搜索引擎]

MP3音乐播放器搜索引擎(设计与实现) 一、MP3音乐播放器搜索引擎(开发环境) 1:操作系统: Windows10 x64专业版。 2:开发工具: Qt 5.12.8。 3:网易云音乐官方API接口: https://neteasecloudmusicapi.js.org/#/?id%e7%99%bb%e5%bd%95 二、MP3音乐播放器搜索引擎(功能模块) …

动手学深度学习(Pytorch版)代码实践 -计算机视觉-40目标检测和边界框

40目标检测和边界框 import torch from PIL import Image import matplotlib.pylab as plt from d2l import torch as d2lplt.figure(catdog) img Image.open(../limuPytorch/images/catdog.jpg) plt.imshow(img) plt.show()# 边界框 #save def box_corner_to_center(boxes):…

HSRP热备份路由协议(VRRP虚拟路由冗余协议)配置以及实现负载均衡

1、相关原理 在网络中&#xff0c;如果一台作为默认网关的三层交换机或者路由器损坏&#xff0c;所有使用该网关为下一跳的主机通信必然中断&#xff0c;即使配置多个默认网关&#xff0c;在不重启终端的情况下&#xff0c;也不能彻底换到新网关。Cisco提出了HSRP热备份路由协…

写一个坏越的小世界(六)

blog基本已经接近尾声了&#xff0c;稍微再润色下。比如天气模块 这边加一个天气小图标&#xff0c;应该会好点吧~ 当不同天气的时候可以显示不同的图标 介绍这边加了个滚球特效。虽然看着还不是很好看&#xff0c;先凑合着吧 整了个开关灯按钮&#xff0c;可以切换黑白主题 …

Educational Codeforces Round 112 (Rated for Div. 2) C. Coin Rows(构造 + 贪心 + 前缀和)

可以知道爱丽丝的路径是拐两次弯的折线 那么我们知道鲍勃能够选择的位置只有两段黄线中的一段 所以可以求出来第二行的后缀和&#xff0c;然后求出来第一行的前缀行&#xff0c;这样鲍勃在爱丽丝分割之后的情况下就会选择这两者中最大的一段&#xff0c;然而爱丽丝也会阻碍鲍…

RabbitMQ实践——搭建单人聊天服务

大纲 创建Core交换器用户登录发起聊天邀请接受邀请聊天实验过程总结代码工程 经过之前的若干节的学习&#xff0c;我们基本掌握了Rabbitmq各个组件和功能。本文我们将使用之前的知识搭建一个简单的单人聊天服务。 基本结构如下。为了避免Server有太多连线导致杂乱&#xff0c;下…

竞赛选题 python+大数据校园卡数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…

5款提高工作效率的免费工具推荐

SimpleTex SimpleTex是一款用于创建和编辑LaTeX公式的简单工具。它能够识别图片中的复杂公式并将其转换为可编辑的数据格式。该软件提供了一个直观的界面&#xff0c;用户可以在编辑LaTeX代码的同时实时预览公式的效果&#xff0c;无需额外的编译步骤。此外&#xff0c;SimpleT…

VS对齐代码格式

制表符Tab与空格有所区别&#xff0c;如果用到Tab键进行格式对齐&#xff0c;后续回车键自动对齐代码格式&#xff0c;在提交git时将明显看到Tab制表符&#xff0c;影响代码观感。例如&#xff0c;可能就长下面这个样子&#xff1a; 解决方式&#xff1a;CtrlF-->输入Tab转义…

Android学习

安卓期末考题复习 知识点总结 View 布局管理 线性布局 实现垂直或者水平布局。 orientation属性控制控件排列方向&#xff0c;包含两个属性值&#xff1a;vertical(垂直)、horizontal(水平)&#xff1b;weight属性表示权重。 相对布局 根据控件之间的相对位置进行布局。…

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

图数据库 vs 向量数据库

最近大模型出来之后&#xff0c;向量数据库重新翻红&#xff0c;业界和市场上有不少声音认为向量数据库会极大的影响图数据库&#xff0c;图数据库市场会萎缩甚至消失&#xff0c;今天就从技术原理角度来讨论下图数据库和向量数据库到底差别在哪里&#xff0c;适合什么场景&…

广和通 OpenCPU 二次开发(一) —— 串口

广和通 OpenCPU 二次开发&#xff08;一&#xff09; —— 串口 1.port&#xff0c;端口号2.引脚序列号对应芯片引脚图找&#xff0c;也可以对照GPIO功能复用表找3.要复用的pin脚对应的功能mode根据GPIO功能复用表选择 一、核心配置## 标题代码 int port 1; fibo_gpio_mode_s…