昇思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.rhkb.cn/news/364302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离的后台管理系统开发模板(带你从零开发一套自己的若依框架)上

前言&#xff1a; 目前&#xff0c;前后端分离开发已经成为当前web开发的主流。目前最流行的技术选型是前端vue3后端的spring boot3&#xff0c;本次。就基于这两个市面上主流的框架来开发出一套基本的后台管理系统的模板&#xff0c;以便于我们今后的开发。 前端使用vue3ele…

Web前端

网页开发学习内容:html css JavaScript 两个框架:VUE.js ElementUI UI->user interface 用户界面 html(HyperText Markup Language):超文本标记语言 文本:文字 字符 超文本:网页内容 标记:标签 标识 例如商品上的标签,介绍了商品的信息 html语言就是一种标记语言,提供…

AWS云中的VPC启用流日志保存S3(AWS中国云)

问题 需要在AWS中国云中对VPC启用流日志操作。 步骤 创建s3桶 这里设置一个s3桶名&#xff0c;创建即可。如果出现已存在具有相同名称的存储桶错误&#xff0c;就换个桶名再试一试吧。 启用vpc流日志 找到vpc流日志入口操作&#xff0c;如下图&#xff1a; 设置vpc流日志…

eBPF技术揭秘:DeepFlow如何引领故障排查,提升运维效率

DeepFlow 实战&#xff1a;eBPF 技术如何提升故障排查效率 目录 DeepFlow 实战&#xff1a;eBPF 技术如何提升故障排查效率 微服务架构系统中各个服务、组件及其相互关系的全景 零侵扰分布式追踪&#xff08;Distributed Tracing&#xff09;的架构和工作流程 关于零侵扰持…

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

微机原理 复习

第一章导论 1.3 冯诺依曼体系结构 &#xff08;1&#xff09;以二进制形式表示指令和数据 &#xff08;2&#xff09;程序和数据事先放在存储器中&#xff08;预存储&#xff09; &#xff08;3&#xff09;由运算器、控制器、输入设备和输出设备五大部件组成 字长、主频…

Java8新特性stream的原理和使用

这是一种流式惰性计算&#xff0c;整体过程是&#xff1a; stream的使用也异常方便&#xff0c;可以对比如List、Set之类的对象进行流式计算&#xff0c;挑出最终想要的结果&#xff1a; List<Timestamp> laterTimes allRecords.stream().map(Record::getTime).filter…

【摄像头标定】双目摄像头标定及矫正-opencv(python)

双目摄像头标定及矫正 棋盘格标定板标定矫正 棋盘格标定板 本文使用棋盘格标定板&#xff0c;可以到这篇博客中下载&#xff1a;https://blog.csdn.net/qq_39330520/article/details/107864568 标定 要进行标定首先需要双目拍的棋盘格图片&#xff0c;20张左右&#xff0c;…

30 哈希的应用

位图 概念 题目 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何判断一个数是否在这40亿个整数中 1.遍历&#xff0c;时间复杂度O(N) 2.二分查找&#xff0c;需要先排序&#xff0c;排序(N*logN)&#xff0c;二分查找&#xff0c;logN。…

装载问题(回溯法)

#include<iostream> using namespace std; int n;//货物的数量 int c;//轮船的总的载重量 int cw;//轮船当前的载重量 int r;//货物的总重量 int w[1000];//n个货物各自的重量 int x[1000];//当前最优解 int bestx[1000];//最优解 int bestw;//货物的最优载重量 void Bac…

[JS]对象

介绍 对象是一种无序的数据集合, 可以详细的描述某个事物 事物的特征在对象中用属性来表示, 事物的行为在对象中用方法来表示 使用 创建对象 let 对象名 {属性名&#xff1a;值&#xff0c;方法名&#xff1a;函数&#xff0c; } let 对象名 new Object(); 对象名.属性…

Typora failed to export as pdf. undefined

变换版本并没有用&#xff0c;调整图片大小没有用 我看到一个博客后尝试出方案 我的方法 解决&#xff1a;从上图中的A4&#xff0c;变为其他&#xff0c;然后变回A4 然后到处成功&#xff0c;Amazing&#xff01; 参考&#xff1a; Typora 导出PDF 报错 failed to export…

Rpc服务的提供方(Rpcprovider)的调用流程

首先&#xff0c;服务的提供方&#xff0c;会通过rpcprovider向rpc服务方注册rpc服务对象和服务方法&#xff0c; 那么&#xff0c;我们通过protobuf提供的抽象层的service和method&#xff0c;将服务对象和它所对应的服务方法记录在map表中&#xff0c; 当它启动以后&#xff…

WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)

0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…

LONGAGENT:优化大模型处理长文本

现有的大模型&#xff08;LLMs&#xff09;&#xff0c;尽管在语言理解和复杂推理任务上取得了显著进展&#xff0c;但在处理这些超长文本时却常常力不从心。它们在面对超过10万令牌的文本输入时&#xff0c;常常会出现性能严重下降的问题&#xff0c;这被称为“中间丢失”现象…

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…

互联网直播/点播技术与平台创新应用:视频推拉流EasyDSS案例分析

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

嵌入式Linux系统编程 — 4.7 regcomp、regexec、regfree正则表达式函数

目录 1 为什么需要正则表达式 2 正则表达式简介 3 正则表达式规则 4 regcomp、regexec、regfree函数 4.1 函数介绍 4.2 URL格式案例 1 为什么需要正则表达式 在许多的应用程序当中&#xff0c; 有这样的应用场景&#xff1a; 给定一个字符串&#xff0c;检查该字符串是否…

【小学期】常用基于Swing的七个静态界面

示例1&#xff1a;基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…

5个大气的wordpress付费主题

Sesko赛斯科wordpress外贸主题 适合用于重型机械设备公司建外贸官方网站的橙红色wordpress外贸主题。 https://www.jianzhanpress.com/?p5886 Polar钋啦wordpress外贸主题 制造业wordpress网站模板&#xff0c;适合生产制造企业官方网站使用的wordpress外贸主题。 https:/…