一简单数学操作
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]
3expand 方法
我们来看看 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]
来源: http://www.bubuko.com/infodetail-2496799.html