news 2026/1/13 17:57:47

MindSpore开发之路(四):核心数据结构Tensor

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MindSpore开发之路(四):核心数据结构Tensor

1. 什么是张量(Tensor)?—— AI世界的数据基石

在前面的文章中,我们已经和Tensor打过几次照面。现在,让我们正式地认识它。

从数学上讲,张量是一个多维数组。这个概念可能有点抽象,我们可以用更生活化的方式来理解它:

  • 0维张量(标量): 一个单独的数字,比如5。就像一个温度计上的读数。
  • 1维张量(向量): 一串有序的数字,比如[1, 2, 3]。就像一周七天的每日最高气温记录。
  • 2维张量(矩阵): 一个由数字组成的表格,比如[[1, 2], [3, 4]]。就像一张灰度图片,每个数字代表一个像素点的亮度。
  • 3维张量: 一个由“表格”组成的“立方体”。就像一张彩色图片,每个像素点由红、绿、蓝(RGB)三个数值组成,所以一张图片就是[高度, 宽度, 3]的数据立方体。
  • 更高维的张量: 想象一下,一个视频由连续的图片帧组成,那么一个视频数据就可以是一个4维张量:[帧数, 高度, 宽度, 3]。如果是一批视频,那就是5维张量了。

在MindSpore中,无论是输入的数据(图片、文本、声音)、模型中的参数(权重、偏置),还是计算过程中的中间值,一切都以Tensor的形式存在和流转

2. 创建Tensor:多种方式“无中生有”

掌握如何创建Tensor是进行MindSpore编程的第一步。MindSpore提供了灵活多样的创建方式。

首先,确保你已经激活了之前创建的mindspore_env虚拟环境,并进入Python交互环境。

importnumpyasnpimportmindsporefrommindsporeimportTensor# 设置为PYNATIVE模式,便于观察每一步的结果mindspore.set_context(mode=mindspore.PYNATIVE_MODE)

2.1 从现有数据创建

最直接的方式就是将Python的列表(List)或NumPy数组(Array)转换为Tensor。

# 从Python List创建data_list=[[1,2],[3,4]]tensor_from_list=Tensor(data_list)print("From List:\n",tensor_from_list)# 从NumPy Array创建 (这是最常见和推荐的方式)dat-numpy=np.array([[5,6],[7,8]])tensor_from_numpy=Tensor(dat-numpy)print("From NumPy Array:\n",tensor_from_numpy)

2.2 创建具有特定值的Tensor

有时我们需要创建一些具有固定值的Tensor,用于初始化或其他特定目的。

frommindsporeimportops# 创建一个全为1的Tensor,形状为(2, 3)ones_tensor=ops.ones((2,3),mindspore.float32)print("Ones Tensor:\n",ones_tensor)# 创建一个全为0的Tensor,形状为(2, 3)zeros_tensor=ops.zeros((2,3),mindspore.float32)print("Zeros Tensor:\n",zeros_tensor)# 创建一个形状与其他Tensor相同的全1 Tensorlike_tensor=ops.ones_like(tensor_from_list)print("Ones Like Tensor:\n",like_tensor)

2.3 创建随机数或序列Tensor

在模型初始化权重等场景下,随机数Tensor非常有用。

# 创建一个形状为(2, 2),服从标准正态分布的随机数Tensorrand_tensor=ops.randn((2,2))print("Random Normal Tensor:\n",rand_tensor)# 创建一个从0到9的序列range_tensor=ops.arange(10)print("Range Tensor:\n",range_tensor)

3. Tensor的属性:它的“身份证”信息

每个Tensor都自带一套“身份信息”,描述了它的基本特征。这些属性在调试和构建网络时至关重要。

data=[[1,2,3],[4,5,6]]my_tensor=Tensor(data)# 1. 形状 (Shape)# 描述了Tensor在每个维度上的大小,是一个元组。print(f"Shape of tensor:{my_tensor.shape}")# 2. 数据类型 (dtype)# 描述了Tensor中存储的数据是什么类型,比如整数、浮点数等。print(f"Data type of tensor:{my_tensor.dtype}")# 3. 所在设备 (Device)# 描述了Tensor存储在哪个硬件上,是CPU还是GPU/Ascend。# 注意:直接打印Tensor对象会显示其设备信息print(f"Tensor stored on:{my_tensor.device}")

输出结果类似:

Shape of tensor: (2, 3) Data type of tensor: Int64 Tensor stored on: CPU

4. Tensor的操作:像“切菜”和“烹饪”一样处理数据

Tensor的强大之处在于可以对它进行各种高效的运算和变换。

4.1 索引和切片

就像操作NumPy数组一样,我们可以方便地获取Tensor的局部数据。

tensor=ops.ones((4,4))tensor[1,1]=0# 将第1行第1列的元素(从0开始计数)赋值为0print("After modification:\n",tensor)# 切片:获取第1行到第2行(不含第3行)的所有列row_slice=tensor[1:3,:]print("Row Slice:\n",row_slice)# 切片:获取所有行的第1列col_slice=tensor[:,1]print("Column Slice:\n",col_slice)

4.2 基础算术运算

Tensor支持逐元素的加、减、乘、除等运算。

x=ops.ones(2,2)*2y=ops.ones(2,2)*3# 逐元素相加z_add=x+y# 或者使用函数式API# z_add_func = ops.add(x, y)print("Addition:\n",z_add)# 逐元素相乘z_mul=x*yprint("Multiplication:\n",z_mul)

4.3 形状变换

在构建网络时,经常需要改变Tensor的形状以匹配不同层的输入输出要求。

original_tensor=ops.arange(12)print("Original Tensor shape:",original_tensor.shape)# 将1维Tensor重塑为3x4的2维Tensorreshaped_tensor=original_tensor.reshape((3,4))print("Reshaped Tensor:\n",reshaped_tensor)print("Reshaped Tensor shape:",reshaped_tensor.shape)

5. Tensor与NumPy的“亲密关系”

MindSpore的Tensor与NumPy的Array之间可以高效、便捷地相互转换。这使得我们可以充分利用NumPy强大的生态库来做数据预处理等工作。

5.1 Tensor转换为NumPy

ms_tensor=ops.ones(5)print(f"MindSpore Tensor:{ms_tensor}, type:{type(ms_tensor)}")# 使用 .asnumpy() 方法np_array=ms_tensor.asnumpy()print(f"NumPy Array:{np_array}, type:{type(np_array)}")

5.2 NumPy转换为Tensor

这正是我们创建Tensor时最常用的方法。

np_array=np.ones(5)print(f"NumPy Array:{np_array}, type:{type(np_array)}")# 直接使用Tensor()构造函数ms_tensor=Tensor(np_array)print(f"MindSpore Tensor:{ms_tensor}, type:{type(ms_tensor)}")

重要提示:当Tensor在CPU上时,Tensor.asnumpy()Tensor(numpy_array)的转换过程是零拷贝的,意味着它们共享同一块内存。修改其中一个会影响另一个。这极大地提升了效率,但也需要注意数据同步问题。

6. 总结

本文深入探讨了MindSpore的核心数据结构——Tensor。我们学习了它是什么,如何创建它,它有哪些重要属性,以及如何像处理普通数据一样对它进行切片、运算和变形。更重要的是,我们理解了Tensor在MindSpore生态中的中心地位,以及它与NumPy之间的无缝桥梁。

掌握了Tensor,您就拿到了进入MindSpore世界的“钥匙”。在下一篇文章中,我们将学习如何使用nn.Cell来搭建网络的基本骨架,并将我们今天所学的Tensor知识应用到实践中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/5 0:44:35

37、调试与系统安全技术综合解析

调试与系统安全技术综合解析 1. 调试基础 调试是软件开发和系统维护中至关重要的环节。在调试过程中,有多种工具和技术可供使用。例如,Debugging Tools for Windows 包含了 CDB(cdb.exe)、KD(kd.exe)、NTSD(ntsd.exe)和 WinDbg(windbg.exe)等工具。这些工具各有特点…

作者头像 李华
网站建设 2026/1/13 10:20:16

kali linux渗透测试之漏洞扫描

主题内容就是进行漏洞扫描 文章目录 前言一、Nikto * 1.Nikto漏洞扫描介绍2.Nikto使用 二、Nessus * 1.Nessus介绍2.安装nessus3.nessus的简单使用3.nessus扫描之advanced scan 三、 skipfish扫描工具 * 1.介绍2.skipfish的使用3.批量处理4.使用字典5.命令选项6.打开文件 四、…

作者头像 李华
网站建设 2026/1/10 6:38:19

杰理之播歌的时候单击有概率触发下一曲功能【篇】

在使用这些手机作主机时,按下按键概率性的会把diff_val(u16类型)赋负值(比如-1),导致出现无符号整数溢出,使其变成65535,进而导致下图的判断通过,不对keyvalue做判断&…

作者头像 李华
网站建设 2026/1/10 4:00:03

Kotaemon与Jira集成案例:IT工单智能分类实践

Kotaemon与Jira集成案例:IT工单智能分类实践 在一家中型科技公司的IT服务台,每天平均收到超过200个来自员工的系统支持请求——从“无法连接Wi-Fi”到“软件闪退”,再到“权限申请”。这些工单通过Jira提交,但分类和分配却依赖人工…

作者头像 李华