昇思MindSpore学习总结二——张量

1、张量

        张量tensor表示的是一个多维的矩阵,比如零维就是一个点,一维就是向量,二维就是一般的矩阵,多维就相当于一个多维的数组,这和numpy是对应的,而且PyTorch的Tensor和numpy的ndarray可以相互转换,唯一不同的是PyTorch可以在GPU上运行,而numpy的ndarray只能在CPU上运行。

        调用mindspore网络进行张量的相关应用,需要安装相应版本的mindspore。这里的话,需要根据前面的安装方法,安装mindspore。之前安装过就不用管了。

# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14

2、创建张量

        这里引入numpy、mindspore相应库。

import numpy as np
import mindspore
from mindspore import ops
from mindspore import Tensor, CSRTensor, COOTensor

2.1 直接创建

        可以根据数据创建张量,数据类型可以设置或者通过框架自动推断。

data = [1, 0, 1, 0]
x_data = Tensor(data)
#查看数据、形状、类型
print(x_data, x_data.shape, x_data.dtype)

运行结果

2.2 numpy数组生成

np_array = np.array(data)
x_np = Tensor(np_array)
print(x_np, x_np.shape, x_np.dtype)

运行结果

2.3 使用init初始化器构建

        使用init初始化器对张量进行初始化,支持参数有init、shape、dtype。

        init:支持传入initializer的子类,实际使用时会调用相应的类。 init 的值可以是“normal(生成一个服从正态分布 𝑁(sigma,mean) 的随机数组用于初始化Tensor)”、“noes(生成一个值全为1的常量数组用于初始化Tensor。)”或“zeros”等。

        shape:支持传入list、tuple、int。

        dtype:支持传入mindspore.dtype(int, uint, float数据类型)

from mindspore.common.initializer import One, Normal# Initialize a tensor with ones
tensor1 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=One())
# Initialize a tensor from normal distribution
tensor2 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=Normal())print("tensor1:\n", tensor1)
print("tensor2:\n", tensor2)

2.4 继承另一个张量的属性,形成新的张量。

from mindspore import opsx_ones = ops.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")x_zeros = ops.zeros_like(x_data)
print(f"Zeros Tensor: \n {x_zeros} \n")

        这里就是继承了前面x_data张量的属性,构造了一个全是1和全是0的张量。

3、张量的属性

        张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。

- 形状(shape):`Tensor`的shape,是一个tuple。

- 数据类型(dtype):`Tensor`的dtype,是MindSpore的一个数据类型。

- 单个元素大小(itemsize): `Tensor`中每一个元素占用字节数,是一个整数。

- 占用字节数量(nbytes): `Tensor`占用的总字节数,是一个整数。

- 维数(ndim): `Tensor`的秩,也就是len(tensor.shape),是一个整数。

- 元素个数(size): `Tensor`中所有元素的个数,是一个整数。

- 每一维步长(strides): `Tensor`每一维所需要的字节数,是一个tuple。

x = Tensor(np.array([[1, 2], [3, 4]]), mindspore.int32)print("x_shape:", x.shape)
print("x_dtype:", x.dtype)
print("x_itemsize:", x.itemsize)
print("x_nbytes:", x.nbytes)
print("x_ndim:", x.ndim)
print("x_size:", x.size)
print("x_strides:", x.strides)

4、张量的索引

        Tensor索引与Numpy索引类似,索引从0开始编制,负索引表示按倒序编制,冒号`:`和 `...`用于对数据进行切片。

tensor = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))print("First row: {}".format(tensor[0]))
print("value of bottom right corner: {}".format(tensor[1, 1]))
print("Last column: {}".format(tensor[:, -1]))
print("First column: {}".format(tensor[..., 0]))

5、张量运算

        张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似,下面介绍其中几种操作。

5.1 普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。

x = Tensor(np.array([1, 2, 3]), mindspore.float32)
y = Tensor(np.array([4, 5, 6]), mindspore.float32)output_add = x + y
output_sub = x - y
output_mul = x * y
output_div = y / x
output_mod = y % x
output_floordiv = y // xprint("add:", output_add)
print("sub:", output_sub)
print("mul:", output_mul)
print("div:", output_div)
print("mod:", output_mod)
print("floordiv:", output_floordiv)

5.2 concat 将给定维度上的一系列张量连接起来。

        concat是mindspore.ops.cat(tensorsaxis=0)别名。在指定轴上拼接输入Tensor。

        输入的是一个tuple或list。其元素秩相同,即 𝑅 。将给定的轴设为 𝑚 ,并且 0≤𝑚<𝑅 。输入元素的数量设为 𝑁 。对于第 𝑖 个数据, 𝑡𝑖 的shape为 (𝑥1,𝑥2,...,𝑥𝑚𝑖,...,𝑥𝑅) 。 𝑥𝑚𝑖 是第 𝑡𝑖 个元素的第 𝑚 个维度。则,输出Tensor的shape为:

【参数】

  • tensors (Union[tuple, list]) - 输入为Tensor组成的tuple或list。假设在这个tuple或list中有两个Tensor,即 t1 和 t2 。要在0轴方向上执行 Concat ,除 0 轴外,其他轴的shape都应相等,即 𝑡1.𝑠ℎ𝑎𝑝𝑒[1]=𝑡2.𝑠ℎ𝑎𝑝𝑒[1],𝑡1.𝑠ℎ𝑎𝑝𝑒[2]=𝑡2.𝑠ℎ𝑎𝑝𝑒[2],...,𝑡1.𝑠ℎ𝑎𝑝𝑒[𝑅−1]=𝑡2.𝑠ℎ𝑎𝑝𝑒[𝑅−1] ,其中 𝑅 是Tensor的秩。

  • axis (int) - 表示指定的轴,取值范围是 [−𝑅,𝑅) 。默认值: 0 

data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
output = ops.concat((data1, data2), axis=0)print(output)
print("shape:\n", output.shape)

5.3 stack 从另一个维度上将两个张量合并起来。

        mindspore.ops.stack(tensorsaxis=0)

        在指定轴上对输入Tensor序列进行堆叠。

输入秩为 R 的Tensor序列,则输出秩为 (R+1) 的Tensor。给定输入Tensor的shape为 (𝑥1,𝑥2,...,𝑥𝑅) 。若输入Tensor的长度为 N 。如果存在 𝑎𝑥𝑖𝑠≥0 ,则输出Tensor的shape为 (𝑥1,𝑥2,...,𝑥𝑎𝑥𝑖𝑠,𝑁,𝑥𝑎𝑥𝑖𝑠+1,...,𝑥𝑅) 。

【参数】

  • tensors (Union[tuple, list]) - 输入多个Tensor对象组成的tuple或list,每个Tensor具有相同shape和数据类型。

  • axis (int) - 指定堆叠运算的轴。取值范围为[-(R+1), R+1)。默认值: 0 。

data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
output = ops.stack([data1, data2])print(output)
print("shape:\n", output.shape)

6、tensor 与 numpy转换

6.1 tensor转换为numpy

        与张量创建相同,使用 Tensor.asnumpy() 将Tensor变量转换为NumPy变量。

t = Tensor([1., 1., 1., 1., 1.])
print(f"t: {t}", type(t))
n = t.asnumpy()
print(f"n: {n}", type(n))

6.2 numpy转换为tensor

        使用Tensor()将NumPy变量转换为Tensor变量。

n = np.ones(5)
t = Tensor.from_numpy(n)
np.add(n, 1, out=n)
print(f"n: {n}", type(n))
print(f"t: {t}", type(t))

7、稀疏张量

        稀疏张量跟稀疏矩阵相同,其中大部分元素的值为零。

        在某些应用场景中(比如推荐系统、分子动力学、图神经网络等),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算、存储和通讯开销。这时就可以使用稀疏张量来表征这些数据。

        MindSpore现在已经支持最常用的CSRCOO两种稀疏数据格式。

        常用稀疏张量的表达形式是<indices:Tensor, values:Tensor, shape:Tensor>。其中,indices表示非零下标元素, values表示非零元素的值,shape表示的是被压缩的稀疏张量的形状。在这个结构下,我们定义了三种稀疏张量结构:CSRTensorCOOTensorRowTensor

7.1 CSRTensor

         mindspore.CSRTensor(indptr=Noneindices=Nonevalues=Noneshape=Nonecsr_tensor=None)

  CSR(Compressed Sparse Row)稀疏张量格式有着高效的存储与计算的优势。其中,非零元素的值存储在values中,非零元素的位置存储在indptr(行)和indices(列)中。各参数含义如下:

  • indptr: 一维整数张量, 表示稀疏数据每一行的非零元素在values中的起始位置和终止位置, 索引数据类型支持int16、int32、int64。

  • indices: 一维整数张量,表示稀疏张量非零元素在列中的位置, 与values长度相等,索引数据类型支持int16、int32、int64。

  • values: 一维张量,表示CSRTensor相对应的非零元素的值,与indices长度相等。

  • shape: 表示被压缩的稀疏张量的形状,数据类型为Tuple,目前仅支持二维CSRTensor

        用来表示某一Tensor在给定索引上非零元素的集合,其中行索引由 indptr 表示,列索引由 indices 表示,非零值由 values 表示。

        如果 indptr 是[0, 1, 2, 2], indices 是[1, 2], values 是[1., 2.], shape 是(3, 4),那么它对应的稠密Tensor如下:

indptr = Tensor([0, 1, 2])
indices = Tensor([0, 1])
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (2, 4)# Make a CSRTensor
csr_tensor = CSRTensor(indptr, indices, values, shape)print(csr_tensor.values)
print(csr_tensor.indices)
print(csr_tensor.shape)
print(csr_tensor.astype(mindspore.float64).dtype)pe)

7.2 COOTensor

        mindspore.COOTensor(indices=Nonevalues=Noneshape=Nonecoo_tensor=None)

  • indices (Tensor) - shape为 (𝑁,𝑛𝑑𝑖𝑚𝑠) 的二维整数Tensor,其中N和ndims分别表示稀疏Tensor中 values 的数量和COOTensor维度的数量。目前 ndims 只能为2。请确保indices的值在所给shape范围内。支持的数据类型为int16, int32和int64。默认值: None 。

  • values (Tensor) - shape为 (𝑁) 的一维Tensor,用来给 indices 中的每个元素提供数值。默认值: None 。

  • shape (tuple(int)) - shape为 (𝑛𝑑𝑖𝑚𝑠) 的整数元组,用来指定稀疏矩阵的稠密shape。默认值: None 。

  • coo_tensor (COOTensor) - COOTensor对象,用来初始化新的COOTensor。默认值: None 。

        对一个稠密Tensor dense 来说,它对应的COOTensor(indices, values, shape),满足 dense[indices[i]] = values[i] 。

        如果 indices 是[[0, 1], [1, 2]], values 是[1, 2], shape 是(3, 4),那么它对应的稠密Tensor如下:

indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (3, 4)# Make a COOTensor
coo_tensor = COOTensor(indices, values, shape)print(coo_tensor.values)
print(coo_tensor.indices)
print(coo_tensor.shape)
print(coo_tensor.astype(mindspore.float64).dtype)  # COOTensor to float64

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

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

相关文章

Python | Leetcode Python题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution:def dfs(self, grid, r, c):grid[r][c] 0nr, nc len(grid), len(grid[0])for x, y in [(r - 1, c), (r 1, c), (r, c - 1), (r, c 1)]:if 0 < x < nr and 0 < y < nc and grid[x][y] "1":self.d…

MyBatis(7)MyBatis 是如何进行分页

MyBatis 本身没有内置的分页处理&#xff0c;但它提供了使用分页插件或通过手动编写分页SQL语句的机制来实现分页功能。分页插件如 PageHelper 是常用来与 MyBatis 配合进行分页的工具。 手动分页 在不使用分页插件的情况下&#xff0c;可以通过编写特定的分页SQL语句来手动实…

【论文速读】|MEDFUZZ:探索大语言模型在医学问题回答中的鲁棒性

本次分享论文&#xff1a;MEDFUZZ: EXPLORING THE ROBUSTNESS OF LARGE LANGUAGE MODELS IN MEDICAL QUESTION ANSWERING 基本信息 原文作者&#xff1a;Robert Osazuwa Ness, Katie Matton, Hayden Helm, Sheng Zhang, Junaid Bajwa, Carey E. Priebe, Eric Horvitz 作者单…

Lua博客网站支持搜索、评论、登录注册

该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述&#xff1a;开源Lua网站开发服务(FastWeb)支持&#xff1a;注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示&#xff1a;

Java之线程相关应用实现

后台线程 一个进程中只有后台进程运行&#xff0c;该进程将会结束。 新创建的线程默认为前台线程&#xff0c;Java中只要有一个前台线程运行&#xff0c;就不会结束程序&#xff0c;如果只有后台线程运行&#xff0c;程序就会结束&#xff0c;可以在线程对象启动前执行setDae…

【js + ckeditor】插入base64格式的图片

一、需求说明 直接把图片转成base64插入到富文本 二、需求分析 1、富文本图片格式处理位置 在ckeidtor的目录下有个plugins文件夹&#xff0c;在plugins下新建一个文件夹&#xff08;自己命名&#xff0c;如simpleupload&#xff09;&#xff0c;进入simpleupload文件夹&…

《Windows API每日一练》6.3 非客户区鼠标消息

上一节我们讨论客户区的鼠标消息&#xff0c;本节我们讨论非客户区鼠标消息。如果鼠标位于窗口内部除客户区外的其他区域&#xff0c;Windows就会向窗口过程发送一个“非客户区”鼠标消息。窗口的非客户区包括标题栏、菜单和窗口滚动条。 本节必须掌握的知识点&#xff1a; 非…

微服务和kafka

一、微服务简介 1.单体架构 分布式--微服务--云原生 传统架构&#xff08;单机系统&#xff09;&#xff0c;一个项目一个工程&#xff1a;比如商品、订单、支付、库存、登录、注册等等&#xff0c;统一部署&#xff0c;一个进程 all in one的架构方式&#xff0c;把所有的…

深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中&#xff0c;反射是一种强大的特性&#xff0c;它可以支持程序在运行时查询和调用对象的属性和方法。 但是在C中&#xff0c;没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。 上一篇文章写了个简单的反射功能&#xff0c;这回完善一下&a…

Vue3实现记住密码功能

1.首先安装 js-cookie、jsencrypt npm i js-cookie // 使用Cookie来实现记住密码功能 npm i jsencrypt //使用jsencrypt进行加密解密 2.完整代码 注:在此我使用了ant-design-vue组件库 若使用源码请自行配置ant-design-vue <template><h2 :style"{margin…

3.PyQt6常用基本控件

目录 常用控件 1.文本类控件 1.QLable标签控件 1.设置标签文本 2.设置标签文本和对齐方式 3.换行显示 4.添加超链接 5.为标签设置图片 6.获取标签文本 2.QLineEdit单行文本控件 3.QTextEdit多行富文本控件 4.QPlainTextEdit纯文本控件 5.QSpinBox整数数字选择控件 …

开发板以电脑为跳板连接互联网

标题 开发板以电脑为跳板连接互联网网络共享方式桥接方式 开发板以电脑为跳板连接互联网 分享下用网线直连电脑的开发板如何以电脑为跳板连接互联网的两个方法。 网络共享方式桥接方式 补充下&#xff0c;我的电脑连接的是无线网络&#xff0c;开发板和电脑是用网线进行连接的…

【第3章】MyBatis-Plus持久层接口之Service Interface(上)

文章目录 前言一、save1. 示例&#xff08;save&#xff09;2. 示例&#xff08;saveBatch&#xff09;3. 示例&#xff08;saveBatch 指定批次大小&#xff09; 二、saveOrUpdate1.示例&#xff08;saveOrUpdate&#xff09;2.示例&#xff08;saveOrUpdateBatch&#xff09;3…

Python 高级编程:文件操作与错误处理

在前几篇文章中&#xff0c;我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够&#xff0c;但对于需要分析大数据的人来说&#xff0c;这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…

GPTs与Assistant API:哪一个更适合您?

梗概 主要讲解了OpenAI推出的两种不同的人工智能工具——GPTs和Assistant API&#xff0c;并比较了它们各自的特点和适用场景&#xff0c;帮助用户选择最适合自己需求的工具。 GPTs&#xff08;生成预训练变换模型&#xff09; 核心特点&#xff1a; 生成能力&#xff1a;GPTs…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

【嵌入式Linux】i.MX6ULL GPIO 中断服务函数注册与编写

文章目录 1 外部中断初始化与中断服务函数1.2 外部中断初始化函数 exti_init1.2.1 GPIO引脚配置1.2.2 中断使能与注册1.2.3 GIC_EnableIRQ()函数的分析 1.3 中断服务函数 gpio1_io20_irqhandler1.3.1 消抖处理1.3.2 中断事件处理1.3.3 清除中断标志 2 BUG处理2.1 问题描述2.2 解…

网易Filmly网盘影片播放器安卓TV版

我们在观看网盘内的影视时&#xff0c;想要高清/原画质观看视频&#xff0c;甚至倍速功能往往都需要开通网盘会员才可以&#xff0c;否则你只能使用”马赛克”画质观看。 最近网易上线了一款播放器&#xff1a;Filmly &#xff0c;它支持直连网盘影视资源&#xff0c;可以高速…

Optional避免判空嵌套过多,优雅解决空指针异常

背景 最近在处理json文件反序列化为实体类的时候&#xff0c;抛出空指针异常&#xff0c;发现很多地方没有判空逻辑。 增加判空逻辑后&#xff0c;嵌套太多导致代码很臃肿&#xff0c;因此学习用Optional来进行优化代码&#xff0c;增加可读性。 Optional使用场景 1. map自动…

深入理解计算机系统 CSAPP 家庭作业7.12

A:refptr (unsigned)(ADDR(r.symbol) r.addend - refaddr) 0x4004f8 (-4) - 0x4004ea 0xa B:refaddr 0x4004d0 0xa 0x4004da refptr 0x400500 (-4) - 0x4004da 0x22 ​​​​​​​