问题标签 [autograd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 张量范数的autograd中的“形状未对齐”
我想使用 autograd 来计算张量范数的梯度,如下所示:
我也尝试了不同的实现(例如使用我自己的规范或使用不同形状的张量)但我总是收到错误
ValueError:形状(100,100)和(10000,100)未对齐:100(dim 1)!= 10000(dim 0)
python - Pytorch:输出wrt参数的梯度
我有兴趣找到关于参数(权重和偏差)的神经网络输出的梯度。
更具体地说,假设我有以下神经网络结构 [6,4,3,1]。输入样本大小是 20。我感兴趣的是找到权重(和偏差)的神经网络输出的梯度,如果我没记错的话,在这种情况下是 47。在文献中,这个梯度有时称为 Weight_Jacobian。
我在 Jupyter Notebook 上的 Python 3.6 上使用 Pytorch 0.4.0 版。
我制作的代码是这样的:
从代码中可以明显看出,我使用双曲正切作为非线性。该代码生成长度为 20 的输出向量。现在,我有兴趣在所有权重(全部 47 个)中找到此输出向量的梯度。我在这里阅读了 Pytorch 的文档。例如,我也在 这里看到了类似的问题。但是,我没能找到输出向量 wrt 参数的梯度。如果我使用 Pytorch 函数backward(),它会生成一个错误
我的问题是,有没有办法计算输出向量 wrt 参数的梯度,它基本上可以表示为 20*47 矩阵,因为我的输出向量的大小为 20,参数向量的大小为 47?如果是这样,如何?我的代码有什么问题吗?你可以举任何 X 的例子,只要它的尺寸是 20*6。
python - pytorch 中的高阶梯度
我在 pytorch 中实现了以下雅可比函数。除非我犯了一个错误,否则它会计算任何张量 wrt 任何维度输入的雅可比行列式:
最重要的是,我尝试实现一个递归函数来计算 n 阶导数:
我进行了一个简单的测试:
不幸的是,这成功地让我得到了 Hessian ......但没有高阶导数。我知道许多高阶导数应该为 0,但如果 pytorch 可以分析计算它,我更愿意。
一种解决方法是将梯度计算更改为:
这是处理此问题的公认正确方法吗?还是有更好的选择?还是我的问题一开始就完全错误的原因?
python - 收集输入后,Pytorch autograd 失败并显示“RuntimeError:差分输入无法访问”
Pytorch 版本 0.3.1
编辑:我正在重写这个问题以使其更简单,因为我已经缩小了错误的范围。
我有一些变量:
然后我创建一个表示它们连接的变量:
然后我尝试取导数:
这很好,并按预期返回 1。y 和 z 相同。
然而,
返回一个错误:RuntimeError: distinct input is unreachable
当然,这是有道理的—— w 没有在 . 的声明中明确使用f
。但是,我想要一种行为,其中一行代码可以生成类似[1; 1; 1]
输出的东西。
假设我想方便地将我的变量批处理在一起,然后一次获取整个 shebang 的梯度,而不是独立处理变量(这会使簿记成为一场噩梦)。有什么办法可以得到我想要的结果吗?
gradient - Pytorch 二阶导数卡在两个错误之间:缓冲区已释放且变量易失
我有一个损失函数和一个权重矩阵列表,我正在尝试计算二阶导数。这是一个代码片段:
上面的代码有效(实际上二阶导数是在一个单独的函数中调用的,但为了简洁起见,我直接把它放了)。但我对何时使用创建和保留图完全感到困惑。
第一:如果我不做 loss.backward(retain_graph) 我得到错误 A:
RuntimeError:变量元组的元素 0 易失
如果我使用它,但不对一阶导数添加任何“图形”语句,则会收到错误 B:
RuntimeError:试图第二次向后遍历图形,但缓冲区已被释放。第一次向后调用时指定retain_graph=True。
如果我指定retain_graph=True,无论我是否在此处放置create graph 语句,都会得到二阶导数的错误A(即在for 循环中)。
因此,只有上面的代码片段有效,但我需要 loss.backward 和所有 create graph 语句感觉很奇怪。有人可以向我澄清这一点吗?非常感谢提前!!
python - Autograd 无法正确计算正态 CDF 导数
当谈到 Autograd 时,我完全是个新手,所以我觉得我做的事情可能很明显是错误的。但是,我花了一整天的时间在这上面挣扎。
我正在尝试计算包含正常 cdf 的函数的导数。我在 Autograd 上没有成功,所以我把它分成越来越小的部分,直到我将错误源隔离为 Normal CDF。这是一个最小的工作示例:
我知道优化 CDF 没有意义,我只是这样做是为了从回调中获取输出,如下所示:
由 Autograd 计算的梯度与由正常 PDF 表示的理论导数不匹配。
我执行不正确吗?我觉得这么广泛使用的包装不太可能有这样的洞。如何使用 Autograd(或 Python 中的其他包)来获得输出标量的函数的有效数值导数。
python - 更新 Pytorch 变量
首先,我应该提到我使用的是 Torch 版本 0.3.1,但如果有必要,我很乐意升级。
我还在学习,所以如果我在这里误解了什么,请告诉我。
我正在使用变量命令式地构建几个图表。随着时间的推移,数学表达式可能会非常复杂,并且可以使用 autograd 的梯度函数生成图形的某些部分,然后对其进行操作。
我可以创建任何我想要的表达方式。唯一的问题是构建这个图可能非常“慢”——对于相对简单的操作(4x4 矩阵相乘),可能需要几毫秒。
但是,一旦生成了这些图表,我希望我应该能够更快地更新某些变量的值,并评估图表的输出(或任何节点,实际上)。我相信这可能就是这种情况,因为评估应该能够完全在 C 后端进行,这对于速度应该是相当优化的?换句话说,在 python 中构建图形可能会很慢,因为它涉及 python for 循环等,但是重新评估具有静态拓扑的图形应该很快。
这种直觉正确吗?如果是这样,我怎样才能有效地重新分配一个值并重新评估图表?
python - 减少和一个 numpy 数组的最有效方法(使用 autograd)
我有两个数组:
我想制作:
以最有效的方式。
- 我的值是通过 autograd 计算的
- 由于上述几点,在熊猫中进行分组确实效率不高
index
我必须在相同但不同的值上做数百次len(values)
~ 10**7len(set(index))
~ 10**6Counter(index).most_common(1)[0][1]
~ 1000
我认为一个纯粹的 numpy 解决方案将是最好的。
我尝试预先计算 的简化版本index
,然后执行以下操作:
但效率不够。
这是一个最小的代码示例:
python - 使用 PyTorch 进行就地操作
我想知道如何处理 PyTorch 中的就地操作。我记得在 autograd 中使用就地操作一直是个问题。
实际上,我很惊讶下面的这段代码可以正常工作,即使我没有测试过,我相信这段代码会在 version 中引发错误0.3.1
。
基本上我想做的是将张量向量的某个位置设置为某个值,如下所示:
工作示例代码:
输出:
所以很明显在版本中0.4.1
。这工作得很好,没有警告或错误。
参考文档中的这篇文章:autograd-mechanics
在 autograd 中支持就地操作是一件困难的事情,我们不鼓励在大多数情况下使用它们。Autograd 积极的缓冲区释放和重用使其非常高效,并且很少有情况下就地操作实际上会显着降低内存使用量。除非您在沉重的内存压力下操作,否则您可能永远不需要使用它们。
但即使它有效,在大多数情况下也不鼓励使用就地操作。
所以我的问题是:
就地操作的使用对性能有多大影响?
在我想将张量的一个元素设置为某个值的情况下,如何使用就地操作?
提前致谢!
python - 在 Python 中使用 Autograd 包进行渐变
我正在尝试使用package.json 复制这个标准示例Autograd
。
虽然我能够从这个存储库复制其他示例,但这个特定示例会引发如下错误:
这个相关版本不兼容吗?如果是这样,有什么快速的方法来解决这个问题?
提前致谢,