pyro 自动 ValueError: Expected parameter loc al(), but found in nan

   distribution Normal(loc: torch.Size([11308802]), scale: torch.Size([11308802])

pos_dist = self.get_posterior(*args, **kwargs)
  File "/root/.local/lib/python3.10/site-packages/pyro/infer/autoguide/guides.py", line 958, in get_posterior
    return dist.Normal(self.loc, self.scale).to_event(1)
  File "/root/.local/lib/python3.10/site-packages/pyro/distributions/distribution.py", line 26, in __call__
    return super().__call__(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/torch/distributions/normal.py", line 56, in __init__
    super().__init__(batch_shape, validate_args=validate_args)
  File "/usr/local/lib/python3.10/site-packages/torch/distributions/distribution.py", line 68, in __init__
    raise ValueError(
ValueError: Expected parameter loc (Parameter of shape (1satisfy the constraint Real(), but found invalid values1308802,)) of distribution Normal(loc: torch.Size([11308802]), scale: torch.Size([11308802])) to :
Parameter containing:
tensor([          nan,           nan,           nan,  ...,
        -1504742.8750, -1645466.7500, 23261436.0000], device='cuda:0',
       requires_grad=True)
           Trace Shapes:         
            Param Sites:         
  AutoDiagonalNormal.loc 11308802
AutoDiagonalNormal.scale 11308802

==========================================================

解决办法

修改下源码 

/root/.local/lib/python3.10/site-packages/pyro/infer/autoguide/guides.py

==========================================

File "/root/.local/lib/python3.10/site-packages/pyro/infer/autoguide/guides.py", line 966, in get_posterior
    loc[loc < 0.0001] = 0.00001
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
           Trace Shapes:         
            Param Sites:         
  AutoDiagonalNormal.loc 11308802
AutoDiagonalNormal.scale 11308802
           Sample Sites:

这个错误信息表明你在使用 Pyro 库进行概率编程时遇到了一个问题。具体来说,错误发生在尝试对一个需要梯度的叶子变量(leaf variable)进行原地(in-place)操作时。在 PyTorch 中,叶子变量是指直接从数据创建的变量,或者是通过操作其他叶子变量得到的变量,它们通常用于自动微分。

错误信息的关键部分是:
```
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
```

这意味着你尝试对一个需要计算梯度的变量进行原地修改,这是不允许的。在 PyTorch 中,原地操作可以提高内存效率,但它们不能用于需要梯度的变量,因为这会破坏计算图,从而无法正确地进行反向传播。

在你的代码中,你尝试将 `loc` 数组中小于 `0.0001` 的元素设置为 `0.00001`,这显然是一个原地操作。由于 `loc` 是一个需要梯度的变量,所以这种操作是不允许的。

### 解决方案

要解决这个问题,你可以避免原地操作,而是创建一个新的变量来存储修改后的值。这里是一个修改后的代码示例:

```python
import torch

# 假设 loc 是一个需要梯度的变量
loc = torch.randn(11308802, requires_grad=True)

# 避免原地操作,而是创建一个新的变量
loc = torch.where(loc < 0.0001, 0.00001, loc)
```

在这个示例中,`torch.where` 函数用于创建一个新的张量,其中条件 `loc < 0.0001` 为真的地方,值被设置为 `0.00001`,否则保持原来的值。这样就不会修改原始的 `loc` 变量,而是创建了一个新的变量。

### 总结

当你在使用 PyTorch 或 Pyro 进行深度学习或概率编程时,需要特别注意不要对需要梯度的变量进行原地操作。这可以通过使用不改变原始变量的方法来避免,如 `torch.where` 或其他不涉及原地修改的操作。这样可以确保计算图的完整性,从而允许正确的梯度计算和反向传播。
 

/root/.local/lib/python3.10/site-packages/pyro/infer/autoguide/guides.py

import random

        loc = self.loc
	scale = self.scale
	# 避免原地操作,而是创建一个新的变量, 支持梯度
        loc = torch.where(loc < 0.0001, 0.00001, loc)
        #loc[loc > 10000] = random.randint(1, 1000)
        #print(scale)
        #nan_mask = torch.isnan(loc)
        #loc[nan_mask] = 0.00001
        loc = torch.nan_to_num(loc, nan=0.00001)

        scale[scale < 0.0001] = 0.00001
        scale[scale > 10000] = random.randint(1, 1000)
        #print(scale)
        nan_mask = torch.isnan(scale)
        scale[nan_mask] = 0.00001

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值