从PyTorch官方的一篇教程说开去(6.2 - 张量 tensor 矩阵运算等)

您的进步和反馈是我写作最大的动力,小伙伴来个三连呗!共勉~

话不多说,书接上文,需要温习的小伙伴请移步 - 从PyTorch官方的一篇教程说开去(6.1 - 张量 tensor 基本操作)-CSDN博客

借图镇楼 -

1 - 矩阵乘法(点积或外积,整个行乘以整个列):

python 复制代码
shape = (4,4)
ones_tensor = torch.ones(shape)
y1 = ones_tensor @ ones_tensor
print(f"{y1}\n")

shape = (4,4)
ones_tensor = torch.ones(shape)
y2 = torch.matmul(ones_tensor,ones_tensor.T)
print(f"{y2}\n")

z1 = torch.rand_like(y1)
torch.matmul(ones_tensor, ones_tensor.T, out=z1)
print(f"{z1}\n")
  • 使用 @ 符号,等同于调用matmul函数,进行矩阵乘法。由于 ones_tensor 是一个 4x4 的全1矩阵,其与自身的乘法结果将是一个元素为4的矩阵。ones_tensor.T 表示转置。用out 参数,可以就地执行矩阵乘法,结果存储在 z1 中。这样可以避免额外的内存分配。

2 - 元素级别的点乘(dot product):

python 复制代码
y3 = ones_tensor * ones_tensor
print(f"{y3}\n")

y4 = torch.mul(ones_tensor,ones_tensor.T)
print(f"{y4}\n")

z2 = torch.rand_like(y3)
torch.mul(ones_tensor,ones_tensor.T,out=z2)
  • 元素级别的点乘,也就是逐元素相乘。对于全1矩阵,结果是每个元素都是1。同上例,提供3种算符。

3 - torch没有官方定义叉乘(Cross Product):

python 复制代码
# 定义两个三维向量
vector_a = torch.tensor([1.0, 2.0, 3.0])
vector_b = torch.tensor([4.0, 5.0, 6.0])

# 计算叉乘
cross_product = torch.linalg.cross(vector_a, vector_b)

print(f"Vector A: {vector_a}")
print(f"Vector B: {vector_b}")
print(f"Cross Product: {cross_product}")
  • 尽管官方没有,但是为了区别这几个容易混淆的概念,我们还是配个例子。叉乘(Cross Product)通常是针对两个三维向量而言的,它返回一个向量,该向量垂直于原来的两个向量,并遵循右手定则。

4 - 单元素张量:

python 复制代码
agg = ones_tensor.sum()
agg_item = agg.item()
print(agg_item,type(agg_item))
  • ones_tensor 是一个 4x4 的单位矩阵,其元素总和将是 4x4=16。item() 方法用于将这个张量转换成一个 Python 标量(即一个单一数值)。在进行一些扁平化的操作时候会用到。

5 - 就地计算函数(为节约存储,这些都很常用):

python 复制代码
原地操作函数(in-place operations) 以_结尾
add_(): 原地加法。
sub_(): 原地减法。
mul_(): 原地乘法。
div_(): 原地除法。

copy_(): 原地复制。
t_(): 原地转置。
fill_(): 原地填充。
zero_(): 原地清零。

clamp_(): 原地限制值。
clamp_min_(): 原地最小值限制。
clamp_max_(): 原地最大值限制。

sum_(): 原地求和。
mean_(): 原地求平均值。
std_(): 原地求标准差。
var_(): 原地求方差。
norm_(): 原地求范数。
renorm_(): 原地重规范化。

addmm_(): 原地矩阵乘法加法。
addr_(): 原地地址加法。
addbmm_(): 原地二维矩阵乘法加法。
baddbmm_(): 原地批量二维矩阵乘法加法。
mm_(): 原地矩阵乘法。
bmm_(): 原地批量矩阵乘法。

ger_(): 原地外积。
linalg_vector_norm_(): 原地向量范数。
linalg_matrix_norm_(): 原地矩阵范数。
linalg_solve_(): 原地线性求解。
linalg_inv_(): 原地矩阵求逆。
linalg_pinv_(): 原地伪逆。
linalg_eig_(): 原地特征值分解。
linalg_svd_(): 原地奇异值分解。
linalg_householder_product_(): 原地Householder变换。
linalg_qr_(): 原地QR分解。
linalg_triangular_solve_(): 原地三角求解。
linalg_cholesky_(): 原地Cholesky分解。
linalg_symeig_(): 原地对称特征值分解。
linalg_eigvals_(): 原地特征值计算。
linalg_eigvalsh_(): 原地Hermitian特征值计算。
linalg_slogdet_(): 原地对数行列式。
linalg_det_(): 原地行列式。
linalg_cond_(): 原地条件数。
linalg_matrix_rank_(): 原地矩阵秩。
linalg_solve_triangular_(): 原地三角求解。
linalg_lstsq_(): 原地最小二乘求解。

6 - 打印结果和类型:

python 复制代码
np_array = np.array(data)
x_np = torch.from_numpy(np_array)

print(f"{x_np}\n")
x_np.add_(1)
print(np_array,"\n")

n = np.ones(5)
t = torch.from_numpy(n)
np.add(n,1,out=n)
print(f"{t} \n{n}")
复制代码
  • 这里就地展示一下上个小标题的原地计算函数,add_() 是就地操作,它将 1 加到张量 x_np 的每个元素上。注意,由于 x_npnp_array 共享内存,np_array 也会被修改。我们还一同展示了如何在数组和张量之间进行互相转化。
相关推荐
哈__7 分钟前
学弟让我帮忙写一个学生管理系统的后端,我直接上科技
人工智能·ai
云空43 分钟前
《探索电脑麦克风声音采集多窗口实时可视化技术》
人工智能·python·算法
麦兜*1 小时前
【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
java·人工智能·spring boot·后端·spring·架构
张较瘦_1 小时前
[论文阅读] 人工智能 | 5C提示词框架的研究
论文阅读·人工智能
超龄超能程序猿1 小时前
使用 Python 对本地图片进行图像分类
开发语言·人工智能·python·机器学习·分类·数据挖掘·scipy
大千AI助手1 小时前
RLHF:人类反馈强化学习 | 对齐AI与人类价值观的核心引擎
人工智能·深度学习·算法·机器学习·强化学习·rlhf·人类反馈强化学习
我爱一条柴ya1 小时前
【AI大模型】RAG系统组件:向量数据库(ChromaDB)
数据库·人工智能·pytorch·python·ai·ai编程
MARS_AI_1 小时前
云蝠智能VoiceAgent重构企业电话客服体系
人工智能·自然语言处理·人机交互·交互·信息与通信
在猴站学算法5 小时前
机器学习(西瓜书) 第二章 模型评估与选择
人工智能·机器学习
科技宅说6 小时前
36氪专访丨乐橙CEO谢运:AI科技下的业务创新与长期主义下的品牌坚守
人工智能·科技