昇思25天学习打卡营第2天|基础知识-张量

目录

张量

张量Tensor的介绍

创建张量

 张量的属性

张量索引 

张量运算 

Tensor与NumPy转换

Tensor转换为NumPy

 NumPy转换为Tensor

稀疏张量

CSRTensor

COOTensor


张量

张量Tensor的介绍

张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。

这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。

其坐标在 𝑛𝑛 维空间内,有  n^r 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。𝑟 称为该张量的秩或阶(与矩阵的秩和阶均无关系)。

张量是一种特殊的数据结构,与数组和矩阵非常相似。

在MindSpore网络运算中,张量(Tensor)是一种基本数据结构

创建张量

张量的创建方式有多种,构造张量时,支持传入Tensorfloatintbooltuplelistnumpy.ndarray类型。

1. 根据数据直接生成

2. 从NumPy数组生成

3. 使用init初始化器构造张量

4. 继承另一个张量的属性,形成新的张量

1. 根据数据直接生成

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

data = [1, 0, 1, 0]
x_data = Tensor(data)
print(x_data, x_data.shape, x_data.dtype)# [1 0 1 0] (4,) Int64

2. 从NumPy数组生成

data = [1, 0, 1, 0]
np_array = np.array(data)
x_np = Tensor(np_array)
print(x_np, x_np.shape, x_np.dtype)# [1 0 1 0] (4,) Int64

3. 使用init初始化器构造张量

当使用init初始化器对张量进行初始化时,支持传入的参数有initshapedtype

  • init: 支持传入initializer的子类。如:下方示例中的 One() 和 Normal()。

  • shape: 支持传入 listtuple、 int

  • dtype: 支持传入mindspore.dtype。

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)# 
# tensor1:
# [[1. 1.]
# [1. 1.]]
# tensor2:
# [[-0.00063482 -0.00916224]
# [ 0.01324238 -0.0171206 ]]

init主要用于并行模式下的延后初始化,在正常情况下不建议使用init对参数进行初始化。 

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")# Ones Tensor: 
# [1 1 1 1] # Zeros Tensor: 
# [0 0 0 0] 

 张量的属性

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

  • 形状(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) 
#  x_shape: (2, 2)# 数据类型
print("x_dtype:", x.dtype)
# x_dtype: Int32# 单个元素大小(itemsize): Tensor中每一个元素占用字节数,是一个整数
print("x_itemsize:", x.itemsize)
# x_itemsize: 4# 占用字节数量(nbytes): Tensor占用的总字节数,是一个整数。
print("x_nbytes:", x.nbytes)
# x_nbytes: 16# 维数(ndim): Tensor的秩,也就是len(tensor.shape),是一个整数。
print("x_ndim:", x.ndim)
# x_ndim: 2# 元素个数(size): Tensor中所有元素的个数,是一个整数。
print("x_size:", x.size)
# x_size: 4# 每一维步长(strides): Tensor每一维所需要的字节数,是一个tuple。
print("x_strides:", x.strides)
# x_strides: (8, 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]))

张量运算 

张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等

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)
# add: [5. 7. 9.]print("sub:", output_sub)
# sub: [-3. -3. -3.]print("mul:", output_mul)
# mul: [ 4. 10. 18.]print("div:", output_div)
# div: [4.  2.5 2. ]print("mod:", output_mod)
# mod: [0. 1. 0.]print("floordiv:", output_floordiv)
# floordiv: [4. 2. 2.]

2. concat:将给定维度上的一系列张量连接起来 

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)
# [[0. 1.]
#  [2. 3.]
#  [4. 5.]
#  [6. 7.]]print("shape:\n", output.shape)
# shape: (4, 2)

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

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)# [[[0. 1.]
#  [2. 3.]]# [[4. 5.]
#  [6. 7.]]]# shape: (2, 2, 2)

Tensor与NumPy转换

Tensor转换为NumPy

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

t = Tensor([1., 1., 1., 1., 1.])
print(f"t: {t}", type(t))
# t: [1. 1. 1. 1. 1.] <class 'mindspore.common.tensor.Tensor'>
n = t.asnumpy()
print(f"n: {n}", type(n))
# n: [1. 1. 1. 1. 1.] <class 'numpy.ndarray'>

 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))
# n: [2. 2. 2. 2. 2.] <class 'numpy.ndarray'>print(f"t: {t}", type(t))
# t: [2. 2. 2. 2. 2.] <class 'mindspore.common.tensor.Tensor'>

n = np.ones(5):这行代码创建了一个长度为5的数组 n,数组中的每个元素都是1。

np.add(n, 1, out=n):这行代码调用了 np.add 函数,该函数用于对数组进行元素级的加法运算。这里,它被用来将数组 n 中的每个元素与标量1相加。out=n 参数指定了输出数组,即加法操作的结果应该被存储回原数组 n 中。

执行这行代码后,n 数组中的每个元素都会从1增加到2,因为每个元素都被加上了1。所以,最终 n 数组的内容会是 [2, 2, 2, 2, 2]

这种方式是 NumPy 中原地修改数组内容的常用方法之一,可以节省内存和计算资源,因为它避免了创建额外的数组来存储中间结果。

稀疏张量

稀疏张量是一种特殊张量,其中绝大部分元素的值为零。

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

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

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

CSRTensor

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

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

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

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

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

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.astype(mindspore.float64).dtype)
# Float64

生成结果:

COOTensor

COO(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N,被压缩的张量的维数为ndims。各参数含义如下:

  • indices: 二维整数张量,每行代表非零元素下标。形状:[N, ndims], 索引数据类型支持int16、int32、int64。

  • values: 一维张量,表示相对应的非零元素的值。形状:[N]

  • shape: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor

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)
# [1. 2.]print(coo_tensor.indices)
# [[0 1]
#  [1 2]]print(coo_tensor.shape)
# (3, 4)print(coo_tensor.astype(mindspore.float64).dtype)  # COOTensor to float64
# Float64

生成结果:

学习第二天打卡

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

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

相关文章

探索 SPL-404 协议标准:NFT 与 DeFi 的融合

在快速发展的数字资产领域中&#xff0c;NFT 协议标准持续演变&#xff0c;改变了我们对数字所有权和互动方式的理解。从 Art 到 Gamefi 等等&#xff0c;NFT 已经演变成数字经济的重要组成部分&#xff0c;吸引了广泛关注。遵循 ERC404 协议&#xff0c;SPL404 概念在 Solana …

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…

for循环计算1~100之间3的倍数的数字之和

你要计算1~100之间的数字先得打印出来1~100之间的数字然后在判断是不是3的倍数然后在打印出数字&#xff0c;代码如下 #include<stdio.h> int main() {int i 0;for (i 1; i < 100; i){if (i % 3 0){printf("%d ", i);}}return 0; }

平面点云三角化边数与点的关系

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 点云三角化定义 原文 说人话&#xff1a; 一个二维平面点集P三角化结果是一个满足以下条件的三角形集合&#xff1a; 1 所有三角形的并集刚好是P的凸包。 2 所有三角…

反向代理和负载均衡

目录 步骤1 代理技术介绍 代理技术常见的类型 正向代理的用途 反向代理的作用 步骤2 反向代理配置 步骤3 负载均衡 1、路由模式&#xff08;推荐&#xff09; 2、桥接模式 3、服务直接返回模式 4、负载均衡算法介绍 1、轮询法 2、随机法 3、最小连接法 步骤4 nginx…

客户在哪儿AI——做真正管用的大客户获客方案

我们的目标是要打造一个真正“管用”的ToB大客户获客方案。以下是两个100%真实的案例&#xff0c;所有数据均为真实经营数据。一个是证明客户在哪儿AI对市场工作的颠覆性提升&#xff0c;另一个是证明客户在哪儿AI对决策层和销售工作的颠覆性提升。 客户在哪儿AI生产的是企业全…

唉~~量化策略越改越差了

最近收到藏经阁群友私信&#xff0c;问能不能在最近发布的轮动策略当中加入持仓时间的限制条件&#xff0c;买入某个ETF后&#xff0c;必须持有够7天才可以卖出。 其目的有二&#xff0c;第一是想减少市场杂音&#xff0c;减少不必要的交易&#xff0c;第二就是如果场外操作的话…

【JavaScript】详解Day.js:轻量级日期处理库的全面指南

文章目录 一、Day.js简介1. 什么是Day.js&#xff1f;2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…

Qt背景与环境搭建

目录 ​编辑 一、Qt背景 1.行业岗位介绍 2.什么是Qt 3.Qt的发展史 4.Qt支持的平台 5.Qt的版本和优点 5.1 版本 5.2 优点 6.Qt的应用场景 7.Qt 的成功案例 8.Qt 发展前景 二、环境搭建 1.Qt 的开发工具概述 2.Qt SDK 的下载和安装 2.1 Qt SDK 的下载 ​编辑 2…

Ascend算子开发

Device侧 1. 存储API 1.1 GlobalTensor 1.2 LocalTensor 可获取、设置值、获取大小。页可以通过[]获取 1.3 数据类型 2. Add样例 数据搬入&#xff1a;DataCopy调用计算接口&#xff1a;Add数据搬出&#xff1a;LocalTensor、EnQue、DeQue 2.1 核函数定义 x、y输入&#xff…

『 Linux 』线程概念

文章目录 什么是线程执行流线程与进程的关系页表构造及线程资源分配线程的轻量化线程的特点 什么是线程 线程本质上是进程的一个执行分支,用于处理进程中的代码和数据; 每个线程都可以执行独立不同的代码片段,这意味着在一个进程中可以同时执行多个任务; 同一个进程中的所有线程…

基于微信小程序+SpringBoot+Vue的社区超市管理系统(带1w+文档)

基于微信小程序SpringBootVue的社区超市管理系统(带1w文档) 基于微信小程序SpringBootVue的社区超市管理系统(带1w文档) 为了让商品信息的管理模式进行升级&#xff0c;也为了更好的维护商品信息&#xff0c;社区超市管理系统的开发运用就显得很有必要&#xff0c;因为它不仅可…

全球奈拉滨市场规模预测:未来六年年复合增长率CAGR为1.1%

据恒州诚思研究&#xff0c;2023年全球奈拉滨市场规模大约为3.8亿元&#xff0c;预计未来六年年复合增长率CAGR为1.1%&#xff0c;到2030年市场规模将接近4.2亿元。这一增长反映了奈拉滨在全球医药行业中的重要性及其在未来发展中的潜在机会。随着科学的进一步发展和市场的扩展…

全网最详细Gradio教程系列5——Gradio Client: curl

全网最详细Gradio教程系列5——Gradio Client: curl 前言本篇摘要5. Gradio Client的三种使用方式5.3 Curl查询Gradio Apps5.3.1 安装5.3.2 获取Gradio程序的URL5.3.3 HF_TOKEN和身份认证1. POST/GET示例2. 整合命令&#xff1a;awk和read3. HF_TOKEN4. 身份认证 5.3.4 POST&am…

21 Python常用内置函数——zip()

zip() 函数用来把多个可迭代对象中的元素压缩到一起&#xff0c;返回一个可迭代的 zip 对象&#xff0c;其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组&#xff0c;最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个。 可以这样理解这个函…

WPF启动失败报System.Windows.Automation.Peers.AutomationPeer.Initialize()错误解决

问题描述 win10系统上WPF程序启动后就崩溃&#xff0c;通过查看崩溃日志如下&#xff1a; 应用程序: xxx.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常&#xff0c;进程终止。 异常信息: System.TypeLoadException 在 System.Windows.Automation.Peers.Automatio…

强者具备的三个思维

强者具备的三个思维&#xff0c;看看你占了几条&#xff1f; 一、不看自己需要什么&#xff0c;而是看环境和别人需要什么。满足他们&#xff0c;你就能把事情做成。 二、不追求稳定&#xff0c;而是享受不稳定。稳定的工作和生活&#xff0c;并不意味着你的技能已经娴熟。而…

SpringBoot上传超大文件导致Cannot read more than 2,147,483,647 into a byte array,问题解决办法

问题描述 报错: java.lang.IllegalArgumentException: Cannot read more than 2,147,483,647 into a byte array at org.apache.commons.io.IOUtils.lambda$toByteArray$0(IOUtils.java:2403) ~[commons-io-2.11.0.jar:2.11.0] at org.apache.commons.io.output.Thre…

C++学习日记 | LAB 10 运算符重载与友元函数

资料来源&#xff1a;南科大 于仕琪 C/C Program Design LINK&#xff1a;CPP/week10 at main ShiqiYu/CPP GitHub 一、本节内容 本节首先以一个例子具体演示和回顾操作符重载、友元函数以及重载<<操作符。习题部分则为各种运算符重载以及输入输出重载 1.1 Operator o…

支持向量机回归及其应用(附Python 案例代码)

使用支持向量机回归估计房价 让我们看看如何使用支持向量机&#xff08;SVM&#xff09;的概念构建一个回归器来估计房价。我们将使用sklearn中提供的数据集&#xff0c;其中每个数据点由13个属性定义。我们的目标是根据这些属性估计房价。 引言 支持向量回归&#xff08;SV…