张量切片:tensorflow 与 pytorch

Tensor slicing: tensorflow vs pytorch

提问人:Abhijay Ghildyal 提问时间:10/20/2022 最后编辑:Abhijay Ghildyal 更新时间:10/21/2022 访问量:221

问:

我正在 TF 和 PyTorch 中测试这个简单的切片操作,它应该在两者中匹配

import tensorflow as tf
import numpy as np
import torch
tf_x = tf.random.uniform((4, 64, 64, 3))

pt_x = torch.Tensor(tf_x.numpy())
pt_x = pt_x.permute(0, 3, 1, 2)
# slicing operation
print(np.any(pt_x[:, :, 1:].permute(0, 2, 3, 1).numpy() - tf_x[:, 1:].numpy())) 
# > False

pt_x = torch.Tensor(tf_x.numpy())
b, h, w, c = pt_x.shape
pt_x = pt_x.reshape((b, c, h, w))
print(np.any(pt_x.view(b, h, w, c).numpy() - tf_x.numpy())) # False
print(np.any(pt_x[:, :, 1:].reshape(4, 63, 64, 3).numpy() - tf_x[:, 1:].numpy())) 
# > True

最后一行是问题所在。PyTorch 和 TF 都应该导致相同的值,但它们没有。这种差异是在我尝试重塑张量时引起的吗?

python numpy tensorflow pytorch 切片

评论


答:

1赞 Ivan 10/20/2022 #1

一方面,你有等于 ,使用 np.isclose 来验证:pt_xtf_x

>>> np.isclose(pt_x.view(b, h, w, c).numpy(), tf_x.numpy()).all()
True

另一方面,您以不同的方式切分两个张量:沿 删除第一个元素,同时沿 删除第一个元素。因此,您最终会得到两个具有重叠值的不同元素,例如 和 。pt_x[:, :, 1:]axis=2tf_x[:, 1:]axis=1tf_x[:, 1:][0,-1,-1,-1]pt_x[0,-1,-1,-1]

还要记住,Tensorflow 和 PyTorch 中的张量布局是不同的,前者使用通道后布局,后者使用通道先布局。这两者之间需要的操作是排列(而不是重塑)。

评论

0赞 Abhijay Ghildyal 10/21/2022
谢谢。Permute工作正常。我现在正试图了解“重塑”在引擎盖下是如何工作的。另外,我无法理解你回答的这一部分:“因此,你最终会得到两个具有重叠值的不同元素,例如 tf_x[:, 1:][0,-1,-1,-1] 和 pt_x[0,-1,-1,-1]”。如果可能的话,你能发布一个解释这个概念的链接吗?