为什么写本博客
前人种树,后人乘凉。希望自己的学习笔记可以帮助到需要的人。
本博客定位
帮助那些了解原理(指深度学习原理知道),想要实现自己想法的朋友。
本文目录
Tensor,即张量,是PyTorch中的基本操作对象,可以看做是包含单一数据类型元素的多维矩阵。从使用角度来看,Tensor与NumPy的ndarrays非常类似,相互之间也可以自由转换,只不Tensor还支持GPU的加速。
因此,可以大胆的把tensor看作类似array的对象。
import torch
a = torch.tensor([
[1,2],
[2,3]
])
print(a)
注意:如果数据全为整数,那么tensor默认为INT64类型,一旦有小数,类型就会变为float32。
import torch
c = torch.zeros((2,3)) # 输入指定形状即可
print(c) # 默认为float32
import torch
d = torch.ones((3,3))
print(d)
import torch
e = torch.eye(5)
print(e)
import torch
f = torch.randn((3,3)) # 正态分布,均值为0,方差为1
g = torch.randn((3,3)) # 均匀分布,[0,1)的均匀分布
print(f)
import torch
g = torch.arange(1,20,3) # 起始值,结束值,步长
print(g)
h = torch.linspace(1,100,100) # [start=1,end-100]个数100个
print(h)
print(h.size())
不难看出,其实上面的方法很多和numpy中的方法几乎一模一样,因此pytorch学起来也是成本十分低的。
import torch
a = torch.randn((4,3))
# shape
print(a.shape) # 由numpy推出来的
print(a.size())
import torch
a = torch.randn((4,3))
# dtype
print(a.dtype)
import torch
a = torch.randn((3,4))
print('before abs(a),a is :\n',a)
b = torch.abs(a) # 计算绝对值
print('after abs(a),a is :\n',b)
import torch
# add
c = torch.ones((2,3))
d = torch.ones((2,3))
print(c+d) # 方法一
print(torch.add(c,d)) # 方法二
注意,如果是一个张量与标量相加,那么结果是所有元素都加上标量。
裁剪意思是将tensor中每个值与上界和下界比较,低于下界则改写为下界值,高于上界则改写为上界值,中间的不变。
import torch
# cut
e = torch.tensor([
[1,2,3,4,5],
[0,1,2,3,4]
])
print(torch.clamp(e,2,4)) # 裁剪对象,下界,上界
import torch
# div
f = torch.tensor([
[1,2,3,4,5],
[2,4,6,8,10]
])
g = torch.ones((2,5))
print(torch.div(f,2))
print(torch.div(f,g))
通过结果不难看出,除法是对应元素相除。
import torch
# pow
h = torch.tensor([1,2,3,4,5])
print(torch.pow(h,3))
import torch
# mul
f = torch.tensor([
[1,2,3,4,5],
[2,4,6,8,10]
])
g = torch.ones((2,5))
print(torch.mul(f,g))
import torch
# matrix mul
i = torch.tensor([
[2,2],
[3,3]
])
j = torch.tensor([
[1,2,3],
[2,3,4]
])
print(torch.mm(i,j))
import torch
import numpy as np
# tensor ---> numpy
a = torch.ones(3)
b = a.numpy()
c = np.array(a)
print(type(b))
print(type(c))
import torch
import numpy as np
# tensor ---> numpy
a = torch.ones(3)
b = a.numpy()
# array ---> tensor
f = torch.tensor(b)
print(f)
tensor的索引和普通的索引没有什么区别,只是需要注意的是tensor中的内存共享:
import torch
a = torch.randn((3,4))
b = a[0,0]
print(b)
b += 1
print(a)
运行结果为:
tensor(-0.4613)
tensor([[ 0.5387, -1.2455, 0.4596, -0.9547],
[ 1.7746, 0.2623, -0.2514, 1.4591],
[-0.1769, 2.2323, 0.1277, 0.2700]])
即,虽然我们把a[0,0]赋值给了变量b,但是由于两者内存都指向的同一个地址,因此你修改b,a对应值也会变化。
import torch
a = torch.randn(5,4)
# 先克隆一个
b = torch.clone(a)
# 再改变形状
c = a.view(4,5)
print(c)
注意:由于内存共享,因此在改变形状之前,先克隆一个备份,再来改变形状。
还有一个类似的方法:
import torch
a = torch.randn(5,4)
b = torch.reshape(a,(4,5)) # 参照numpy方法
print(b)