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交互环境。

python 复制代码
import numpy as np
import mindspore
from mindspore import Tensor

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

2.1 从现有数据创建

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

python 复制代码
# 从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,用于初始化或其他特定目的。

python 复制代码
from mindspore import ops

# 创建一个全为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 Tensor
like_tensor = ops.ones_like(tensor_from_list)
print("Ones Like Tensor:\n", like_tensor)

2.3 创建随机数或序列Tensor

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

python 复制代码
# 创建一个形状为(2, 2),服从标准正态分布的随机数Tensor
rand_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都自带一套"身份信息",描述了它的基本特征。这些属性在调试和构建网络时至关重要。

python 复制代码
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的局部数据。

python 复制代码
tensor = ops.ones((4, 4))
tensor[1, 1] = 0  # 将第1行第1列的元素(从0开始计数)赋值为0
print("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支持逐元素的加、减、乘、除等运算。

python 复制代码
x = ops.ones(2, 2) * 2
y = 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 * y
print("Multiplication:\n", z_mul)

4.3 形状变换

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

python 复制代码
original_tensor = ops.arange(12)
print("Original Tensor shape:", original_tensor.shape)

# 将1维Tensor重塑为3x4的2维Tensor
reshaped_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

python 复制代码
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时最常用的方法。

python 复制代码
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知识应用到实践中。

相关推荐
杜子不疼.4 小时前
CANN计算机视觉算子库ops-cv的图像处理与特征提取优化实践
图像处理·人工智能·计算机视觉
大闲在人4 小时前
软件仍将存在,但软件公司会以全新形式出现——从Claude智能体引发万亿市值震荡看行业重构
人工智能
艾莉丝努力练剑4 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
芷栀夏4 小时前
从 CANN 开源项目看现代爬虫架构的演进:轻量、智能与统一
人工智能·爬虫·架构·开源·cann
梦帮科技4 小时前
OpenClaw 桥接调用 Windows MCP:打造你的 AI 桌面自动化助手
人工智能·windows·自动化
永远都不秃头的程序员(互关)4 小时前
CANN模型量化赋能AIGC:深度压缩,释放生成式AI的极致性能与资源潜力
人工智能·aigc
爱华晨宇5 小时前
CANN Auto-Tune赋能AIGC:智能性能炼金术,解锁生成式AI极致效率
人工智能·aigc
聆风吟º5 小时前
CANN算子开发:ops-nn神经网络算子库的技术解析与实战应用
人工智能·深度学习·神经网络·cann
偷吃的耗子5 小时前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
勾股导航5 小时前
OpenCV图像坐标系
人工智能·opencv·计算机视觉