PyTorch为了实现GPU加速功能,在Numpy的基础上,引入了Tensor,为了实现自动求导功能,引入了Variable。我们一般读取的数据都是以Numpy Array方式的。在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。
转换方法
Numpy2Tensor:
- torch.from_numpy(Numpy_data)
- torch.tensor(Numpy_data)
Tensor2Variable:
- Variable(Tensor_data)
Variable2Tensor:
- Variable_data.data()
Tensor2Numpy :
- Tensor_data.numpy()
注意一点,Numpy与Variable无法直接转换,需要经过Tensor作为中介。