笔记 | PyTorch张量Tensor的一些必备操作
共 5234字,需浏览 11分钟
·
2021-09-14 15:34
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
张量是什么?
标量:0维张量;比如一个单独的数字1
向量:1维张量;比如一组排列好的数:1,2,3,4,5,6
矩阵:2为张量;比如一个灰度图矩阵
3维张量;比如一个彩色图RGB
n维张量
张量是一个多维数组,它是标量、向量、矩阵的高维扩展
Variable是PyTorch0.4.0之前的内容,现在并入Tensor了!
Variable是torch.autograd中的数据类型,后来并入了Tensor,主要目的是为了封装求导
五个属性:
data:被包装的Tensor
grad:data的梯度
grad_fn:创建Tensor的Func,记录比如操作加法还是乘法
requires_grad:是否需要求梯度
is_leaf:是否是叶子结点(张量)
后来Variable就并入了Tensor中
现在是8个属性:
dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor
shape:张量的形状
device:张量所在的设备,GPU还是CPU
那么张量有哪些必备的创建方法值得学习?
这些代码王博Kings都一个一个敲打注释的,可以直接运行
import numpy as np
import torch
通过torch.tensor创建张量
arr = np.ones((3,3))
print("由np.ones生成的数据:\n",arr)
print("ndarray的数据类型:",arr.dtype,"\n")
#t = torch.tensor(arr, device='cuda')
t = torch.tensor(arr)
print("torch.tensor创建好的Tensor:\n",t)
输出结果:
由np.ones生成的数据:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
ndarray的数据类型:float64
torch.tensor创建好的Tensor:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
Process finished with exit code 0
通过torch.from_numpy创建张量
arr = np.array([[1,2,3],[4,5,6]])
print("由np.array生成的数据:\n",arr)
t = torch.from_numpy(arr)
print("torch.from_numpy创建好的Tensor:\n",t)
# 由from_numpy创建的Tensor是共享内存空间
# 修改numpy中的一个数字,看看tensor有没有变化
print("\n=======================\n修改arr")
arr[0,0]=9
print("由np.array生成的数据:\n",arr)
t = torch.from_numpy(arr)
print("torch.from_numpy创建好的Tensor:\n",t)
# 由from_numpy创建的Tensor是共享内存空间
# 修改tensor中的一个数字,看看numpy有没有变化
print("\n=======================\n修改t")
t[0,0]=-9
print("由np.array生成的数据:\n",arr)
t = torch.from_numpy(arr)
print("torch.from_numpy创建好的Tensor:\n",t)
运行结果
由np.array生成的数据:
[[1 2 3]
[4 5 6]]
torch.from_numpy创建好的Tensor:
tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)
=======================
修改arr
由np.array生成的数据:
[[9 2 3]
[4 5 6]]
torch.from_numpy创建好的Tensor:
tensor([[9, 2, 3],
[4, 5, 6]], dtype=torch.int32)
=======================
修改t
由np.array生成的数据:
[[-9 2 3]
[ 4 5 6]]
torch.from_numpy创建好的Tensor:
tensor([[-9, 2, 3],
[ 4, 5, 6]], dtype=torch.int32)
Process finished with exit code 0
通过torch.zeros创建张量
out_t = torch.tensor(([1]))
t = torch.zeros((3,3), out=out_t)
print("t的值:\n",t,"\n out_t的值\n",out_t)
print("看一下t和out_t的id位置号\n",id(t),"\n",id(out_t))
输出结果
t的值:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
out_t的值
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
看一下t和out_t的id位置号
1819528746952
1819528746952
Process finished with exit code 0
通过torch.full创建全相同的张量
t = torch.full((3,3),10)
print("torch.full((3,3),10)的输出结果\n",t)
输出结果
torch.full((3,3),10)的输出结果
tensor([[10., 10., 10.],
[10., 10., 10.],
[10., 10., 10.]])
通过torch.arange创建等差数列张量
t = torch.arange(2,10,2)
print("torch.arange(2,10,2)的输出结果\n",t)
输出结果
torch.arange(2,10,2)的输出结果
tensor([2, 4, 6, 8])
通过torch.linspace创建均分数列 张量
步长=(Start - end)/(Steps - 1)
t = torch.linspace(2,10,5)
print("torch.linspace(2,10,5)的输出结果\n",t)
t = torch.linspace(2,10,6)
print("torch.linspace(2,10,6)的输出结果\n",t)
输出结果
torch.linspace(2,10,5)的输出结果
tensor([ 2., 4., 6., 8., 10.])
torch.linspace(2,10,6)的输出结果
tensor([ 2.0000, 3.6000, 5.2000, 6.8000, 8.4000, 10.0000])
通过torch.eye创建单位对角矩阵
t = torch.eye(3)
print("torch.eye(3)的输出结果\n",t)
输出结果
torch.eye(3)的输出结果
tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
通过torch.normal()创建概率分布的张量
# mean:张量 std: 张量
print("-----------mean:张量 std: 张量---------")
mean = torch.arange(1, 5, dtype=torch.float)
std = torch.arange(1, 5, dtype=torch.float)
print("mean是:",mean,"\n std是:",std)
t_normal = torch.normal(mean, std)
print("t_normal是\n",t_normal)
# mean:标量 std: 标量
print("-----------mean:标量 std: 标量---------")
t_normal = torch.normal(0., 1., size=(5,))
print("torch.normal(0., 1., size=5,))输出\n",t_normal)
# mean:张量 std: 标量
print("-----------mean:张量 std: 标量---------")
mean = torch.arange(1, 5, dtype=torch.float)
std = 1
print("mean是:",mean,"\n std是:",std)
t_normal = torch.normal(mean, std)
print("t_normal是\n",t_normal)
输出结果:
-----------mean:张量 std: 张量---------
mean是:tensor([1., 2., 3., 4.])
std是:tensor([1., 2., 3., 4.])
t_normal是
tensor([ 1.0527, 2.8746, 5.1393, -2.5108])
-----------mean:标量 std: 标量---------
torch.normal(0., 1., size=5,))输出
tensor([-0.7771, -0.7684, 0.8846, 0.5542, 1.3451])
-----------mean:张量 std: 标量---------
mean是:tensor([1., 2., 3., 4.])
std是:1
t_normal是
tensor([0.5560, 1.9777, 2.9634, 2.7911])
Process finished with exit code 0
好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~