PyTorch 张量类型转换是否保留信息?

问题描述 投票:0回答:1

考虑以下简单的操作,

>>> t
tensor([ 1.8750, -0.6875, -1.1250, -1.3750,  1.3750, -1.1250,  0.4688, -0.4062,
         0.8750, -1.7500], dtype=torch.float)
>>> t.view(torch.uint8)
tensor([ 63, 179, 185, 187,  59, 185,  47, 173,  54, 190], dtype=torch.uint8)
>>> t.view(torch.uint8).shape
torch.Size([10])
>>> t.view(torch.uint8).numpy()
array([ 63, 179, 185, 187,  59, 185,  47, 173,  54, 190], dtype=uint8)
>>> torch.as_tensor(t.view(torch.uint8).numpy())
tensor([ 63, 179, 185, 187,  59, 185,  47, 173,  54, 190], dtype=torch.uint8)
>>> torch.as_tensor(t.view(torch.uint8).numpy()).view(torch.float)
tensor([ 1.8750, -0.6875, -1.1250, -1.3750,  1.3750, -1.1250,  0.4688, -0.4062,
         0.8750, -1.7500], dtype=torch.float)

我对如何在类型转换中保留信息感到困惑。原始张量的类型为 float8,然后转换为 uint8 (0-255)。然后使用 uint8 numpy 数组来初始化 float8 张量。这种转换顺序难道不会导致信息丢失吗?

numpy pytorch casting
1个回答
0
投票

您使用的所有操作,即

view
numpy
as_tensor
仅影响张量的“元数据”,即它们应如何解释存储在其中的数据。这些实际上都不会改变底层数字数组中的任何位(可以根据需要进行解释)。

您可以查看这 3 个操作(numpyviewas_tensor)的文档,它们提到共享存储/数据(有一些不适用于您的代码的例外情况,例如 GPU 数据等)

所以当你绕了一圈后,没有任何一个位发生改变,因此你可以完美地恢复初始张量

© www.soinside.com 2019 - 2024. All rights reserved.