-
torch.randperm()
torch.randperm(n)
是 PyTorch 中用于生成 0 到 n-1 之间随机排列的函数。具体来说,它会返回一个长度为 n 的张量,其中包含 0 到 n-1 的随机排列。
示例用法如下
import torch
# 生成一个长度为 5 的随机排列
perm = torch.randperm(5)
print(perm)
# tensor([2, 4, 1, 0, 3])
-
torch.randint()
torch.randint(low, high, size)
是 PyTorch 中用于生成指定范围内随机整数张量的函数。具体来说,它会返回一个形状由 size
定义的张量,其中的每个元素是从区间 [low, high) 内随机抽取的整数。
参数说明:
low
: 指定整数范围的下界(包含在范围内)。high
: 指定整数范围的上界(不包含在范围内)。size
: 定义生成张量的形状。
示例用法如下:
import torch
# 生成一个形状为 (2, 3)、取值范围在 [0, 10) 的随机整数张量
rand_int = torch.randint(0, 10, (2, 3))
print(rand_int)
tensor([[9, 5, 7],
[2, 1, 3]])
-
.scatter()
.scatter
是 PyTorch 中的一个张量操作,用于按照指定的索引将值散布到新的张量中。这个方法在很多情况下都非常有用,尤其是在涉及到稀疏张量或者需要按照索引更新部分数值的情况下。
具体来说,.scatter
方法接受三个参数:
- dim:表示沿着哪个维度进行散布操作。
- index:表示散布的位置索引。
- src:表示要散布的值。
举个简单的例子,假设我们有一个张量 tensor,想要根据索引 index 将一些值 src 散布到 tensor 中,可以使用如下形式的 .scatter
操作:
import torch
# 创建一个编码独热向量
encoding_one_hot = torch.zeros(4, 5)
# 创建索引张量
encoding_inds = torch.tensor([1, 3, 0, 2])
# 对编码独热向量进行散列操作
encoding_one_hot.scatter_(1, encoding_inds.unsqueeze(1), 1)
print(encoding_one_hot)
tensor([[0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0.],
[1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
torch.matmul
torch.matmul
是 PyTorch 中用来执行矩阵相乘的函数。在深度学习中,矩阵相乘是非常常见的操作,特别是在神经网络的前向传播和反向传播过程中经常会涉及到矩阵相乘操作。
torch.matmul
函数可以用于计算两个张量的矩阵乘法,它有多种用法:
- 对于两个二维张量(矩阵)的矩阵相乘:如果输入的两个张量都是二维的,那么
torch.matmul
将会执行标准的矩阵乘法。 - 对于张量和矩阵的相乘:如果其中一个张量是一维的,那么它将会被视作行或列向量,并且会被自动扩展为二维张量进行矩阵相乘。
import torch
# 创建两个矩阵
A = torch.rand(3, 4)
B = torch.rand(4, 5)
# 执行矩阵相乘
C = torch.matmul(A, B)
# 创建矩阵和向量
A = torch.rand(3, 4)
v = torch.rand(4)
# 执行矩阵和向量的相乘
w = torch.matmul(A, v)
A = torch.rand(10, 3, 4)
B = torch.rand(10, 4, 5)
# 执行批量化的矩阵相乘
C = torch.matmul(A, B)
C.shape
torch.Size([10, 3, 5])
-
detach()
在 PyTorch 中,detach()
是一个用于从计算图中分离张量的方法。当调用 detach()
方法时,会创建一个新的张量,其值与原始张量相同,但是这个新张量不再具有梯度信息,并且不再与计算图有关联。
这个方法在深度学习中非常有用,特别是在需要从神经网络中提取中间结果或者创建不需要梯度传播的张量时。例如,在训练过程中,有时需要获取某一层的输出作为输入传递给另一个模块,但又不希望这个中间结果对整个模型的梯度进行反向传播,这时就可以使用 detach()
方法。
下面是一个简单的例子,演示了如何使用 detach()
方法:
import torch
import torch.nn as nn
# 创建一个简单的神经网络模型
model = nn.Linear(10, 5)
# 定义输入数据
input_data = torch.randn(1, 10, requires_grad=True)
# 将输入数据传递给模型
output = model(input_data)
# 对输出使用 detach() 方法,得到不需要梯度传播的新张量
detached_output = output.detach()
在这个例子中,output.detach()
将会返回一个新的张量 detached_output
,它的值与 output
相同,但不再与计算图相关,并且不会跟踪梯度。这样就可以安全地将 detached_output
用于后续操作,而不用担心会影响梯度计算。
总之,detach()
方法是一个非常有用的工具,可以帮助在深度学习中更灵活地管理张量的梯度信息。
-
torch.floor()
向下取整
import torch
# 创建一个包含浮点数的张量
x = torch.tensor([1.2, 2.7, 3.5, 4.9])
# 使用 torch.floor 向下取整
result = torch.floor(x)
print(result)
tensor([1., 2., 3., 4.])
-
torch.ceil()
向上取整数
-
torch.einsum
torch.einsum
是 PyTorch 中的一个函数,用于执行爱因斯坦求和约定(Einstein summation convention)。爱因斯坦求和约定是一种表示张量运算的紧凑符号表示法,它通过指定输入张量的索引标签和输出张量的索引标签来表示张量之间的乘法和求和。例如,'ij,jk->ik'
表示对两个矩阵进行乘法运算并得到一个新的矩阵。
A = torch.randint(0,5,(4,5,1,2)
B = torch.randint(0,5,(5,7))
C = torch.einsum('ijkl,jm->imkl',A,B)
C.size()
torch.Size([4, 7, 1, 2])
einsum也有自己独立的库函数。
-
torch.tril()
下三角
-
torch.triu()上三角