首页 > 其他分享 >pytorch常见错误_0240826

pytorch常见错误_0240826

时间:2024-08-27 23:05:05浏览次数:4  
标签:tensor 错误 True torch 生成器 pytorch 0240826 grad

pytorch 常见错误

RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.

如下程序会抱上述错误

x=torch.randn(3,requires_grad=True)
x += 1  # 原位操作 报错:RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.

报错:你在一个变量上进行操作,但是该变量是不可以修改的。这个变量是tensor。x是梯度是开启的,此时x不应该进行原位操作,但是x进行了原位操作。

原因:pytorch的自动求导机制的本质是使用链式求导法则,将求导的过程分解成一个一个的基本操作算子。其具体是通过自动构建计算图,来求解导数。

如下函数 \(y=f(x)\) , pytorch 的计算过程是这样

x = x0                # x取值x0
x.requires_grad=True  # 目标函数是否关于x求梯度
y=f(x)                # 前向过程
y.backward()          # 反向求导
x.grad                # 输出x在x0处的导数

py计算的是目标函数关于自变量在某一个确定点的导数值。此时已经构建了一张图,你将x进行了改变,此时计算图要重新构建。pytorch不允许这种操作。

假设 \(y=x*x\), 现在对x进行了操作x=x+1, 那么再对y求x的导数的时候,y关于x的映射关系是哪个?是\(y=x*x\), 还是 \(y = (x+1) * (x+1)\)​。pytorch决定不了,总要有一个选择。

解决方案:

  1. 使用tensor的data属性:tensor有一个基本属性data,它是tensor上存储的变量的数值,你可以修改这个数值,但是不修改其他属性。选择的是\(y=(x+1)*(x+1)的路子\)

    x=torch.tensor([1.0,1.0],requires_grad=True)
    x.data += 1  
    y=torch.dot(x,x)*0.5
    y.backward()
    x.grad        #tensor([2., 2.], requires_grad=True)
    x.grad == x   #tensor([True, True, True])
    
  2. 使用with torch.no_grad() 此时梯度属性被禁用了

    x=torch.tensor([1.0,1.0],requires_grad=True)
    with torch.no_grad():  # 在上下文管理器中进行
      x += 1
    y=torch.dot(x,x) * 0.5 
    y.backward()
    x.grad     #tensor([2., 2.], requires_grad=True)
    x.grad == x   #tensor([True, True, True])
    

    2、tensor.grad.zero_() 梯度清零的使用场景

    • 构建tensor x。其梯度打来
    • 函数y=f(x) 对y关于\(x\) 在某一点求梯度x.grad
    • 使用\(x\) 构建函数\(g=g(x)\), 如果x不进行梯度清零,那么对g关于x求导,其结果为x.grad = g关于x的导数+y关于x的导数

    在深度学习里面,神经网络的参数是在动态变化中,所以其对应的映射关系也是在动态变化中。所以一次反向求导之后,进行第二次反向求导,那么需要将导数清零。

    x=torch.tensor([1.0,1.0],requires_grad=True)
    y=torch.dot(x,x) * 0.5 
    g=2*x
    y.backward()
    g.sum().backward()
    x.grad    # tensor([3., 3.])  = tensor([1., 1.]) + 2
    

    3、pytorch当loss是nan的时候,其是无法输出的,具体案例如下:

    x=torch.tensor([0,1,1,1,1],requires_grad=True,dtype=torch.float)
    y=x/x
    y.sum().backward()
    x.grad      # 产生了除0操作,y为NAN,此时x为NAN
    

4.python的生成器机制yield

通过yield关键字定义生成器。使得函数能够记住上一次执行的状态,并在下一次调用的时候,从该状态继续执行。生成器有如下特性:

  • 惰性求值:等到使用的时候再计算
  • 节省内存:由于生成器在任何时刻只处理一个值,因此它不需要在内存中存储整个数据集,这在处理大量数据时尤其有用。
  • 状态保持:生成器函数可以记住其上一次执行的状态,这意味着它可以从中断的地方继续执行。

定义生成器:

  1. 使用yield关键字

    def f(n):
      for i in range(n):
        yield i    # 使用yield定义生成器
    
  2. 生成器表达式

    y = (x * x for x in range(5))
    

如何使用生成器?

  1. 使用for循环: 更加频繁,pytorch dataloader函数

    for i in f(3):
      x = i
      print(i)
    
  2. 使用next函数

    next(y)
    
    

使用场景

  • 大文件处理,节省内存

5、python 易错点

python 函数的特点

def f(n):
  print('x:',x)

x=10
f(1)  # 输出10
x=20
f(2)  # 输出20

注意:函数中定义了x,会优先寻找局部变量;如果没有局部变量,寻找外部距离调用函数最近的变量;如果没有外部变量,也没有全局变量,报错

6、pytorch报错

TypeError: cannot assign 'torch.FloatTensor' as parameter 'weight' (torch.nn.Parameter or None expected)

net = nn.Sequential(nn.Linear(in_features=3, out_features=1,bias=True))
net[0].weight = torch.randn(3)  #[ERROR]
net[0].weight.data = torch.randn(3) # [OK]

7、pytorch报错

RuntimeError: mat2 must be a matrix, got 1-D tensor

net = nn.Sequential(nn.Linear(in_features=4, out_features=1,bias=True))
net[0].weight.data = torch.randn(4)  
x=torch.randn(10,4)
net(x)  # 报错,因为此时net[0].weight.data是一个向量mat2 must be a matrix, got 1-D tensor
net[0].weight.data = torch.randn(1,4) # 注意data的维度 是1*4 还是4*1
net(x)  # 输出正确结果

标签:tensor,错误,True,torch,生成器,pytorch,0240826,grad
From: https://www.cnblogs.com/douniwanli/p/18383702

相关文章

  • 释放GPU潜能:PyTorch中torch.nn.DataParallel的数据并行实践
    释放GPU潜能:PyTorch中torch.nn.DataParallel的数据并行实践在深度学习模型的训练过程中,计算资源的需求往往随着模型复杂度的提升而增加。PyTorch,作为当前领先的深度学习框架之一,提供了torch.nn.DataParallel这一工具,使得开发者能够利用多个GPU进行数据并行处理,从而显著加速......
  • 计算机的错误计算(七十四 )
    摘要 回复网友的疑问:用错数解释计算机的错误计算(六十四)中的错误计算原因。    计算机的错误计算(六十四)到(六十九),以及(七十一)与(七十三)分别阐述了不同三角函数在   或    附近数的计算精度问题。有网友问:能否用错数解释这些三角函数的错误计算原因?答:本节以(六......
  • Transformer源码详解(Pytorch版本)
    Transformer源码详解(Pytorch版本)Pytorch版代码链接如下GitHub-harvardnlp/annotated-transformer:AnannotatedimplementationoftheTransformerpaper.首先来看看attention函数,该函数实现了Transformer中的多头自注意力机制的计算过程。defattention(query,key,v......
  • PHPStudy 面板在使用过程中可能会遇到各种错误
    面板在使用过程中可能会遇到各种错误。这里列出一些常见的问题及其解决方法:启动问题启动失败描述:面板启动时失败,无法正常工作。解决方法:检查面板的日志文件,查找启动失败的具体原因。确认服务器资源是否足够。重新安装或更新到最新版本的PHPStudy。网站问题网......
  • XAMPP 的日志文件通常包含详细的错误信息如何查看
    通用解决步骤查看日志文件描述:XAMPP的日志文件通常包含详细的错误信息。解决方法:打开XAMPP安装目录下的 logs 文件夹。查看Apache和MySQL的日志文件。重启服务描述:有时候简单的重启服务就可以解决一些临时性的问题。解决方法:使用XAMPP控制面板重启......
  • 网站提示500.12 服务器错误:Web 服务器上的应用程序正在重新启动怎么办
    当网站提示 500.12InternalServerError 并指出“Web服务器上的应用程序正在重新启动”时,这通常意味着IIS(InternetInformationServices)正在重新启动一个ASP.NET应用程序池。这种情况通常是由于应用程序池的配置问题、应用程序错误或资源问题引起的。以下是解决 500......
  • 网站提示500.11 服务器错误:Web 服务器上的应用程序正在关闭怎么办
    当网站提示 500.11InternalServerError 并指出“Web服务器上的应用程序正在关闭”时,这通常意味着应用程序池(ApplicationPool)在IIS(InternetInformationServices)服务器上已停止运行或正在重启过程中。这种情况通常发生在ASP.NET应用程序中。以下是解决 500.11Internal......
  • 网站提示400错误:错误请求怎么办
    当网站提示 400BadRequest 错误时,这意味着服务器无法理解客户端发送的请求。这种错误通常是由于客户端请求的格式有问题或者包含了一些服务器无法处理的信息。以下是解决 400BadRequest 错误的一些常见方法:常见原因URL输入错误:URL中可能存在语法错误或无效的参数。H......
  • 网站提示400 - 请求错误,服务器无法理解客户端的请求怎么办
    当网站提示 400BadRequest 错误时,这意味着服务器无法理解客户端发送的请求。这种错误通常是由于客户端请求的格式有问题或者包含了一些服务器无法处理的信息。以下是解决 400BadRequest 错误的一些常见方法:常见原因URL输入错误:URL中可能存在语法错误或无效的参数。H......
  • 网站提示503错误:服务不可用怎么办
    当网站提示 503ServiceUnavailable 错误时,这意味着服务器暂时无法处理请求。这种错误通常是由于服务器过载或正在进行维护。以下是解决 503ServiceUnavailable 错误的一些常见方法:常见原因服务器过载:服务器资源耗尽,无法处理更多的请求。应用服务器故障:应用服务器出现......