你好啊,学习深度学习的小伙伴( •̀ ω •́ )✧
在安装完PyTorch的基础上,一起看看其中一个基础且重要的内容吧——张量
首先,你需要导入PyTorch包
import torch
非常简单对不对,好嘞,接下来就可以继续认识张量啦
张量这个术语起源于力学(对,力学),最初是用来表示弹性介质中各点应力状态的(应力状态(stress state)指的是物体受力作用时,其内部应力的大小和方向不仅随截面的方位而变化,而且在同一截面上的各点处也不一定相同。应变状态理论则研究指定点处的不同方向的应变之间的关系)。
仔细回想一下高中的一个概念——矢量,张量这个概念就是矢量的推广,是不是好理解一些了。
矢量——是一阶张量,为啥叫一阶张量呢?那是因为在数学中,张量是一种几何实体,或者广义上的数量。张量简单地说就是多维数组的推广:零阶的张量叫标量(高中物理那个标量),一阶的张量叫数组;二阶的张量叫数组,三阶的张量是立方体,四阶的张量是立方体数组,五阶的张量是立方体矩阵……
现在应该大概明白张量了吧( ̄︶ ̄)
那我们为什么要提出张量这个概念呢?在现实生活中有什么用吗?
(当然有用啊,不然为啥要讲它(‾◡◝)
来看看现实需求吧:
如果输入的图片是灰度图,我们就可以用二阶张量即矩阵来表示这张灰度图,二阶张量某个元素的横坐标与纵坐标则表示这个元素所代表的像素在原灰度图这个位置,而这个元素的大小则反映像素值的大小,表示这点的明暗情况。
而对于彩色图片,不管图片格式是RGB还是HSV,彩色图片都是三通道的,那么我们就得到了一个立体的结构,这就是三阶张量,每一页代表一个通道。
那么四阶张量就代表彩色图片的合集,五阶张量代表一批视频。
好啦,张量就讲这么多,接下来实操一下吧!( •̀ ω •́ )y
1.创建一个空的二阶张量
x = torch.empty(5, 3)
print(x)
结果:
2.随机初始化二阶张量
x = torch.rand(5,3)
print(x)
结果:
3.创建一个5x3的0张量,类型为long
x=torch.zeros(5,3,dtype=torch.long)
print(x)
结果:
4.直接从数组创建张量
x = torch.tensor([5.5, 3])
print(x)
结果:
5.创建一个5x3的单位张量,类型为double
x = torch.ones(5, 3, dtype=torch.double)
print(x)
结果:
6.从已有的张量创建相同维度的新张量,并且重新定义类型为float(以5中张量为例)
x = torch.randn_like(x, dtype=torch.float)
print(x)
结果:
7.打印一个张量的维度或规格(依旧使用5中的张量,以下代码均使用5)
print(x.size())
结果:
8.将两个张量相加
方法一:
y = torch.rand(5, 3)#随机初始化二阶张量
print(x + y)#两个张量直接相加
方法二:
print(torch.add(x, y))
方法三:
result = torch.empty(5, 3)#初始化一个二阶空值张量
torch.add(x, y, out=result)#指定result作为相加后的张量
print(result)
方法四:
y.add_(x)#y的变量增加x
print(y)
结果:
9.取张量的第一列
print(x[:, 1])
结果:
10.将一个4x4的张量resize成一个一维张量
x = torch.randn(4, 4)
y = x.view(16)
print(x.size(),y.size())
结果:
11.将一个4x4的张量,resize成一个2x8的张量
方法一:
x = torch.randn(4, 4)
y = x.view(2, 8)
print(x.size(),y.size())
结果:
方法二:此方法容易混淆
x = torch.randn(4, 4)
z = x.view(-1, 8) # -1从其它维度推断
print(x.size(),z.size())
结果:
view()参数-1表示该维度的数值根据其它维度自适应调整。例如:一个长度为16的向量x,x.view(-1,4)等价于x.view(4,4),x.view(-1,2)等价于x.view(8,2)。我们不看行数,由列数决定行数,可以有效避免写错。
12.从张量中取出数字
x=torch.randn(1)
print(x)
print(x.item())
结果:
13.将张量转换成numpy数组
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
结果:
14.给13中张量+1
a = torch.ones(5)
b = a.numpy()
a.add_(1)
print(a)
print(b)
结果:
15.从numpy数组创建张量
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a)
print(b)
结果:
16.给15中numpy数组+1
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
结果:
好啦,本节内容就这么多吧,下节继续( •̀ ω •́ )✧