PyTorch学习笔记——常用函数总结(一)のtorch.squeeze()和Tensor常见创建方法

torch.squeeze() 和torch.unsqueeze()——对数据的维度进行压缩或者解压

(1) torch.squeeze(input, dim=None, out=None) 函数详解:

核心功能:

这个函数主要对数据的维度进行压缩,去掉维数为1的的维度。比如:是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。b=torch.squeeze(a,N) 就是将a中所有为1的维度删掉,不为1的维度没有影响。

参数说明:

  • input (Tensor): 输入张量(the input tensor.)
  • dim (int, optional): 将输入Tensor的第dim个维度位置进行压缩,如果输入Tensor此处维度为1则压缩成功,否则失败。如果该参数给定,则输入张量将仅在该维度上压缩(if given, the input will be squeezed only in this dimension.),如果该参数不给定,则默认将输入Tensor所有维度为1的进行压缩。参数dim的取值范围为:[-input.dim(), input.dim()-1]
x = torch.zeros(2, 1, 2, 1, 2)
x
>>>
tensor([[[[[0., 0.]],

          [[0., 0.]]]],



        [[[[0., 0.]],

          [[0., 0.]]]]])
print(x.size())
>>> torch.Size([2, 1, 2, 1, 2])
y = torch.squeeze(x)
y
>>>
tensor([[[0., 0.],
         [0., 0.]],

        [[0., 0.],
         [0., 0.]]])
print(y.size())
>>> torch.Size([2, 2, 2])

# 如果第一个维度为一,则将其进行压缩;否则,不能压缩
y = torch.squeeze(x, 0)  # 或者 y = torch.squeeze(x, dim=0)
print(y.size())
>>> torch.Size([2, 1, 2, 1, 2])

# 如果第二个维度为一,则将其进行压缩
y = torch.squeeze(x, 1)  # 或者 y = torch.squeeze(x, dim=1)
print(y.size())
>>> torch.Size([2, 2, 1, 2])

# 如果第三个维度为一,则将其进行压缩;否则,不能压缩
y = torch.squeeze(x, 2)  # 或者 y = torch.squeeze(x, dim=2)
print(y.size())
>>> torch.Size([2, 1, 2, 1, 2])

# 如果第四个维度为一,则将其进行压缩
y = torch.squeeze(x, dim=3)   # 或者 y = torch.squeeze(x, dim=3)
print(y.size())
torch.Size([2, 1, 2, 2])

# 如果第五个维度为一,则将其进行压缩
y = torch.squeeze(x, dim=4)   # 或者 y = torch.squeeze(x, dim=4)
print(y.size())
torch.Size([2, 1, 2, 1, 2])
  • out (Tensor, optional): 输出张量(the output tensor.)

(2) torch.unsqueeze(input, dim)函数详解:

核心功能:

在tensor的某个维度上添加一个维数为1的维度,这个功能用view()函数也可以实现。比如:原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。a.unsqueeze(N) 就是在a中指定位置N加上一个维数为1的维度。还有一种形式就是b=torch.unsqueeze(a,N) a就是在a中指定位置N加上一个维数为1的维度。这一功能尤其在神经网络输入单个样本时很有用,由于pytorch神经网络要求的输入都是mini-batch型的,维度为[batch_size, channels, w, h],而一个样本的维度为[c, w, h],此时用unsqueeze()增加一个维度变为[1, c, w, h]就很方便了。

参数说明:

  • input (Tensor):输入张量(the input tensor.)
  • dim (int):插入维数为一的维度的位置(the index at which to insert the singleton dimension.)参数dim的取值范围为:[-input.dim() - 1, input.dim() + 1)

备注: 以0为分界,正向取值和反向取值的效果相同,其原理类似DataFrame中的正向、反向切片操作。正向取值时,0表示行,1表示列;反向取值时,-1表示列,-2表示行。
\quad
例如:若input。dim()==1,此时,dim的取值范围为[-2,2),正向取值时——dim=0(表示:行维度为1,即:新生成Tensor的shape为 torch.Size([1, 100]) );dim=1(表示:列维度为1,即:新生成Tensor的shape为 torch.Size([100, 1]) ))。反向取值时——dim=-2(表示:行维度为1,即:新生成Tensor的shape为 torch.Size([1, 100]) );dim=-1(表示:列维度为1,即:新生成Tensor的shape为 torch.Size([100, 1]) )

a = torch.linspace(-1, 1, 100)  # 生成-1到1的100个数构成的等差数列
print(a.shape)
>>> torch.Size([100])

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # dim=1,表示列方向维度为1
print(x.shape)
>>> torch.Size([100, 1])

x = torch.tensor([1, 2, 3, 4])
torch.unsqueeze(x, 0)
>>> tensor([[ 1,  2,  3,  4]])
torch.unsqueeze(x, 1)
>>> tensor([[ 1],
            [ 2],
            [ 3],
            [ 4]])

x = torch.zeros(2, 2, 2)
print(x.shape)
>>> torch.Size([2, 2, 2])
# 在input的第三个维度上扩充维度1
y = torch.unsqueeze(x, dim=2)
print(y.shape)
>>> torch.Size([2, 2, 1, 2])

注意事项:squeeze(input, dim=None, out=None)unsqueeze(input, dim)中的参数dim含义相同,均代表在input的第dim个位置维度处进行维度1的压缩或扩充。

torch.linspace() ——线性间距向量

torch.linspace(start, end, steps=100, out=None) 函数详解:

核心功能:

返回一个1维张量,包含在区间start和end上均匀间隔的step个点。输出张量的长度由steps决定。

参数说明:

  • start (float):区间的起始点
  • end (float):区间的终点
  • steps (int):在start和end间生成的样本数
  • out (Tensor, optional) :结果张量
#生成0到10的4个数构成的等差数列
a = torch.linspace(0,10,steps=4)
print(a)
>>>
tensor([ 0.0000,  3.3333,  6.6667, 10.0000])
#生成0到10的5个数构成的等差数列
b = torch.linspace(0,10,steps=5)
print(b)
>>>
tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])

torch.randn() 和torch.rand()——标准正态分布和均匀分布

torch.randn(*sizes, out=None) 函数详解:

核心功能:

返回一个张量Tensor,包含了从 标准正态分布(均值为0,方差为1 ——即:高斯白噪声) 中抽取的一组随机数。张量的形状由参数sizes定义。

参数说明:

  • sizes (int…) - 整数序列,定义了输出张量的形状
  • out (Tensor, optinal) - 结果张量

torch.rand(*sizes, out=None) 函数详解:

核心功能: 用于生成[0,1)之间的 均匀分布

torch.zeros()——常见指定形状的值为0的张量

zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) -> Tensor 函数详解:

核心功能:

返回一个形状为为size,类型为torch.dtype,里面的每一个值都是0的tensor

典型范例:

torch.zeros(2, 3) # 生成维度为2*3的由0元素组成的张量
>>> 
tensor([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]])

torch.zeros(5)  # 生成维度为1的5个0元素组成的张量
>>>
tensor([ 0.,  0.,  0.,  0.,  0.])

torch.zeros(2, 2, 2)  # 生成维度为2*2*2的由0元素组成的张量
>>>
tensor([[[0., 0.],
         [0., 0.]],

        [[0., 0.],
         [0., 0.]]])

torch.empty()——创建填充有未初始化数据的张量

torch.empty(*sizes, out=None, dtype=None, layout=torch.strided,
device=None, requires_grad=False, pin_memory=False) → Tensor

Returns a tensor filled with uninitialized data. The shape of the tensor is defined by the variable argument sizes.
返回填充有未初始化数据的张量。 张量的形状由可变的参数大小定义。

参数说明:

  • size:空tensor的大小,没有初始化
  • out:默认为None
  • dtype:数据类型
  • layout:内存布局对象

torch.manual_seed(seed)——将随机数生成器的种子设置为固定值

只需要调用torch.manual_seed(seed)它将随机数生成器的种子设置为固定值,这样,当调用时torch.rand(2),结果将可重现。

torch.manual_seed(1)  # reproducible
print(torch.rand(2))  # 运行多次,得到的随机值是固定的,但如果没有torch.manual_seed(1) ,则结果每次都不同
>>>
tensor([0.7576, 0.2793])

参考链接:python—pytorch-torch.manual_seed(1)的作用

torch.mm(a, b)——矩阵a和b矩阵相乘

torch.mm(a, b)是矩阵a和b矩阵相乘

norm(x)——计算向量x的模长

norm(X)如果x是一个向量,那么norm(x)就等于x的模长

torch.ones_like()——创建填充了标量值1的张量

torch.ones_like(input, dtype=None, layout=None, device=None, requires_grad=False) → Tensor,返回一个填充了标量值1的张量,其大小与之相同 input。torch.ones_like(input)等价于 torch.ones(input.size(), dtype=input.dtype, layout=input.layout, device=input.device)

猜你喜欢

转载自blog.csdn.net/weixin_42782150/article/details/106708512