torch框架学习过程遇到问题

一些用法

下划线后缀

在 PyTorch 中,使用下划线后缀的函数通常表示就地修改(inplace)操作。就地修改操作会直接修改原始的张量对象,而不返回新的张量。这在处理大型数据时可以节省内存和计算资源。

例如,scatter_() 是一个就地修改操作,用于散布(scatter)操作。它会直接修改原始的目标张量,而不会返回一个新的张量。类似地,add_()、mul_()、div_() 等函数也是就地修改操作,用于原位加法、原位乘法、原位除法等。

然而,并不是所有的函数都有下划线后缀。许多函数仅返回新的张量而不对原始张量进行修改。例如,add()、mul()、div()、scatter() 等函数都是不可变操作,它们会创建并返回一个新的张量对象。

需要注意的是,并非所有的函数都有就地修改的版本。有些函数只有不可变操作的版本,而没有对应的就地修改版本。

因此,当需要就地修改张量时,可以寻找具有下划线后缀的相应函数。但并不是所有的函数都有这种后缀。在使用函数时,需要查看函数的文档或参考官方文档以确定是否存在就地修改的版本。

torch.nn.conv2d和torch.nn.functional.conv2d的区别

我们会发现在 torch.nn.xxx 和 torch.nn.functional.xxx 中有一些功能重复的操作,比如卷积、激活、池化。这些操作有什么不同?各有什么用处?

nn.Module 实现的 layer 是由 class Layer(nn.Module) 定义的特殊类
nn.functional 中的函数更像是纯函数,由 def function(input) 定义

详解

chat给的解释

扫描二维码关注公众号,回复: 16428363 查看本文章

在 PyTorch 中,torch.nn 和 torch.nn.functional 提供了一些重复的操作,比如卷积、激活和池化等。这些操作的区别主要集中在使用方式和功能上,以下是它们的主要区别和用途:

1.使用方式:torch.nn 中的操作是通过创建相应的层对象来实现的,它们是 torch.nn.Module 的子类,需要实例化并作为对象使用。而 torch.nn.functional 中的操作是直接调用函数的方式,没有层对象的概念,可以直接传入输入和参数进行计算。

2.计算图记录:torch.nn 的操作会自动跟踪计算图,并记录层对象和参数的信息,以便进行自动求导和梯度计算。而 torch.nn.functional 的操作不会记录计算图,无法进行自动求导,只能手动计算梯度。

3.灵活性:torch.nn.functional 提供了更灵活的编程方式,函数的输入和参数可以更加灵活地指定和调整。它适用于那些需要根据输入动态调整参数的情况。而 torch.nn 中的操作在实例化层对象时,需要将参数固定下来,限制了灵活性,适用于那些参数固定的情况。

4.可重用性:torch.nn 中的层对象是可重用的,可以在不同的模型中多次使用。这样可以方便地构建复杂的模型结构。torch.nn.functional 的函数是**没有状态的,不保存任何参数,每次调用时都需要指定参数的值。**因此,它们不具有可重用性,不能在多个地方共享使用。

综上所述,torch.nn 和 torch.nn.functional 提供了不同的编程方式和功能,可以根据具体的需求选择合适的方式。如果需要跟踪计算图、进行自动求导以及构建可重用的模型结构,建议使用 torch.nn 中的操作。如果需要更灵活的编程方式和增加代码的可读性,或在不需要计算图和自动求导的环境下进行操作,可以使用 torch.nn.functional 中的函数。

函数

torch.函数名

PyTorch框架提供了许多实用的函数,可以通过torch.函数名的方式进行调用。以下是一些常用的torch.函数:

1.torch.max: 计算张量在指定维度上的最大值或返回两个张量中每个位置上的最大值。
2.torch.min: 计算张量在指定维度上的最小值或返回两个张量中每个位置上的最小值。
3.torch.mean: 计算张量在指定维度上的平均值。
4.torch.sum: 沿指定维度计算张量的和。
5.torch.prod: 计算张量在指定维度上的乘积。
6.torch.argmax: 返回张量在指定维度上的最大值的索引。
7.torch.argmin: 返回张量在指定维度上的最小值的索引。
8.torch.exp: 计算张量的指数。
9.torch.log: 计算张量的自然对数。
10.torch.sqrt: 计算张量的平方根。
11.torch.abs: 计算张量的绝对值。
12.torch.sin: 计算张量的正弦值。
13.torch.cos: 计算张量的余弦值。
14.torch.matmul: 执行两个张量的矩阵乘法。
15.torch.cat: 沿指定维度拼接张量。
16.torch.split: 按指定大小或数量分割张量。
17.torch.reshape: 改变张量的形状。

这只是一小部分的例子,PyTorch 提供了许多其他有用的函数,涵盖了各种张量操作、数学运算和神经网络的函数。你可以参考 PyTorch 官方文档以获取完整的函数列表和详细的使用说明。

scatter函数

scatter函数用法

一些案例

import torch

input = torch.zeros(2, 3)  # 创建一个2x3的全零张量
index = torch.tensor([[0, 1, 0], [1, 0, 1]])  # 索引张量
src = torch.tensor([[1, 2, 3], [4, 5, 6]],dtype=input.dtype)  # 要散布的值

output = input.scatter(dim=0, index=index, src=src)
print(output)

#output
tensor([[1., 5., 3.],
        [4., 2., 6.]])

个人理解:

scatter 是 PyTorch 中的一个函数,用于将指定值散布(scatter)到目标张量的指定位置。其主要作用是根据给定的索引,将指定的值填充到目标张量的对应位置上。

torch.scatter(input, dim, index, src)
  • input:一个目标张量,用于接收散布结果。
  • dim:一个整数值,指定索引的维度。
  • index:一个索引张量,指定散布值的位置。
  • src:一个源张量,包含要散布的值。

实现过程可以简单的这么理解

遍历src

 for i in range(src.shape[0]):
        for j in range(src.shape[1]):
            for k in range(src.shape[2]):
                input[index[i][j][k]][j][k] = src[i][j][k]  # if dim == 0
                input[i][index[i][j][k]][k] = src[i][j][k]  # if dim == 1
                input[i][j][index[i][j][k]] = src[i][j][k]  # if dim == 2

input[index[i][j][k]][j][k] = src[i][j][k] # if dim == 0
input[i][index[i][j][k]][k] = src[i][j][k] # if dim == 1
input[i][j][index[i][j][k]] = src[i][j][k] # if dim == 2

其他

模型的不同模式:train,eval,infer

1.训练模式 (train): 这是模型默认的模式。在训练模式下,模型会执行完整的训练过程,包括前向传播、计算损失、反向传播以及参数更新。在这个模式下,模型会启用 Dropout、Batch Normalization 等训练相关的操作,以更好地适应训练数据。

2.评估模式 (eval): 在评估模式下,模型关闭一些具有随机性的操作,如 Dropout 和 Batch Normalization 的随机丢弃。这样做的目的是为了在评估阶段获得一致的输出,并确保模型的结果可复现。在评估模式下,模型的前向传播行为与训练模式可能有所不同。

该方法一般与模型的torch.no_grad()上下文管理器一同使用,以避免不必要的梯度计算,从而提高评估的效率

示例

model.eval()
with torch.no_grad():
    # 进行评估操作,不计算梯度
    # ...

3.推断模式 (infer): 推断模式通常指模型在真实应用中对新数据做出预测的模式。这种模式下,模型类似于评估模式,关闭了一些训练相关的操作,以保持输出稳定性。推断模式与评估模式的概念相似,有时可以用来表示相同的行为。

这些模式的切换可以通过调用模型对象的相应方法实现,例如 model.train()、model.eval()。切换模式的目的是根据任务的不同阶段或需求,调整模型的行为,以获得最佳的训练结果或预测性能。在训练阶段通常使用训练模式,而在评估和推断阶段通常使用评估模式或推断模式。

读取和保存tensor

import torch
tensor=torch.tensor([1,2,3,4,5])
tensor.save(tensor,"tensor.pt")
tensor_load=tensor.load("tensor.pt")

猜你喜欢

转载自blog.csdn.net/m0_51312071/article/details/132357987
今日推荐