Pytorch中.data与.detach()的区别和作用

在Pytorch中,创建模型和数据运算传递时,经常会使用到tensor.data和tensor.detach(),对于这两种使用方式,都是对Variable中的tensor进行处理,但是都不进行梯度计算和被进行梯度跟踪,即requires_grad=False,简单来说,他们的区别如下:

相同点

两者都和原数据共享同一块数据;
都和原来数据的计算历史无关;
requires_grad = False;


不同点

detach会进行提示,相比data更安全,在使用in-place操作后,会修改原数据的值,而如果在反向传播过程中使用到原数据会导致计算错误,而使用.detach就会报错。
 

在量化时的应用

在进行图像压缩或者其他需要对数据进行量化时,.data与.detach()的作用就很明显了,因为通常量化是不可导的,所以在整个模型的训练过程中,需要forward时量化取整,backward时梯度回传,就需要.data或者.detach()来实现了,forward时使用.data或者.detach,不进行梯度计算和梯度跟踪,软量化(为了使量化可导而使用逼近量化的可导函数)使用正常的tensor操作即可实现量化的同时,还能进行梯度回传。

 例如:

# y是需要量化的一个tensor
y = y - alpha * F.sin(2 * np.pi * y) / (2 * np.pi) #软量化,需要求导和梯度跟踪
y.data = torch.round(y.data) # 量化,此处不求梯(不进行梯度跟踪)

参考文献

1. https://blog.csdn.net/qq_36530992/article/details/102822640

2.https://zhuanlan.zhihu.com/p/38475183

 

 

你可能感兴趣的:(关于Pytorch的那些事儿)