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
- a.numel() = 23**2828
- 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初始化
-
torch.rand(3,3)
-
torch.rand_like(a)(读取a的shape并传给torch)
-
randint(1,10,)最大最小值
-
设置均值、方差:torch.noral(mean=otrch,full([10],0),std=torch.arange(1,0,-0.1))
-
填充固定值:torch.full([2,3],7) torch.full([],1)
-
等差序列:torch.arange(0,10,1) = tensor([0,1,2,3,4,5,6,7,8,9])
-
等分序列:torch.linspace(0,10,steps=10) torch.logspace(0,10,steps=10)
-
torch.ones(3,3) torch.zeros(3,3) torch.eye(3)(对角线矩阵)
-
随机打散:torch.randperm(10) = tensor([1,5,4,2,8,6,9,7,0])
idx=torch.randperm(2)
a[idx] b[idx]
索引与切片
- 索引
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])
- 具体索引
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])
维度变换
- 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])
- 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])
- 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中表示每个维度要复制的次数。
- .t转置
只能对2D的tensor
- Transpose
a.transpose(1,3) 对维度1和维度3转置
- 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
- 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维度上进行拼接,只能在拼接维度上不同
- stack(多出一维)
a=torch.rand(32,8)
b=torch.rand(32,8)
torch.stack([a,b],dim=0).shape=torch.size([2,32,8])
每个维度的大小都要相同
- 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前两个在一起,最后一个在一起
- 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之间
统计属性
- 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


浙公网安备 33010602011771号