『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较

Posted 叠加态的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较相关的知识,希望对你有一定的参考价值。

一、简单数学操作

1、逐元素操作

t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域。
a = t.arange(0,6).view(2,3)
print("a:",a)
print("t.cos(a):",t.cos(a))
print("a % 3:",a % 3)  # t.fmod(a, 3)
print("a ** 2:",a ** 2)  # t.pow(a, 2)
print("t.clamp(a, min=2, max=4)",t.clamp(a,min=2,max=4))
a: 
 0  1  2
 3  4  5
[torch.FloatTensor of size 2x3]

t.cos(a): 
 1.0000  0.5403 -0.4161
-0.9900 -0.6536  0.2837
[torch.FloatTensor of size 2x3]

a % 3: 
 0  1  2
 0  1  2
[torch.FloatTensor of size 2x3]

a ** 2: 
  0   1   4
  9  16  25
[torch.FloatTensor of size 2x3]

t.clamp(a, min=2, max=4) 
 2  2  2
 3  4  4
[torch.FloatTensor of size 2x3]

2、归并操作

b = t.ones(2,3)
print("b.sum():",b.sum(dim=0,keepdim=True))
print("b.sum():",b.sum(dim=0,keepdim=False))
b.sum(): 
 2  2  2
[torch.FloatTensor of size 1x3]

b.sum(): 
 2
 2
 2
[torch.FloatTensor of size 3]

cumsum和cumprob(累加和累乘)属于特殊的归并,结果相对于输入并没有降维。

3、比较操作

之前有说过,t.max用法较为特殊;而a.topk是个对于深度学习很是方便的函数。

a = t.linspace(0,15,6).view(2,3)
print("a:",a)
print("a.sort(2):\n",a.sort(dim=1))  # 在某个维度上排序
print("a.topk(2):\n",a.topk(2,dim=1))  # 在某个维度上寻找top-k
print("t.max(a):\n",t.max(a))  # 不输入dim的话就是普通的max
print("t.max(a,dim=1):\n",t.max(a,dim=1))  # 输入dim的话就会集成argmax的功能
a: 
  0   3   6
  9  12  15
[torch.FloatTensor of size 2x3]

a.sort(2):
 (
  0   3   6
  9  12  15
[torch.FloatTensor of size 2x3]
, 
 0  1  2
 0  1  2
[torch.LongTensor of size 2x3]
)
a.topk(2):
 (
  6   3
 15  12
[torch.FloatTensor of size 2x2]
, 
 2  1
 2  1
[torch.LongTensor of size 2x2]
)
t.max(a):
 15.0
t.max(a,dim=1):
 (
  6
 15
[torch.FloatTensor of size 2]
, 
 2
 2
[torch.LongTensor of size 2]
)

二、Numpy和Tensor

1、数组和张量内存共享

import numpy as np

# 数组和Tensor互换
a = t.ones(2,3)
b = a.numpy()
c = t.from_numpy(b)
c[0,0] = 0
print(a)
 0  1  1
 1  1  1
[torch.FloatTensor of size 2x3]

2、广播原理及模拟

# 广播法则
# 1.所有数组向shape最长的数组看齐,不足的在前方补一
# 2.两个数组要么在某个维度长度一致,要么一个为一,否则不能计算
# 3.对长度为一的维度,计算时复制元素扩充至和此维度最长数组一致
a = t.ones(3,2)
b = t.ones(2,3,1)
print(a + b)  # 先a->(1,3,2)然后a,b->(2,3,2)
(0 ,.,.) = 
  2  2
  2  2
  2  2

(1 ,.,.) = 
  2  2
  2  2
  2  2
[torch.FloatTensor of size 2x3x2]

使用尺寸调整函数模拟广播过程如下,

# 手工复现广播过程
# expend可以扩张维度的数字大小,repeat类似,但是expend不会复制数组内存,节约空间
# 被扩充维度起始必须是1才行
print(a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2))
print(a.view(1,3,2).expand(2,3,2) + b.expand(2,3,2))
(0 ,.,.) = 
  2  2
  2  2
  2  2

(1 ,.,.) = 
  2  2
  2  2
  2  2
[torch.FloatTensor of size 2x3x2]


(0 ,.,.) = 
  2  2
  2  2
  2  2

(1 ,.,.) = 
  2  2
  2  2
  2  2
[torch.FloatTensor of size 2x3x2]

3、expand方法

我们来看看expand方法,它要求我们的被扩展维度为1才行(如下),如果不是1则扩展失败。

expand方法不会复制数组,不会占用额外空间,只有在需要时才进行扩展,很节约内存。

a = t.ones(1)
print(a.shape)
b = a.expand(6)
a = 2
print(a)
torch.Size([1])
2
 1
 1
 1
 1
 1
 1
[torch.FloatTensor of size 6]

 

以上是关于『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较的主要内容,如果未能解决你的问题,请参考以下文章

『PyTorch』第五弹_深入理解Tensor对象_上:初始化以及尺寸调整

『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较

『PyTorch』第五弹_深入理解autograd_下:函数扩展&高阶导数

『PyTorch』第五弹_深入理解autograd_上:Variable

『PyTorch』第五弹_深入理解autograd_下:Variable梯度探究

C语言期末第五弹