《昇思25天学习打卡营第2天|张量Tensor》

1、前言

张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数。
张量是多维数组,是深度学习和机器学习中数据表示的基本单位。它可以表示标量(0维张量)、向量(1维张量)、矩阵(2维张量)以及更高维度的数组。在大模型(如神经网络)中,张量用于存储和操作数据、权重、偏置等参数。

在大模型中的地位:
数据表示: 输入数据(如图像、文本、音频等)在进入模型前通常会被转换为张量形式,以便于模型处理。
参数存储: 模型的权重和偏置也是以张量形式存储和更新的。
运算操作: 深度学习中的各种运算(如矩阵乘法、卷积操作、激活函数等)都是在张量上进行的。
梯度计算: 在反向传播过程中,张量用于存储梯度信息,以更新模型参数。

2 张量案例分析

2.1导入必要的库

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

导入NumPy库、MindSpore库以及MindSpore中的一些模块。

2.2 创建张量(Tensor)

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

创建一个包含数据 [1, 0, 1, 0] 的张量 x_data 并打印其值、形状和数据类型。

2.3 从NumPy数组创建张量

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

从NumPy数组 np_array 创建张量 x_np,并打印其值、形状和数据类型。

2.4 使用初始化器创建张量

from mindspore.common.initializer import One, Normal
tensor1 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=One())
tensor2 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=Normal())
print("tensor1:\n", tensor1)
print("tensor2:\n", tensor2)

使用 One 初始化器创建一个全为1的张量 tensor1,使用 Normal 初始化器创建一个从正态分布中抽样的张量 tensor2,并打印它们的值。

2.5 创建全1和全0张量

x_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_like 和 zeros_like 操作符创建与 x_data 形状相同的全1和全0张量。

2.6 张量属性

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)

创建一个二维张量 x 并打印其形状、数据类型、元素大小、总字节数、维数、元素个数和步幅。

2.7 张量索引

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]))

创建一个二维浮点数张量 tensor,并通过索引打印其第一行、右下角元素、最后一列和第一列。

2.8 张量运算

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 // x
print("add:", output_add)
print("sub:", output_sub)
print("mul:", output_mul)
print("div:", output_div)
print("mod:", output_mod)
print("floordiv:", output_floordiv)

对两个张量 x 和 y 进行加、减、乘、除、取模和整除运算,并打印结果。

2.9 张量拼接

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)

将两个二维张量 data1 和 data2 在第一个轴上进行拼接,并打印结果和形状。

2.10 张量堆叠

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)

将两个二维张量 data1 和 data2 进行堆叠,并打印结果和形状。

2.11 张量和NumPy数组相互转换

t = Tensor([1., 1., 1., 1., 1.])
print(f"t: {t}", type(t))
n = t.asnumpy()
print(f"n: {n}", type(n))
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))

将一个MindSpore张量 t 转换为NumPy数组 n,再将一个NumPy数组 n 转换为MindSpore张量 t,并验证两者同步更新。

2.12 创建CSR张量

indptr = Tensor([0, 1, 2])
indices = Tensor([0, 1])
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (2, 4)
csr_tensor = CSRTensor(indptr, indices, values, shape)
print(csr_tensor.astype(mindspore.float64).dtype)
创建一个稀疏矩阵的CSR(Compressed Sparse Row)表示,并将其数据类型转换为浮点数64

创建一个稀疏矩阵的CSR(Compressed Sparse Row)表示,并将其数据类型转换为浮点数64。

2.13 创建COO张量

indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (3, 4)
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)

创建一个稀疏矩阵的COO(Coordinate)表示,并且打印了值、索引、形状和数据类型。
通过了案例所示的步骤,学习了如何在MindSpore中创建、操作和转换张量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值