pytorch常用的几个函数详解

view

view() 是 PyTorch 中的一个常用函数,用于改变张量(tensor)的形状。在深度学习中,我们经常需要调整数据的形状以适应不同的网络结构或计算需求,view() 函数就是用来完成这个任务的。

基本用法

view() 函数接受一个形状参数,返回一个具有新形状的张量。例如:

import torchx = torch.randn(4, 4)  # 创建一个 4x4 的随机张量
print(x.shape)  # 输出原始形状:torch.Size([4, 4])y = x.view(2, 8)  # 改变形状为 2x8
print(y.shape)  # 输出新形状:torch.Size([2, 8])

这里,x 是一个形状为 (4, 4) 的张量,通过 view() 函数,我们将其形状改变为 (2, 8)

自动计算维度

有时候,我们可能只知道部分维度的大小,其他维度的大小希望由 PyTorch 自动计算。这可以通过在 view() 函数中使用 -1 来实现。例如:

import torchx = torch.randn(4, 4)  # 创建一个 4x4 的随机张量
print(x.shape)  # 输出原始形状:torch.Size([4, 4])y = x.view(-1)  # 将张量展平为一维
print(y.shape)  # 输出新形状:torch.Size([16])

这里,-1 表示让 PyTorch 自动计算该维度的大小。因此,y 的形状会被自动计算为 (16,)

保持原始数据不变

view() 函数返回的是一个新的张量,原始张量的数据并不会被改变。新的张量和原始张量共享相同的数据,但形状不同。这意味着对新张量的修改也会影响原始张量。例如:

import torchx = torch.randn(4, 4)  # 创建一个 4x4 的随机张量
y = x.view(2, 8)  # 改变形状为 2x8y += 1.0  # 对新张量进行修改
print(x)  # 输出原始张量,可以看到其值也被改变了

在这个例子中,我们对 y(新形状的张量)进行了加法操作,结果 x(原始形状的张量)的值也被相应地改变了。这是因为 xy 共享相同的数据。

view() 函数是 PyTorch 中非常实用的一个函数,它允许我们灵活地改变张量的形状以适应不同的计算需求。在使用 view() 时,需要注意新张量和原始张量共享数据的特点,以避免不必要的错误。

t函数

在PyTorch中,t() 函数用于对张量进行转置操作。下面我将对 t() 函数进行更详细的解释。

功能

t() 函数用于计算一个张量的转置。对于2D张量(即矩阵),它计算矩阵的转置,将行和列进行交换。对于更高维度的张量,t() 函数会对其最后两个维度进行转置。

语法

torch.t(input)
  • input:要转置的输入张量。

返回值

  • 返回一个新的张量,其中包含输入张量的转置。原始张量的数据不会被修改。

示例

下面是一个使用 t() 函数的示例:

import torch# 创建一个2D张量(矩阵)
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print("原始张量 x:")
print(x)# 计算张量的转置
y = x.t()
print("转置后的张量 y:")
print(y)

输出:

原始张量 x:
tensor([[1, 2, 3],[4, 5, 6]])
转置后的张量 y:
tensor([[1, 4],[2, 5],[3, 6]])

在这个示例中,我们创建了一个2D张量 x,并使用 t() 函数计算其转置。结果是一个新的2D张量 y,其中行和列已经交换。注意,原始张量 x 的数据保持不变,而 y 是一个新的张量对象。

注意事项

  • 对于2D张量(矩阵),t() 函数与 transpose(0, 1) 是等价的。但对于更高维度的张量,它们的行为是不同的。t() 只对最后两个维度进行转置,而 transpose() 可以指定要转置的两个维度。
  • t() 函数不会修改原始张量的数据,而是返回一个新的转置后的张量。

permute() 函数

permute() 是 PyTorch 中的一个非常有用的函数,用于重新排列张量的维度。在多维数据处理中,我们经常需要调整数据的维度顺序以适应不同的操作或模型需求,permute() 函数正是为此目的而设计的。

基本概念

首先,了解张量的维度是非常重要的。一个张量可以有多个维度,例如:一个1D张量(向量)有一个维度,一个2D张量(矩阵)有两个维度,以此类推。

当我们谈论重新排列张量的维度时,我们实际上是指改变这些维度的顺序。

permute() 函数的使用

permute() 函数接受一个参数,该参数是一个表示新维度顺序的元组。元组中的每个元素都是原始张量维度的索引。

示例 1:2D 张量(矩阵)的转置

假设我们有一个2D张量(即矩阵),并且我们想要转置它(即交换行和列)。这可以通过使用 permute() 函数轻松实现。

import torch# 创建一个2D张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print("原始张量:")
print(x)# 使用permute进行转置
y = x.permute(1, 0)
print("转置后的张量:")
print(y)

输出:

原始张量:
tensor([[1, 2, 3],[4, 5, 6]])
转置后的张量:
tensor([[1, 4],[2, 5],[3, 6]])

在这个例子中,原始张量的维度是 (2, 3)。通过 permute(1, 0),我们交换了维度的位置,得到了一个新的形状为 (3, 2) 的张量。

示例 2:更高维度张量的排列

permute() 同样可以用于更高维度的张量。例如,假设我们有一个形状为 (batch_size, channels, height, width) 的4D张量,并且我们想要将其转换为 (channels, batch_size, height, width)

import torch# 创建一个4D张量
x = torch.rand((2, 3, 4, 5))  # Shape: [batch_size, channels, height, width]
print("原始张量的形状:", x.shape)# 重新排列维度
y = x.permute(1, 0, 2, 3)  # New shape: [channels, batch_size, height, width]
print("重新排列后张量的形状:", y.shape)

输出:

原始张量的形状: torch.Size([2, 3, 4, 5])
重新排列后张量的形状: torch.Size([3, 2, 4, 5])

permute() 函数提供了一种灵活的方式来重新排列张量的维度。通过指定一个新的维度顺序,我们可以轻松地适应不同的数据处理和模型训练需求。

unsqueeze() 函数

unsqueeze 是 PyTorch 中的一个非常有用的函数,用于增加张量的维度。在处理多维数据时,我们经常需要改变数据的形状以适应不同的操作或模型需求,unsqueeze 正是为此目的而设计的。

基本概念

在理解 unsqueeze 之前,首先要知道张量的维度。一个张量可以有多个维度,例如:一个1D张量(向量)有一个维度,一个2D张量(矩阵)有两个维度,以此类推。

当我们谈论增加张量的维度时,我们实际上是在指定位置插入一个新的维度,这个新的维度的大小是1。

unsqueeze() 函数的使用

unsqueeze 函数接受一个参数,该参数表示要插入新维度的位置。位置是从0开始计数的。

语法

torch.unsqueeze(input, dim)
  • input:输入张量。
  • dim:插入新维度的位置。

示例

假设我们有一个1D张量(向量)[1, 2, 3, 4],并且我们想要在第0维(最外层维度)之前增加一个维度,使其变为2D张量。

import torch# 创建一个1D张量
x = torch.tensor([1, 2, 3, 4])
print("原始张量:")
print(x)
print("原始张量的形状:", x.shape)# 使用unsqueeze增加维度
y = torch.unsqueeze(x, 0)
print("\n增加维度后的张量:")
print(y)
print("增加维度后的张量的形状:", y.shape)

输出:

原始张量:
tensor([1, 2, 3, 4])
原始张量的形状: torch.Size([4])增加维度后的张量:
tensor([[1, 2, 3, 4]])
增加维度后的张量的形状: torch.Size([1, 4])

可以看到,通过在第0维之前插入一个新的维度,我们成功地将1D张量转换为2D张量。新维度的大小是1。

squeeze() 函数

unsqueeze 函数提供了一种简单的方式来增加张量的维度。通过指定要插入新维度的位置,我们可以轻松地改变张量的形状,以适应不同的数据处理和模型训练需求。

squeeze 是 PyTorch 中的一个非常有用的函数,用于减少张量的维度。在处理多维数据时,我们经常需要改变数据的形状以适应不同的操作或模型需求,squeeze 正是为此目的而设计的。

基本概念

在理解 squeeze 之前,首先要知道张量的维度。一个张量可以有多个维度,例如:一个1D张量(向量)有一个维度,一个2D张量(矩阵)有两个维度,以此类推。

当我们谈论减少张量的维度时,我们实际上是指删除那些大小为1的维度。

squeeze() 函数的使用

squeeze 函数可以接受一个参数,该参数表示要删除的维度的索引。如果不提供参数,则默认删除所有大小为1的维度。

语法

torch.squeeze(input, dim=None)
  • input:输入张量。
  • dim:要删除的维度的索引。如果不提供,则删除所有大小为1的维度。

示例

  1. 删除特定维度的示例:

假设我们有一个形状为 (10, 1, 10) 的3D张量,并且我们想要删除第1维(索引为1的维度)。

import torch# 创建一个3D张量
x = torch.rand((10, 1, 10))
print("原始张量的形状:", x.shape)# 使用squeeze删除第1维
y = torch.squeeze(x, 1)
print("删除维度后的张量的形状:", y.shape)

输出:

原始张量的形状: torch.Size([10, 1, 10])
删除维度后的张量的形状: torch.Size([10, 10])
  1. 删除所有大小为1的维度的示例:

假设我们有一个形状为 (10, 1, 10, 1) 的4D张量,并且我们想要删除所有大小为1的维度。

import torch# 创建一个4D张量
x = torch.rand((10, 1, 10, 1))
print("原始张量的形状:", x.shape)# 使用squeeze删除所有大小为1的维度
y = torch.squeeze(x)
print("删除维度后的张量的形状:", y.shape)

输出:

原始张量的形状: torch.Size([10, 1, 10, 1])
删除维度后的张量的形状: torch.Size([10, 10])

squeeze 函数提供了一种简单的方式来减少张量的维度。通过指定要删除的维度的索引或删除所有大小为1的维度,我们可以轻松地改变张量的形状,以适应不同的数据处理和模型训练需求。

transpose() 函数

transpose 是 PyTorch 中的一个函数,用于交换张量的两个维度。这个函数与 permute 不同,因为 transpose 只是交换两个特定的维度,而 permute 是重新排列所有维度。

基本概念

在理解 transpose 之前,首先要知道张量的维度。一个张量可以有多个维度,例如:一个1D张量(向量)有一个维度,一个2D张量(矩阵)有两个维度,以此类推。

当我们谈论交换张量的两个维度时,我们实际上是指交换这两个维度的位置。

transpose() 函数的使用

transpose 函数接受两个参数:要交换的第一个维度的索引和要交换的第二个维度的索引。

语法

torch.transpose(input, dim0, dim1)
  • input:输入张量。
  • dim0:要交换的第一个维度的索引。
  • dim1:要交换的第二个维度的索引。

示例

假设我们有一个形状为 (3, 4) 的2D张量,我们想要交换第0维和第1维的位置。

import torch# 创建一个2D张量
x = torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print("原始张量:")
print(x)
print("原始张量的形状:", x.shape)# 使用transpose交换维度
y = torch.transpose(x, 0, 1)
print("\n交换维度后的张量:")
print(y)
print("交换维度后的张量的形状:", y.shape)

输出:

原始张量:
tensor([[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12]])
原始张量的形状: torch.Size([3, 4])交换维度后的张量:
tensor([[ 1,  5,  9],[ 2,  6, 10],[ 3,  7, 11],[ 4,  8, 12]])
交换维度后的张量的形状: torch.Size([4, 3])

可以看到,通过交换第0维和第1维的位置,我们成功地得到了一个新的2D张量。

cat() 函数

torch.cat 是 PyTorch 中用于将多个张量(tensors)连接在一起的函数。下面是对 torch.cat 函数的详细解释:

语法

torch.cat(tensors, dim=0, *, out=None) → Tensor

参数

  • tensors (sequence of Tensors):要连接的张量序列。所有张量必须具有相同的形状,除了在连接的维度上。
  • dim (int, optional):要连接的维度。默认值是 0。
  • out (Tensor, optional):输出张量。

返回值

返回一个包含输入张量数据的新张量,这些张量在指定的维度上被连接在一起。

示例

下面是一些使用 torch.cat 的示例:

示例 1:连接两个向量
import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
z = torch.cat((x, y))
print(z)  # 输出: tensor([1, 2, 3, 4, 5, 6])

在这个示例中,我们有两个形状相同的向量 xy,我们使用 torch.cat 将它们连接在一起,结果是一个包含两个向量所有元素的新向量。

示例 2:连接两个矩阵
import torchx = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6]])
z = torch.cat((x, y), dim=0)
print(z)  # 输出: tensor([[1, 2], [3, 4], [5, 6]])

在这个示例中,我们有两个形状不同的矩阵 xy。我们通过在 dim=0(即行)上连接它们来创建一个新矩阵,该矩阵包含两个输入矩阵的所有行。

示例 3:连接多个张量
import torchx = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
z = torch.tensor([[9, 10], [11, 12]])
w = torch.cat((x, y, z), dim=1)
print(w)  # 输出: tensor([[ 1,  2,  5,  6,  9, 10], [ 3,  4,  7,  8, 11, 12]])

在这个示例中,我们有三个形状相同的矩阵 xyz。我们通过在 dim=1(即列)上连接它们来创建一个新矩阵,该矩阵包含所有输入矩阵的所有列。

stack() 函数

torch.stack 是 PyTorch 中的一个函数,用于将一系列张量按新的维度堆叠起来。

语法

torch.stack(tensors, dim=0, *, out=None) → Tensor

参数

  • tensors (sequence of Tensors) – 需要堆叠的张量序列。
  • dim (int) – 插入新维度的索引。必须在 0 和 len(tensors[0].shape) + 1 (包含) 之间。
  • out (Tensor, optional) – 输出张量。

返回值

返回一个张量,该张量是通过在指定维度上堆叠输入张量而构建的。

示例

下面是一些使用 torch.stack 的示例:

示例 1:基本用法
import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
z = torch.stack((x, y))
print(z)  # 输出: tensor([[1, 2, 3], [4, 5, 6]])

在这个例子中,我们有两个形状相同的1D张量 xy。使用 torch.stack 将它们堆叠在一起,结果是一个2D张量,其中 xy 成为新张量的行。

示例 2:指定堆叠维度
import torchx = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
z = torch.stack((x, y), dim=2)
print(z)  # 输出: tensor([[[1, 5], [2, 6]], [[3, 7], [4, 8]]])

在这个例子中,我们有两个形状相同的2D张量 xy。通过在 dim=2(即第三个维度,因为索引是从0开始的)上堆叠它们,我们创建了一个新的3D张量。

示例 3:堆叠不同形状的张量

如果你尝试堆叠形状不匹配的张量,将会得到一个错误。例如:

import torchx = torch.tensor([1, 2, 3])
y = torch.tensor([[4, 5, 6], [7, 8, 9]])
# 下面的代码将会抛出一个错误,因为 x 和 y 的形状不匹配。
# z = torch.stack((x, y))  # 这行代码会引发错误。

在这个例子中,由于 xy 的形状不匹配,因此无法将它们堆叠在一起。你需要确保要堆叠的所有张量都具有相同的形状。

chunk函数

torch.chunk 是 PyTorch 中的一个非常有用的函数,用于将张量(Tensor)沿特定维度拆分为多个较小的张量。下面是这个函数的详细解释。

语法

torch.chunk(input, chunks, dim=0)

参数

  • input (Tensor): 输入的张量,即你想要拆分的张量。
  • chunks (int): 你想要将输入张量拆分成的块数。
  • dim (int, optional): 沿着哪个维度进行拆分。默认值是 0,即第一个维度。

返回值

该函数返回一个元组,其中包含拆分后的张量块。

示例和解释

  1. 基本用法:

假设我们有一个形状为 (6,) 的一维张量,并且我们想要将其拆分为3个部分。

import torchx = torch.tensor([1, 2, 3, 4, 5, 6])
chunks = torch.chunk(x, 3)
for i, chunk in enumerate(chunks):print(f"Chunk {i+1}: {chunk}")

输出:

Chunk 1: tensor([1, 2])
Chunk 2: tensor([3, 4])
Chunk 3: tensor([5, 6])

注意,由于我们的输入张量有6个元素,并且我们想要将其拆分为3个块,所以每个块有2个元素。
2. 指定拆分维度:

假设我们有一个形状为 (2, 3) 的二维张量,并且我们想要沿着第二个维度(列)进行拆分。

import torchx = torch.tensor([[1, 2, 3], [4, 5, 6]])
chunks = torch.chunk(x, 2, dim=1)  # 沿着列(第二个维度)拆分
for i, chunk in enumerate(chunks):print(f"Chunk {i+1}:\n{chunk}\n")

输出:

Chunk 1:
tensor([[1, 2],[4, 5]])Chunk 2:
tensor([[3],[6]])

这里,由于我们的输入张量的形状是 (2, 3),并且我们沿着第二个维度拆分成2个块,所以第一个块包含前两列,第二个块包含最后一列。
3. 错误示例:
如果你尝试将一个形状为 (6,) 的张量拆分为4个块,你会得到一个错误,因为6不能被4整除。确保你的张量大小可以被 chunks 参数整除是很重要的。
4. 注意: 如果你的 dim 参数超出了张量的维度范围,你也会得到一个错误。例如,对于一个形状为 (3, 3) 的二维张量,有效的 dim 值是0和1。任何其他的值都会导致错误。

flip函数

torch.flip 是 PyTorch 中的一个函数,用于翻转张量(Tensor)中的数据。

语法

torch.flip(input, dims)

参数

  • input (Tensor): 输入张量。
  • dims (int or tuple of ints): 要翻转的维度。可以是单个维度或维度的元组。

返回值

返回一个与输入张量形状相同的新张量,但在指定的维度上进行了翻转。

示例

下面是一些使用 torch.flip 的示例:

示例 1:翻转一维张量
import torchx = torch.tensor([1, 2, 3, 4])
y = torch.flip(x, [0])
print(y)  # 输出: tensor([4, 3, 2, 1])

在这个例子中,我们有一个一维张量 x,我们使用 torch.flip 并指定 dims=[0] 来翻转整个张量。结果是一个新的张量 y,其中元素的顺序被翻转。

示例 2:翻转二维张量的行和列
import torchx = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = torch.flip(x, [0, 1])
print(y)  # 输出: tensor([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

在这个例子中,我们有一个二维张量 x,我们使用 torch.flip 并指定 dims=[0, 1] 来分别翻转行和列。结果是一个新的张量 y,其中行和列的顺序都被翻转。

示例 3:只翻转二维张量的列
import torchx = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = torch.flip(x, [1])
print(y)  # 输出: tensor([[3, 2, 1], [6, 5, 4], [9, 8, 7]])

在这个例子中,我们有一个二维张量 x,我们使用 torch.flip 并指定 dims=[1] 来只翻转列。结果是一个新的张量 y,其中列的顺序被翻转,但行的顺序保持不变。

ReLU函数

ReLU(Rectified Linear Unit)函数是深度学习中常用的一种激活函数,它在神经网络中引入了非线性特性。在PyTorch中,可以使用torch.relu()函数或nn.ReLU()层来应用ReLU激活。

ReLU函数的数学表达式为:

f(x) = max(0, x)

其中,x是输入张量(tensor)。ReLU函数将负数值映射为0,将正数值映射为它们本身。这种操作称为“整流”(rectification),因此得名ReLU。

ReLU函数具有以下特点:

  1. 计算简单:ReLU函数的计算非常简单,只需要比较输入值和0的大小即可。这使得它在前向传播和反向传播过程中都具有高效性。
  2. 稀疏性:由于ReLU函数将负数值映射为0,因此在神经网络中引入了一定的稀疏性。这种稀疏性有助于提取输入数据的特征,并提高模型的泛化能力。
  3. 缓解梯度消失问题:在深度神经网络中,当使用Sigmoid或Tanh等饱和激活函数时,梯度在反向传播过程中可能会逐渐消失。而ReLU函数的梯度要么是0(对于负输入),要么是1(对于正输入),因此在一定程度上缓解了梯度消失问题。

在PyTorch中,你可以使用以下两种方式应用ReLU激活函数:

  1. 使用torch.relu()函数:
import torchx = torch.tensor([-1.0, 0.0, 1.0, 2.0])
y = torch.relu(x)
print(y)  # 输出: tensor([0., 0., 1., 2.])
  1. 使用nn.ReLU()层:
import torch.nn as nnrelu_layer = nn.ReLU()
x = torch.tensor([-1.0, 0.0, 1.0, 2.0])
y = relu_layer(x)
print(y)  # 输出: tensor([0., 0., 1., 2.])

这两种方式都可以实现ReLU激活函数的功能。使用torch.relu()函数是一种简单的、直接的方法;而使用nn.ReLU()层则更为灵活,可以将ReLU层嵌入到神经网络模型中。

Dropout函数

Dropout是一种正则化技术,用于防止神经网络过拟合。它在训练过程中随机地将神经网络的某些节点设置为0,这意味着在前向传播过程中,这些节点不会有任何贡献。由于每个迭代过程中都随机“关闭”了一部分节点,实际上神经网络的结构在每次迭代时都略有不同。这样做可以使得模型不太可能过度依赖于某些特定的节点,从而提高模型的泛化能力。

在PyTorch中,torch.nn.Dropout是一个实现Dropout的模块。其语法如下:

torch.nn.Dropout(p=0.5, inplace=False)

参数:

  • p:在训练过程中,每一层后面,将随机失活的概率。默认值为0.5。
  • inplace:如果设置为True,将在输入上进行操作并返回,而不是返回新的Tensor。默认值为False。

下面是一个简单的例子,说明如何在神经网络中使用Dropout:

import torch
import torch.nn as nnclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 5x5输入图像,16个通道self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)self.dropout = nn.Dropout(p=0.2)  # Dropout layer with dropout probability of 0.2def forward(self, x):x = self.fc1(x)x = self.dropout(x)  # Apply dropout after the first fully connected layerx = self.fc2(x)x = self.dropout(x)  # Apply dropout after the second fully connected layerx = self.fc3(x)return x

在这个例子中,我们在两个全连接层之后使用了Dropout。在训练过程中,每次前向传播时,都有20%的节点会被随机地设置为0。这有助于防止模型过拟合训练数据。

需要注意的是,Dropout只在训练过程中使用。在评估或测试模型时,通常会关闭Dropout(即将p设置为0),以确保输出的稳定性。

sigmoid函数

sigmoid函数在深度学习和神经网络中扮演着非常重要的角色。它被广泛用作激活函数,帮助神经网络学习和模拟复杂的模式。

函数形式
sigmoid(x)=11+e−x\text{sigmoid}(x) = \frac{1}{1 + e^{-x}}sigmoid(x)=1+e−x1​

其中 xxx 是输入。

主要特性

  1. 输出范围:sigmoid函数的输出范围总是在(0, 1)之间,这使得它在某些场景下(例如:二分类问题的输出层)特别有用。
  2. 非线性:sigmoid函数是非线性的,这意味着它可以帮助神经网络捕捉和学习输入数据中的非线性关系。
  3. 可微性:sigmoid函数在其整个定义域上都是可微的,这意味着我们可以使用基于梯度的方法(如梯度下降)来优化神经网络的参数。
  4. 饱和性:当 xxx 很大或很小时,sigmoid函数的梯度接近于0。这可能导致所谓的“梯度消失”问题,使得神经网络在训练过程中的参数更新变得非常缓慢。

在PyTorch中的使用
在PyTorch中,你可以很容易地使用torch.sigmoid()函数来计算sigmoid激活。例如:

import torch# 创建一个张量
x = torch.tensor([-1.0, 0.0, 1.0])# 使用sigmoid函数
y = torch.sigmoid(x)
print(y)  # 输出: tensor([0.2689, 0.5000, 0.7311])

应用
虽然sigmoid函数在过去被广泛用作神经网络的隐藏层激活函数,但现在更常见的选择是ReLU(Rectified Linear Unit)及其变体,因为它们可以缓解梯度消失问题并加速训练。然而,在二分类问题的输出层中,sigmoid激活仍然是一个流行的选择。

interpolate函数

interpolate()函数是PyTorch中用于对多维数据进行插值的一个非常有用的函数。它可以对输入张量进行上采样或下采样,以改变其尺寸。这个函数特别在处理图像、时间序列数据或其他需要调整尺寸的多维数据时非常有用。

基本语法

torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)

参数说明

  • input:输入张量,可以是任意维度的。
  • size:输出张量的大小,可以是一个整数或整数的元组。如果指定了size,则忽略scale_factor
  • scale_factor:相对于输入大小的放大或缩小因子。可以是一个浮点数或浮点数的元组。如果指定了size,则忽略此参数。
  • mode:插值模式,可以是'nearest''linear''bilinear''bicubic''trilinear''area'等。不同的模式适用于不同维度和类型的数据。
  • align_corners:如果为True,则输入和输出张量的角落像素将对齐,从而保留这些像素的值。这只在mode'linear''bilinear''trilinear'时有效。默认为False。
  • recompute_scale_factor:如果为True,则在执行插值之前会重新计算scale_factor,以确保输出大小与指定的size匹配。默认为False。

返回值

返回一个与输入张量形状相同,但大小调整为指定sizescale_factor的新张量。

示例

下面是一个使用PyTorch interpolate()函数进行图像上采样的简单示例:

import torch
import torch.nn.functional as F# 假设我们有一个1x1的输入图像
input_image = torch.tensor([[[[1.0]]]], dtype=torch.float32)# 使用bilinear插值进行上采样到3x3大小
output_image = F.interpolate(input_image, size=(3, 3), mode='bilinear', align_corners=True)print(output_image)

输出:

tensor([[[[1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000],[1.0000, 1.0000, 1.0000]]]])

在这个例子中,我们使用interpolate()函数将一个1x1的图像上采样到一个3x3的图像,使用了双线性插值(bilinear)。注意,因为输入图像只有一个像素,并且该像素的值为1.0,所以上采样后的输出图像所有像素值也都是1.0。

masked_select函数
torch.masked_select() 是 PyTorch 中的一个函数,它用于从输入张量中选择满足特定条件的元素。该函数的主要参数有两个:输入张量和一个布尔掩码。掩码的形状必须与输入张量的形状相同,掩码中的每个元素对应于输入张量中的相应元素。当掩码中的元素为 True 时,相应的输入元素会被选中。

函数的定义如下:

torch.masked_select(input, mask, out=None)

参数:

  • input (Tensor) – 输入张量。
  • mask (BoolTensor) – 布尔掩码,形状与 input 相同。
  • out (Tensor, optional) – 输出张量。

返回值:

一个一维张量,包含所有被选中的元素。返回的张量不会保留原始张量的形状信息。

示例:

假设我们有一个形状为 [3, 3] 的张量 x 和一个相应的布尔掩码 mask

import torchx = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mask = torch.tensor([[True, False, True], [False, True, False], [True, True, True]], dtype=torch.bool)

我们可以使用 torch.masked_select() 来选择满足条件的元素:

selected_elements = torch.masked_select(x, mask)
print(selected_elements)

输出:

tensor([1, 3, 5, 7, 8, 9])

在这个例子中,掩码中的 True 值对应于输入张量 x 中的元素 [1, 3, 5, 7, 8, 9],因此这些元素被选中并返回为一个一维张量。

Softmax函数

Softmax 是一个在机器学习和深度学习中常见的函数,主要用于将一个实数向量映射到概率分布上。具体来说,给定一个向量 z \mathbf{z} z,Softmax 函数将其转换为概率分布 p \mathbf{p} p,其中 p i p_i pi z \mathbf{z} z 的第 i 个元素的指数除以所有元素的指数和。

数学上,Softmax 函数可以表示为:

p i = e z i ∑ j = 1 n e z j p_i = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} pi=j=1nezjezi

其中 n n n 是输入向量的维度。

为什么使用 Softmax?

  1. 概率分布: Softmax 函数可以将任何实数向量转换为概率分布,使得所有输出概率之和为 1。这使得它非常适合用于多分类问题中,特别是当输出有多个类别时。
  2. 梯度平滑: 在反向传播中,Softmax 的梯度是平滑的,这有助于优化算法(如梯度下降)更稳定地工作。
  3. 计算方便: 由于 Softmax 是基于指数函数的,它通常可以通过查表来高效计算,这有助于加速训练过程。

在 PyTorch 中如何使用 Softmax?

在 PyTorch 中,你可以使用 torch.nn.Softmax 类或 torch.nn.functional.softmax 函数来应用 Softmax。

例如:

import torch
import torch.nn as nn
import torch.nn.functional as F# 定义一个张量
tensor = torch.tensor([1.0, 2.0, 3.0])# 使用 PyTorch 的 Softmax 类
softmax = nn.Softmax(dim=0)
result = softmax(tensor)
print(result)  # 输出: tensor([0.0900, 0.2777, 0.6323])# 或者使用 PyTorch 的 functional 模块
result = F.softmax(tensor, dim=0)
print(result)  # 输出: tensor([0.0900, 0.2777, 0.6323])

在上面的例子中,我们定义了一个一维张量并应用了 Softmax。dim=0 表示沿着第一个维度(通常是行)进行 Softmax。如果你希望沿着列(第二个维度)进行 Softmax,可以将 dim 设置为 1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nn.LSTM个人记录

简介 nn.LSTM参数 torch.nn.lstm(input_size, "输入的嵌入向量维度,例如每个单词用50维向量表示,input_size就是50"hidden_size, "隐藏层节点数量,也是输出的嵌入向量维度"num_layers, "lstm 隐层的层数,默认…

Python---静态Web服务器-多任务版

1. 静态Web服务器的问题 目前的Web服务器,不能支持多用户同时访问,只能一个一个的处理客户端的请求,那么如何开发多任务版的web服务器同时处理 多个客户端的请求? 可以使用多线程,比进程更加节省内存资源。 多任务版web服务器…

计算机网络——网络层(四)

前言: 前面我们已经对物理层和数据链路层有了一个简单的认识与了解,现在我们需要对数据链路层再往上的一个层,网络层进行一个简单的学习与认识,网络层有着极其重要的作用,让我们对网络层进行一个简单的认识与学习吧 目…

Ubuntu:VS Code上C++的环境配置

使用 VSCode 开发 C/C 程序 , 涉及到 工作区的.vscode文件夹下的3个配置文件(均可以手动创建) : ① tasks.json : 编译器构建 配置文件 ; ② launch.json : 调试器设置 配置文件 ; ③ c_cpp_properties.json : 编译器路径和智能代码提示 配置文件 ; …

神经网络:机器学习基础

【一】什么是模型的偏差和方差? 误差(Error) 偏差(Bias) 方差(Variance) 噪声(Noise),一般地,我们把机器学习模型的预测输出与样本的真实label…

详解FreeRTOS:专栏总述

目录 1、理论篇 2、基础篇 3、进阶篇 4、高级篇 5、拓展篇 本专栏基于FreeRTOS底层源码介绍了嵌入式实时操作系统的概念,FreeRTOS任务创建、任务调度、任务同步与消息传递,软件定时器、事件通知等知识。 主要分为5方面内容:理论篇、基础…

Python中json模块的使用与pyecharts绘图的基本介绍

文章目录 json模块json与Python数据的相互转化 pyecharts模块pyecharts基本操作基础折线图配置选项全局配置选项 json模块的数据处理折线图示例示例代码 json模块 json实际上是一种数据存储格式,是一种轻量级的数据交互格式,可以把他理解成一个特定格式…

spring核心组件详细分析图

文章目录 spring核心组件 spring核心组件 spring七大组成部分 1、核心容器 这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用…

python dash 写一个登陆页 4

界面 代码: 这里引入了dash_bootstrap_components 进行界面美化 ,要记一些className,也不是原来说的不用写CSS了。 from dash import Dash, html, dcc, callback, Output, Input, State import dash_bootstrap_components as dbcapp Dash(…

深入理解.net运行时方法表

在.net运行时,每一个类型在创建第一个实例,或者静态成员被第一次访问,或者被反射创建时,就会创建一个与该类型关联的方法表: 基本结构大概如下: -------------------------- | Method Table …

持续集成交付CICD:Jira 远程触发 Jenkins 实现更新 GitLab 分支

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira新建模块 4. Jira 通过Webhook 触发Jenkins流水线 3.Jira 远程触发 Jenkins 实现更新 GitLab 分支 二、问题 1.Jira 配置网络钩子失败 2. Jira 远程触发Jenkins 报错 一、实验 1.环境 (1)主机 …

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用(FA模型) 创建JS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

Docker知识总结

Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用的安装 掌握docker迁移与备份相关命令 能够运用Dockerfile编写创建容器的脚本 能够…

go语言学习计划。

第1周:Go语言概述与环境搭建 内容:了解Go语言的历史、特点和应用场景。安装Go环境,配置工作区。实践:编写第一个Go程序,了解Go的编译运行流程。 第2周:基本语法与数据类型 内容:学习基本数据…

排序算法——基数排序

将需要排序的各个数当做元素,集合组成数组,对数组中的元素进行排序,再开辟一个临时数组的空间将数组中已有的元素数值当做临时数组的下标储存在临时数组中,然后用区别初始化值的方法区别出临时数组中待排数组的元素,以…

全方位掌握卷积神经网络:理解原理 优化实践应用

计算机视觉CV的发展 检测任务 分类与检索 超分辨率重构 医学任务 无人驾驶 整体网络架构 卷积层和激活函数(ReLU)的组合是网络的核心组成部分 激活函数(ReLU) 引入非线性,增强网络的表达能力。 卷积层 负责特征提取 池化层…

[MySQL] 二进制文件

文章目录 日志文件binlog是什么简介产生方式文件格式statementrowmixed 怎么办设置文件存储格式缓冲区大小的调整方式缓冲区写入文件的时机 sync_binlog 日志文件 官网 https://dev.mysql.com/doc/refman/8.0/en/server-logs.html中文版 https://mysql.net.cn/doc/refman/8.0/e…

OpenCV | 霍夫变换:以车道线检测为例

霍夫变换 霍夫变换只能灰度图,彩色图会报错 lines cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength40,maxLineGap20) 参数1:要检测的图片矩阵参数2:距离r的精度,值越大,考虑越多的线参数3:距离…

快速安装方式安装开源OpenSIPS和CP控制界面

OpenSIPS是目前世界上主流的两个SIP软交换引擎(其中另外一个是kamailio)或者SIP信令服务器(个人认为是比较正确的称谓)。关于Opensips的基础和一些参数配置和安装方式笔者在很久以前的历史文档中有非常多的介绍。最近,很多用户使用OpenSIPS软…

《PySpark大数据分析实战》-18.什么是数据分析

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…