使用pytorch进行反向传播时,这两种操作有什么区别?

时间:2018-12-09 12:21:21

标签: python pytorch

我有张量x和class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> permutations=new ArrayList(); backtrack(permutations,new ArrayList<Integer>(),nums); return permutations; } private void backtrack(List<List<Integer>> permutations,List<Integer> tempList,int[] nums){ if(tempList.size()==nums.length){ permutations.add(new ArrayList<Integer>(tempList)); return; } for(int i=0;i<nums.length;i++){ if(tempList.contains(nums[i])){ continue; } tempList.add(nums[i]); backtrack(permutations,tempList,nums); tempList.remove(tempList.size()-1); } }

我想向所有元素添加一个,并执行两个不同的操作

  1. x.shape=(batch_size,10)
  2. x=x+1

这两个操作具有相同的张量,但是当我调用for i in range(0,batch_size): x[i]=x[i]+1时,(2)在反向传播中所花费的时间比(1)多得多。

它们之间有什么区别?

1 个答案:

答案 0 :(得分:0)

这是预料之中的。首先,转发速度也要慢很多:在您的for循环中,Python向PyTorch发送以下请求的batch_size倍:

  1. 获取i的第x个元素
  2. 添加1
  3. 使用增加后的值更新i的第x个元素

Python运行缓慢。在第二版中,Python向PyTorch分配了一条消息“到处添加1”。 PyTorch比Python快得多(更不用说它具备的GPU加速功能了)。这要归功于称为vectorization的技术,它不是特定于PyTorch的技术,而是基本上所有的Python(以及许多其他)数学软件包。

第二,对于您的后退,PyTorch需要跟踪x发生的所有操作并通过它们进行反向传播。在第一种情况下,有batch_size个,在第二种情况下,只有一个。再次,矢量化是胜利。