pytorch进阶

使用pytorch构建神经网络系列

第二章 第二节 pytorch进阶

目录


1.Broadcasting

key idea:
-Insert 1 dim ahead
-Expand dims with size 1 to same size
-Feature maps:[4,32, 14,14]
-Bias:[32,1,1] ==> [1,32,1,1] ==>[4,32, 14,14]

Match from Last dim!!

  • If current dim = 1, expand to same
  • if either has no dim, insert one dim and expand to same
  • otherwise,NOT broadcasting-able

2.Merge/split

cat
合并(其他dim必须一致)

a = torch.rand(4,28,28)
b = torch.rand(5,28,28)
torch.cat([a,b],dim = 0).shape
torch.Size([9, 28, 28])

stack
creat new dim:

a = torch.rand(28,28)
b = torch.rand(28,28)
torch.stack([a,b],dim = 0).shape
torch.Size([2, 28, 28])

split

a = torch.rand(5,28,28)
aa, bb = a.split([2,3], dim = 0)
aa.shape, bb.shape
(torch.Size([2, 28, 28]), torch.Size([3, 28, 28]))

Chunk: by num

a = torch.rand(6,28,28)
aa, bb = a.chunk(2, dim = 0)
aa.shape, bb.shape
(torch.Size([3, 28, 28]), torch.Size([3, 28, 28]))

3.数学运算

matmul

=@

a = torch.full([2,2],8, dtype = torch.float)
b = torch.ones(2,2)
torch.matmul(a, b)
a@b
tensor([[16., 16.],
    [16., 16.]])
a = torch.rand(4, 784)
w = torch.rand(512, 784)
(a@w.t()).shape
torch.Size([4, 512])

实现并行相乘

a = torch.rand(4, 3, 28, 32)
b = torch.rand(4, 3, 32, 28)
torch.matmul(a, b).shape
torch.Size([4, 3, 28, 28])

Power

a = torch.full([2,2], 3, dtype = float)
a.pow(2)
tensor([[9., 9.],
    [9., 9.]], dtype=torch.float64)
aa = a**2
aa
tensor([[9., 9.],
    [9., 9.]], dtype=torch.float64)
aa.sqrt()
aa**(0.5)
tensor([[3., 3.],
    [3., 3.]], dtype=torch.float64)
aa.rsqrt() #平方根倒数
tensor([[0.3333, 0.3333],
    [0.3333, 0.3333]], dtype=torch.float64)

Exp / log

a = torch.exp(torch.ones(2,2)) # e的1次方
a
tensor([[2.7183, 2.7183],
    [2.7183, 2.7183]])
torch.log(a) #默认以e为底
tensor([[1.0000, 1.0000],
    [1.0000, 1.0000]])

Approximation

  • .floor() .ceil() 向下取整 和向上取整
  • .round() 四舍五入
  • .trunc() .frac()整数部分与小数部分
a = torch.tensor(3.1415)
a.floor(),a.ceil(),a.trunc(),a.frac(),a.round()
(tensor(3.), tensor(4.), tensor(3.), tensor(0.1415), tensor(3.))

clamp

grad = torch.rand(2,3)*19
grad
tensor([[ 0.2305,  0.0978,  0.6458],
    [ 4.6174,  9.2011, 11.8627]])

最小值设置为10

grad.clamp(10)
tensor([[10.0000, 10.0000, 10.0000],
    [10.0000, 10.0000, 11.8627]])

设置在(0,10)区间

grad.clamp(5,10)
tensor([[ 5.0000,  5.0000,  5.0000],
    [ 5.0000,  9.2011, 10.0000]])

4.属性统计

norm

a = torch.full([8],1, dtype = float)
b = a.view(2,4)
c = a.view(2,2,2)
a,b,c
(tensor([1., 1., 1., 1., 1., 1., 1., 1.], dtype=torch.float64),
 tensor([[1., 1., 1., 1.],
         [1., 1., 1., 1.]], dtype=torch.float64),
 tensor([[[1., 1.],
          [1., 1.]],
 
         [[1., 1.],
          [1., 1.]]], dtype=torch.float64))

L1范数

a.norm(1),b.norm(1),c.norm(1)
(tensor(8., dtype=torch.float64),
 tensor(8., dtype=torch.float64),
 tensor(8., dtype=torch.float64))

L2范数

a.norm(2),b.norm(2),c.norm(2)
(tensor(2.8284, dtype=torch.float64),
 tensor(2.8284, dtype=torch.float64),
 tensor(2.8284, dtype=torch.float64))

指定维度:

b.norm(2,dim = 0)
tensor([1.4142, 1.4142, 1.4142, 1.4142], dtype=torch.float64)

mean, sum, min, max, prod(累积)

a = torch.arange(1,9).view(2,4).float()
a
tensor([[1., 2., 3., 4.],
        [5., 6., 7., 8.]])
a.mean(), a.sum(), a.min(), a.max(), a.prod()
(tensor(4.5000), tensor(36.), tensor(1.), tensor(8.), tensor(40320.))

最大值最小值索引

a.argmax(), a.argmin() #默认铺平 可以加上dim = ,指定维度

(tensor(7), tensor(0))
dim / keepdim

a = torch.rand(4,10)
a.max(dim = 1)
torch.return_types.max(
values=tensor([0.8951, 0.9522, 0.6955, 0.9705]),
indices=tensor([1, 6, 0, 9]))
a.max(dim = 1, keepdim = True)
torch.return_types.max(
values=tensor([[0.8951],
        [0.9522],
        [0.6955],
        [0.9705]]),
indices=tensor([[1],
        [6],
        [0],
        [9]]))

top-k/k-th

a.topk(3, dim =1, largest = True)
torch.return_types.topk(
values=tensor([[0.8951, 0.8779, 0.8563],
        [0.9522, 0.9264, 0.8587],
        [0.6955, 0.6641, 0.5106],
        [0.9705, 0.9102, 0.7651]]),
indices=tensor([[1, 0, 5],
        [6, 4, 9],
        [0, 7, 1],
        [9, 5, 8]]))

第k小

a.kthvalue(10, dim =1)
torch.return_types.kthvalue(
values=tensor([0.8951, 0.9522, 0.6955, 0.9705]),
indices=tensor([1, 6, 0, 9]))

compare
<,<=,>=,>,!=,==
返回1或0

5.Tensor advanced operation

where
torch.where(condition, x, y) ⇒ tensor

probility = torch.rand(2,2)
a = torch.zeros(2, 2)
b = torch.ones(2, 2)
probility,a,b
(tensor([[0.9443, 0.5826],
         [0.3918, 0.5968]]),
 tensor([[0., 0.],
         [0., 0.]]),
 tensor([[1., 1.],
         [1., 1.]]))
torch.where(probility > 0.5, b, a)
tensor([[1., 1.],
        [0., 1.]])

gather
查表
torch.gather(input, dim, index, out = None) ==> Tensor

prob = torch.randn(4,10)
idx = prob.topk(dim = 1, k = 2)
idx[1]
tensor([[3, 4],
        [5, 2],
        [1, 4],
        [6, 3]])
label = torch.arange(10) + 50
label
tensor([50, 51, 52, 53, 54, 55, 56, 57, 58, 59])
torch.gather(label.expand(4,10), dim = 1, index = idx[1])
tensor([[53, 54],
        [55, 52],
        [51, 54],
        [56, 53]])
上一篇:3.5tensorflow线性回归和线性拟合


下一篇:BugkuCTF-MISC题善用工具