Pytorch 学习笔记

Torch

张量数据类型

torch内的多数数据类型与python中相比多了个tensor

但是pytorch不少完备的语言库,所以不支持string。所以表示string可以用:

  • One-hot编码 [0 1 0 0 0 ....]
  • Embedding: word2vec 、 glove

可以用a.type()方法返回tensor的具体类似(cpu下的tensor与gpu下的tensor不同)

dimension=0

torch.tensor(1.0) torch.tensor(1.3) dimension=0

可以用a.shape成员返回维度

可以用a.size()成员函数返回尺寸

dimension=1

torch.tensor([1.1,1.2]) torch.FloatTensor(1)(随机初始化一个数据)

torch.FloatTensor(2)(随机初始化两个数据)

torch.from_numpy(np.ones(2))

dim: 2
size/shape [2,2]
data [1,2;3,4]

dimension=2(Linear)

a=torch.randn(2,3)

tensor([[1,2,3],[4,5,6]])

a.size(0)=2

a.size(1)=3

dimension=3(RNN)

a=torch.rand(1,2,3)

a.shape=torch.size([1,2,3])

dimension=4(CNN)[batch、color、height、weight]

a=torch.rand(2,3,28,28)

Mixed

  1. a.numel() = 23**2828
  2. a.dim=4
a = np.array([2, 3.3])
b = torch.from_numpy(a)
print(b)

a=torch.tensor([2.,3.2])
print(a)

b=torch.FloatTensor(3,4)
print(b)

可以用torch.set_default_tensor_type(torch.DoubleTensor)转换默认张量类型

Tensor初始化

  1. torch.rand(3,3)

  2. torch.rand_like(a)(读取a的shape并传给torch)

  3. randint(1,10,)最大最小值

  4. 设置均值、方差:torch.noral(mean=otrch,full([10],0),std=torch.arange(1,0,-0.1))

  5. 填充固定值:torch.full([2,3],7) torch.full([],1)

  6. 等差序列:torch.arange(0,10,1) = tensor([0,1,2,3,4,5,6,7,8,9])

  7. 等分序列:torch.linspace(0,10,steps=10) torch.logspace(0,10,steps=10)

  8. torch.ones(3,3) torch.zeros(3,3) torch.eye(3)(对角线矩阵)

  9. 随机打散:torch.randperm(10) = tensor([1,5,4,2,8,6,9,7,0])

idx=torch.randperm(2)

a[idx] b[idx]

索引与切片

  1. 索引

a=torch.rand(4,3,28,28)

a[0].shape=torch.Size([3,28,28])

a[0,0].shape=torch.Size([28,28])

a[0,0,2,4]=tensor(0.8082)

a[:2].shap=torch.size([2,3,28,28])

a[:2,:1,:,:].shape=torch.size([2,1,28,28])

a[:2,1:,:,:].shape=torch.size([2,2,28,28])

a[:2,-1:,:,:].shape=torch.size([2,1,28,28])

a[:,:,0:28:2,0:28:2].shape=torch.size([4,3,14,14])

  1. 具体索引

a.index_select(0,[0,2])=torch.size([2,3,28,28])

a.index_select(1,[1,2])=torch,size([4,2,28,28])

a.index_select(2,torch,arange(8))=torch.size([4,2,8,28])

a[:,1,...].shape=torch.size([4,28,28])

a[...,:2].shape=torchsize([4,3,28,2])

维度变换

  1. view/reshape 尺寸变换

a=torch.rand(4,1,28,28)

a.shape=torch.size([4,1,28,28])

a.view(4,28*28).shape=torch.size([4,784])

a.view(4*28,28).shape=torch,size([112,28])

  1. squeeze/unsqueeze 维度压缩、扩展

a.shape=torch.size([4,1,28,28])

a.unsqueeze(0).shape=torch.size([1,4,1,28,28])

a.unsqueeze(-1).shape=torch.size([4,1,28 ,28,1])

a.unsqueeze(-4).shape=torch.size([4,1,1,28 ,28]) [-a.dim()-1,a.dim()+1)

b=torch.rand([1,32,1,1])

b.squeeze().shape=torch.size([32])

b.squeeze(0).shape=torch.size([32,1,1])

b.squeeze(-1).shape=torch.size([1.32.1])

  1. expand/repeat 维度数据量增加

b.expand(4,32,14,14).shape=torch.size([4,32,14,14])

只能用1去拓展,不变时expand中对应维度填-1

b.repeat(4,32,1,1).shape=torch.size([4,1024,1,1])

repeat中表示每个维度要复制的次数。

  1. .t转置

只能对2D的tensor

  1. Transpose

a.transpose(1,3) 对维度1和维度3转置

  1. permute

b.permute(0,2,3,1).shape=torch.size([4,28,32,3])

broadcasting

对tensor进行维度扩张。

  • lnsert 1 dim ahead
  • expand dims with size 1
  • Feature maps:[4,32,14,14]
  • Bias:[32,1,1]=>[1,32,1,1]=>[4,32,14,14]

broadcasting 降低内存消耗。

A=torch.rand([4,32,8])

B=torch.rand([1])

最后一维指定,然后依次往前扩展。

拼接与拆分

cat\stack\split\chunk

  1. cat

a=torch.rand(4,32,8)

b=torch.rand(5,32,8)

torch.cat([a,b],dim=0).shape=torch.size(9,32,8)

在指定的dim维度上进行拼接,只能在拼接维度上不同

  1. stack(多出一维)

a=torch.rand(32,8)

b=torch.rand(32,8)

torch.stack([a,b],dim=0).shape=torch.size([2,32,8])

每个维度的大小都要相同

  1. split(按长度拆分)

c=troch.rand(2,32,8)

aa,bb=c.split(1,dim=0)

aa.shape=bb.shape=torch.size([1,32,8])

aa,bb=c.split([2,1],dim=0)维度0前两个在一起,最后一个在一起

  1. chunk(按数量拆分)

表示拆分后的数目

aa,bb=c.chunk(2,dim=0)

数学运算

a=torch.rand(3,4)

b=torch.rand(4)

eq =
add +
sub -
mul 点乘 *
div /
pow 平方 **
sqrt **(0.5)
exp 自然指数为底
logx 以x为底
floor 向下取整 舍去小数
ceil 向上取整 +1
round 四舍五入
trunc 舍去小数
frac 只留下小数
  • Torch.matmul (a,b) a@b矩阵相乘

a=torch.rand(4,3,28,64)

b=torch.rand(4,1,64,32)

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

  • clamp 裁剪 梯度裁剪

clamp(min) 小于min的赋值为min

clamp(min,max) 保证值在min和max之间

统计属性

  1. norm范数

a=torch.full([8],1)

b=a.view(2,4)

a.norm(1)=tensor(8.)

b.norm(1)=tensor(8.)

a.norm(2)=tensor(2.8284)

b.norm(2)=tensor(2.8284)

b.norm(1,dim=1)=tensor([4,4])

b.norm(2,dim=1)=tensor([2,2])

min
max
mean
prod 累乘
argmax 返回最大值的索引
argmin 返回最小值的索引

dim指定所需要统计的维度

keepdim保留所得的维度即[4,1]

  • Top-k/kthvalue

a.top(2,dim=1) 返回概率最大的前两个的值和索引

a.top(3,dim=1,largest=False)返回概率最小的三个值和索引

a.kthvalue(8,dim=1)第kth小的值和索引

== torch.eq
!=
>/>=
</<=

返回tensor.uint8

高阶操作

  • where

cond=tensor([[0.6,0.7],[0,8,0.4]])

torch.where(cond>0.5,a,b)

  • gather

posted @ 2021-09-13 23:50  小姜爱学习  阅读(22)  评论(0)    收藏  举报