在深度学习领域,torch.nn.functional被广泛应用于各种深度学习网络模型的构建。它是torch.nn的一部分,提供了一系列的高效的、可重用的、可微分的神经网络操作函数,如卷积、池化、归一化、非线性激活函数等。而且,torch.nn.functional的设计初衷是直接用来编写神经网络模型,所以这些函数不会产生额外的权重变量。
一、torch.nn.functional.pad
torch.nn.functional.pad函数实现对张量的填充操作。填充操作可以在各种计算机视觉任务中起到一定的作用,如边缘检测、物体检测等。在深度学习中,常常需要将输入数据填充到特定的大小,使其可以与卷积核进行卷积计算。
padding函数的参数argument如下:
- input: 需要填充的张量
- padding: 填充的数量。可以为一个数,表示在每个维度上填充的长度相同;也可以为一个列表,表示每个维度上需要填充的长度不相同。
- mode: 填充方式,默认值为CONSTANT,即常量填充,可以选择REFLECT(反射填充)和EDGE(边缘填充)。
import torch.nn.functional as F
input = torch.randn(2, 3)
padding = (2, 1)
padded_input = F.pad(input, padding, mode='constant', value=0)
print(padded_input.shape) # torch.Size([2, 7])
二、torch.nn.functional.relu
torch.nn.functional.relu函数实现的是ReLU激活函数。它接收一个张量作为输入,将小于0的项设置为0,并返回结果。这个函数非常简单,但是因为在许多网络中经常被用到,所以它是非常有用的。ReLU激活函数对于训练神经网络极其重要。
relu函数的参数argument如下:
- input: 输入张量
- inplace: 是否进行原地计算,即是否覆盖input。默认值为False。
input = torch.randn(2, 3)
output = F.relu(input)
print(output)
三、torch.nn.functional.cross
torch.nn.functional.cross函数实现的是两个张量的叉积操作。两个张量必须具有相同的形状。
cross函数的参数argument如下:
- input1: 第一个张量
- input2: 第二个张量,与第一个张量的维数必须相同
- dim: 计算叉积的维度。默认为最后一维
input1 = torch.randn(3, 4)
input2 = torch.randn(3, 4)
output = F.cross(input1, input2)
print(output)
四、torch.nn.functional.unfold
torch.nn.functional.unfold函数实现的是张量的展开操作。它接受一个张量作为输入,并展开它的最后两个维度到一个二维张量。这种展开操作对于卷积神经网络是很常用的。展开后的张量可以被用于高维卷积操作。
unfold函数的参数argument如下:
- input: 需要展开的张量
- kernel_size: 展开后每个小区域的大小
- stride: 展开的步幅大小
- padding: 填充大小
input = torch.randn(4, 3, 28, 28)
unfold_input = F.unfold(input, kernel_size=3, stride=1, padding=1)
print(unfold_input.shape) # torch.Size([4, 27, 784])
五、torch.nn.functional.one_hot
torch.nn.functional.one_hot函数实现的是对标签或类别的one_hot编码。在深度学习中,常常使用one_hot来表示离散的标签或类别。
one_hot函数的参数argument如下:
- input: 需要one_hot编码的张量
- num_classes: 类别的数量
input = torch.tensor([2, 5, 3])
one_hot = F.one_hot(input, num_classes=10)
print(one_hot.shape) # torch.Size([3, 10])
六、torch.nn.functional.L1_loss
torch.nn.functional.L1_loss函数实现的是L1范数损失函数。L1范数是绝对值的和,在深度学习中常用于较小规模的任务中。
L1_loss函数的参数argument如下:
- input: 模型的输出
- target: 标签值
- size_average: 是否对每个batch的损失进行平均。默认为True。
input = torch.randn(3, 5)
target = torch.randn(3, 5)
loss = F.l1_loss(input, target)
print(loss) # tensor(1.3011)
七、torch.nn.functional.softplus
torch.nn.functional.softplus函数实现的是Softplus激活函数。这个函数是ReLU激活函数的平滑版本。Softplus函数的输出是正的,并且是一个连续的可导函数。
softplus函数的参数argument如下:
- input: 输入张量
- beta: 控制平滑度的参数。默认为1
input = torch.randn(2, 3)
output = F.softplus(input)
print(output)