[开发技巧]·PyTorch中Numpy,Tensor与Variable深入理解与转换技巧

[开发技巧]·PyTorch中Numpy,Tensor与Variable深入理解与转换技巧

配合本文推荐阅读:PyTorch如何使用GPU加速(CPU与GPU数据的相互转换)

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数据相互转化。但是在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

 

 

  • 21
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宋是呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值