本文转自小宋是呢https://cloud.tencent.com/developer/article/1451531
PyTorch中Numpy,Tensor与Variable深入理解与转换技巧
1.问题描述
我们使用Numpy也是可以手动去编写神经网络进行反向传播深度学习的,就是有两个问题:
1.Numpy手动去编写神经网络很繁琐,代码量较大,不利于大规模开发;2.Numpy无法直接使用GPU加速计算
看到网上有很多人说PyTorch很好用,比TensorFlow优雅便捷。个人认为其中一个很主要的原因PyTorch很类似与Numpy,对数据操作处理很简单。并且PyTorch是支持使用GPU加速的,所以有人比喻PyTorch是GPU版本的Numpy。
PyTorch为了实现GPU加速功能,引入了Tensor,为了实现自动求导功能引入了Variable。但是由于引入了这些新的概念,会让一些不理解初学者在使用的时候遇到一些问题。
2.问题剖析
我们现在已经知道了PyTorch为了实现GPU加速功能,引入了Tensor,为了实现自动求导功能引入了Variable。我们一般读取的数据都是以Numpy Array方式的。在TensorFlow,Numpy的数据会在输入网络后自动转换为Tensor,一般不需要我们进行显性操作,当然偶尔也会有例外,可以参考[开发技巧]·TensorFlow中numpy与tensor数据相互转化(支持tf1.x-tf2.x) TensorFlow中numpy与tensor数据相互转化。但是在PyTorch,需要我们自己进行显性操作才可以的。
下面我以一个网络训练的过程来讲解它们之间如何进行相互的转换。
首先我们会读取Numpy的数据,我们为了能够送入网络,使用GPU计算加速,所以要进行Numpy2Tensor操作,由于网络输入输出都是Variable,我们还需要Tensor2Variable。在训练的过程中,我们需要取出loss的值,由于loss参与了backward(),所以此时的loss已经变成了Variable,我们取出loss时需要取出的是Tensor。同样的,如果我想取出网络输出的结果时,由于网络输入输出都是Variable,也需要执行Variable2Tensor,如果进一步我们想把loss显示出来,就需要Tensor2Numpy。
总结一下,真正和我们开发人员直接接触的是Numpy数据,需要送入网络时进行Numpy2Tensor,如果一些Tensor作为参数需要求解梯度信息时进行Tensor2Variable。需要从Variable取数据时,使用Variable2Tensor。对Tensor进行读取操作时需要Tensor2Numpy。
3.转换方法
Numpy2Tensor: 1. torch.from_numpy(Numpy_data) 2. torch.tensor(Numpy_data)
Tensor2Variable: 1. Variable(Tensor_data)
Variable2Tensor: 1. Variable_data.data()
Tensor2Numpy : 1.Tensor_data.numpy()
注意一点,Numpy与Variable无法直接转换,需要经过Tensor作为中介。
Hope this helps