IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Function ‘MseLossBackward0‘ returned nan values in its 0th output. -> 正文阅读

[人工智能]Function ‘MseLossBackward0‘ returned nan values in its 0th output.

这个比较奇怪的提示来自于Pytorch计算梯度的过程中产生了一个nan值。
如果开启了:

torch.autograd.set_detect_anomaly(True)

那么在loss.backward()的时候就会出现这个提示。
为什么会出现这的情况呢?
在pytorch的一个讨论中出现过这个问题,链接:https://discuss.pytorch.org/t/function-mselossbackward-returned-nan-values-in-its-0th-output/94875。
讨论中有提到:

x = torch.randn(1, 1, requires_grad=True)
y = torch.zeros(1, 1)
criterion = nn.MSELoss()

loss = torch.sqrt(criterion(x * 0, y))
loss.backward()
print(x.grad)
> tensor([[nan]])

那么问题就很明显了,因为在loss的计算中出现了不可求导的情况,导致了梯度计算出现nan值。所以在写损失函数时需要注意计算过程中的那些可能导致求导失败的操作。
那是不是数学上不能计算出梯度的函数在pytorch中也不能计算梯度呢?答案是否定的。
进行如下简单的试验:

    torch.autograd.set_detect_anomaly(True)
    x = torch.randn(1, requires_grad=True)
    loss = torch.abs((x * 0))  # abs的0值是不会导致backward出现问题的。

    # loss = torch.sqrt(loss)  # sqrt的0值会导致backward计算出nan的数据。
    loss.backward()
    print(x.grad)

输出:

tensor([0.])

当去掉torch.sqrt()的注释后,输出:

Traceback (most recent call last):
  File "d:/Code/python/base-python/my_torch.py", line 183, in <module>
    gradient()
  File "d:/Code/python/base-python/my_torch.py", line 160, in gradient
    loss.backward()
  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\_tensor.py", line 307, in backward
    torch.autograd.backward(self, gradient, retain_graph, create_graph, inputs=inputs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\torch\autograd\__init__.py", line 154, in backward
    Variable._execution_engine.run_backward(
RuntimeError: Function 'AbsBackward0' returned nan values in its 0th output.
ERROR conda.cli.main_run:execute(33): Subprocess for 'conda run ['python', 'd:/Code/python/base-python/my_torch.py']' command failed.  (See above for error)

成功地触发了error。
所以,虽然绝对值函数在0处应当是没有梯度定义的,但是在pytorch中没有问题,而取平方根函数会有问题。
那么怎么处理这种情况呢?一个比较简单的方法是添加一个微量的偏移,如下:

    torch.autograd.set_detect_anomaly(True)
    x = torch.randn(1, requires_grad=True)
    loss = torch.abs((x * 0))+1e-6  # abs的0值是不会导致backward出现问题的。

    loss = torch.sqrt(loss)  # sqrt的0值会导致backward计算出nan的数据。
    loss.backward()
    print(x.grad)

输出

tensor([0.])
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:21:38  更:2022-03-16 22:24:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:45:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码