pytorch学习记录(1) Tensor

1 tensor

Tensors类似于NumPy的Ndarry,唯一的区别是Tensor可以在GPU加速

1.0 Tensor 数据的存储

  • .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]]
    
    • .data的其他操作
    x.data.zero_()   # 用于网络初始化
    

1.1 tensor 的创建

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 的随机排列

1.2 得到tensor的形状

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

1.3 改变tensor的类型

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.4 tensor的操作

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])

猜你喜欢

转载自blog.csdn.net/qq_33993729/article/details/107142344