Tensors类似于NumPy的Ndarry,唯一的区别是Tensor可以在GPU加速
.data
: 存储数据
.grad
: 存储梯度
如果我们想要修改 tensor 的数值,但是⼜不希望被 autograd 记录(即不会影响反向传播),
那么可以对 tensor.data 进⾏操作
tensor <-> numpy
x = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
x.data
# tensor([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
y = x.data.numpy() 或者 y = x.numpy()
print(y)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
x.data.zero_() # 用于网络初始化
import torch
import numpy as np
# 直接创建 tensor
x = torch.empty(5, 3)
x = torch.rand(5,3)
x = torch.ones(5,3)
x = torch.zeros(5,3)
# 从数据直接构建tensor,(数据可以是list,numpy)
a = [1,2,3,4]
b = np.array([1,2,3,4])
x = torch.tensor(a)
x = torch.tensor(b) # 不与ndarry共享内存
x = torch.from_numpy(b) # 与ndarry共享内存
x = torch.arange(2,10,2) # tensor([2, 4, 6, 8])
x = torch.linspace(2,10,6) # tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])
# 从一个已有的tensor构建一个新的tensor
x = x.new_ones(5,3)
x = torch.rand_like(x,dtype = torch.float)
# 依概率分布创建张量
torch.normal(mean,std) # 正态分布 mean: 张量 std: 张量 长度一定要相同
torch.randn() # 标准正态 只需要输入size
torch.rand() # [0,1) 均匀分布
torch.randint(low,high,size) # [low,high) 整数均匀分布
torch.randperm(n) # 生成从0 到 n-1 的随机排列
x = torch.tensor([[1,2,3],[4,5,6],[7,8,9]])
print("x.size(): ", x.size()) # x.shape # x.size(): torch.Size([3, 3])
# 返回的是一个近似数组的类型?,可以取值,不可以赋值
print(x.shape[0]) # 3
x= x.double()
x=x.long()
tensor = torch.Tensor(3, 5)
torch.long() 将tensor投射为long类型
newtensor = tensor.long()
torch.half()将tensor投射为半精度浮点类型
newtensor = tensor.half()
torch.int()将该tensor投射为int类型
newtensor = tensor.int()
torch.double()将该tensor投射为double类型
newtensor = tensor.double()
torch.float()将该tensor投射为float类型
newtensor = tensor.float()
torch.char()将该tensor投射为char类型
newtensor = tensor.char()
torch.byte()将该tensor投射为byte类型
newtensor = tensor.byte()
torch.short()将该tensor投射为short类型
newtensor = tensor.short()
1. 拼接 |
---|
2. 切分 |
3.张量索引 |
4 .张量形状变换 |
5 .张量数学计算 |
6. 聚合类的操作 |
# 1.拼接
t = torch.ones((2, 3))
torch.cat([t,t],dim = 0) # 将张量按维度dim进行拼接 0 : 按行拼接,列数不变 4*3
torch.stack([t,t],dim = 0) # 在新创建的维度dim上进行拼接 在第0维度拼接,创建一个新的维度 2*2*3
# 2.切分
torch.chunk(input,chunks,dim=0) # 将input张量按维度dim进行平均切分成chunks份 ,若不能整除,最后一份小于其他张量
torch.split(tensor,split_size_or_sections,dim=0) # split_size_or_sections: int:每个切片的长度 list:给定每个切片长度
# 3.张量索引
torch.index_select(input,dim,index) # 在维度dim上,按index索引数据||返回值:依照index索引数据拼接的张量 (相当于选哪几行/列)
torch.masked_select(input,mask) # 按mask中的true进行索引 mask同input形状 返回:一维张量
#
# 生成mask:
# gt(v) 大于v是true te(v) 大于等于v
# lt() le() 小于/小于等于
# 4 张量形状变换
torch.reshape(input,shape)
torch.transpose(input,dim0,dim1) # 交换dim0和dim1的维度 常用于图像预处理 C*H*W -> H*W*C
torch.t() # 专门2维张量转置,对矩阵来说,等价于torch.transpose(input,0,1)
torch.squeeze(input,dim) # 压缩长度为1的维度(轴) dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1,可以被移除
torch.unsqueeze(input,dim) # 依据dim扩展维度
'''
5 张量数学计算
(1)加减乘除
(2)对数,指数,幂函数
(3)三角函数
'''
y = torch.rand(1,2)
torch.exp(y),torch.log2(y),torch.log(y),torch.cos(y)
or:# 两种操作都可以
y.exp(),y.log2(),y.log(),y.cos()
# 6 聚合类的操作
z = torch.ones(2,3)
z.sum(),z.min(),z.max(),z.mean()
# 按某一轴操作
z= torch.ones(2,3)
print(z)
print()
print(z.mean()) # tensor(1.) 整个tensor的均值(mean,max,sum...同理)
print(z.mean(axis=0)) # tensor([1., 1., 1.]) 对第0轴求均值
print(z.mean(axis=1)) # tensor([1., 1.]) 对第1轴求均值
# im2col
x = torch.ones(1,3,100,100) # [N,Channel,H,W]
windows = torch.nn.functional.unfold(x,kernel_size=5)
print(windows.size()) # [1,5*5*3,96*96] torch.Size([1, 75, 9216])
processed = windows
out = torch.nn.functional.fold(processed,x.shape[-2:],kernel_size=5)
print(out.size()) # torch.Size([1, 3, 100, 100])