【Pytorch】关于torch.matmul和torch.bmm的输出tensor数值不一致问题

探讨了PyTorch中torch.matmul与torch.bmm函数用于batch矩阵乘法时,尽管输出看似相同,但在小数点后第7位开始出现精度差异的现象。通过对比不同操作下的结果,揭示了即使在相同输入和操作下也可能出现不一致结果的问题。

https://blog.csdn.net/laox1ao/article/details/79159303

 

发现
对于torch.matmul和torch.bmm,都能实现对于batch的矩阵乘法:

a = torch.rand((2,3,10))
b = torch.rand((2,2,10))
### matmal()
res1 = torch.matmul(a,b.transpose(1,2))
print res1
"""
...
[torch.FloatTensor of size 2x3x2]
"""
### bmm()
res2 = torch.bmm(a,b.transpose(1,2))
print res2
"""
...
[torch.FloatTensor of size 2x3x2]
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
从打印出来的几位数字来看,嗯,是一样的,但是在用等式(或者torch.eq())检查是却发现了问题,竟然有很多不一样的元素

print torch.eq(res1,res2)
"""
(0 ,.,.) =
1 0
1 1
1 1

(1 ,.,.) =
0 1
1 1
1 1
[torch.ByteTensor of size 2x3x2]
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
将一样的数值在ipython直接输出(print会截断位数)

>>>res1[0,0,0]
2.229752540588379
>>>res2[0,0,0]
2.229752540588379
1
2
3
4
再来看看不一样的

>>>res1[0,0,1]
3.035151720046997
>>>res2[0,0,1]
3.035151481628418
1
2
3
4
可以看到从小数点后位7位开始两个输出值出现了差异!

结论
所以说在tensor的同样操作下,出现不一致结果(精度上)的可能性很大,在做相等条件判断时需要注意,即使同样的输入同样的操作可能出现不一样的结果。
之后又尝试对于a,b的位置进行交换,竟然发现即使是同一个函数操作,如matmal(),matmul(a,b.transpose(1,2))和matmul(b,a.transpose(1,2)).transpose(1,2)结果也存在不一样的元素。
---------------------
版权声明:本文为CSDN博主「Laox1ao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laox1ao/article/details/79159303

### TensorFlow `tf.matmul` PyTorch `torch.bmm` 的区别与用法 #### 基本定义 TensorFlow 中的 `tf.matmul` 是用于矩阵乘法的操作,支持两个二维张量或多维张量之间的矩阵相乘。而 PyTorch 中的 `torch.bmm` 则专门针对三维张量设计,表示批量矩阵乘法 (Batch Matrix Multiplication)[^1]。 #### 输入维度的要求 对于 `tf.matmul` 来说,如果输入的是多于两维的张量,则会将最后两维视为矩阵并执行逐批矩阵乘法操作。其余前置维度会被视作批次大小的一部分处理[^2]。 而在 PyTorch 中,`torch.bmm` 明确要求输入必须是三个维度 `(batch_size, n, m)` `(batch_size, m, p)` 形式的张量,并返回形状为 `(batch_size, n, p)` 的结果[^3]。 #### 性能优化方面 由于 `torch.bmm` 更加专注于特定场景下的高效实现——即当数据集包含多个独立的小型矩阵时可以更有效地利用硬件资源完成计算任务;相比之下,虽然 `tf.matmul` 同样能够胜任此类工作负载但它可能会像前者那样特别针对某些情况做出额外性能上的考量。 以下是两者的一个简单对比代码示例: ```python import tensorflow as tf import torch # Example using TensorFlow's matmul a_tf = tf.random.uniform((5, 3, 4)) # Batch size of 5, matrices are 3x4 b_tf = tf.random.uniform((5, 4, 6)) # Batch size of 5, matrices are 4x6 result_tf = tf.matmul(a_tf, b_tf) # Result will have shape (5, 3, 6) print("Result from TF:", result_tf.shape) # Equivalent operation in PyTorch with bmm a_pt = torch.rand(5, 3, 4) # Same dimensions but now tensors b_pt = torch.rand(5, 4, 6) result_pt = torch.bmm(a_pt, b_pt) # Also results in a tensor shaped (5, 3, 6) print("Result from PT:", result_pt.size()) ``` 通过以上例子可以看出,在相同逻辑下两种框架提供了相似功能但各有侧重之处。 #### 使用注意事项 需要注意的一点是在实际应用过程中要确保所使用的库版本兼容以及正确设置设备环境(CPU/GPU),因为这可能会显著影响最终程序运行效率甚至可能导致错误发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值