PyTorch张量通过view进行类型转换为何未丢失信息?
为什么用view转换类型再转回后没有信息丢失?
核心原因是**view方法并没有修改张量底层的二进制数据,只是改变了PyTorch解读这些数据的方式**,和真正的类型转换(比如to()/type())完全不同。
具体拆解你的操作流程:
- 原始张量
t(torch.float):内存中存储的是每个浮点数对应的二进制位(比如float32是4字节/元素,float16是2字节/元素),所有数值的二进制都是精确可表示的(比如1.875、-0.6875这类数,二进制没有舍入误差)。 t.view(torch.uint8):这一步没有做任何数据转换,只是告诉PyTorch:把原来存储浮点数的那片连续内存,当成uint8类型的数组来读取。内存里的二进制位完全没变,只是解读方式变了。- 转numpy数组再转回torch张量:CPU上的张量转numpy时默认共享内存(除非显式拷贝),
torch.as_tensor也会直接复用numpy数组的内存,所以这两步都没碰到底层的二进制数据。 view(torch.float):再次把内存中的二进制位,按照原来的torch.float类型规则解读,自然就能还原出原始的浮点数数值,不会丢失信息。
关键区别:view vs 真正的类型转换
如果用to(torch.uint8)或者type(torch.uint8)这类方法,才是真正的数值转换:会把浮点数的数值转换成uint8的整数(比如1.875→1,-0.6875→0),这时候底层二进制数据已经被修改,再转回浮点数就会丢失信息。
比如对比操作:
>>> t.to(torch.uint8) tensor([ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0], dtype=torch.uint8) >>> t.to(torch.uint8).view(torch.float) # 这里得到的数值会完全和原始张量不同,因为底层数据已经被修改
内容的提问来源于stack exchange,提问作者Sahil Gupta
相关产品推荐
相关产品推荐

