问题标签 [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.
pytorch - torch.autograd.grad 中的 grad_outputs (CrossEntropyLoss)
我试图得到d(loss)/d(input)
. 我知道我有两个选择。
第一个选项:
第二种选择:
我的问题是:如果我使用交叉熵损失,我应该grad_outputs
在第二个选项中传递什么?
我放d(CE)/d(y_hat)
吗?由于 pytorch 交叉熵包含 softmax,这将需要我使用 Kronecker delta 预先计算 softmax 导数。
还是我放d(CE)/d(CE)
哪个是torch.ones_like?
一个概念性的答案很好。
python - 无法使用 pytorch 优化功能
我正在尝试为结构方程模型编写估计器。所以基本上我从模型的随机参数开始B
,gamma
, phi_diag
, psi
。并使用它计算隐含的协方差矩阵sigma
。我的优化函数f_ml
是根据数据的sigma
和 协方差矩阵计算的S
。这是我的计算代码:
我正在尝试进行优化:
我面临的问题是我的参数值在优化期间没有更新。我试着稍微调试一下这个问题,我注意到在优化的第一个循环中,梯度得到了计算,但参数的值没有得到更新。这是一个使用 pdb 的示例(在 for 循环之后设置断点):
我不知道我在做什么错。有任何想法吗?
python - 提高 autograd jacobian 的性能
我想知道以下代码如何更快。目前,它似乎慢得不合理,我怀疑我可能错误地使用了 autograd API。我期望的输出是timeline
在 f 的 jacobian 处评估的每个元素,我确实得到了,但这需要很长时间:
我期望以下内容:
jacobian(f)
返回一个表示梯度向量 wrt 参数的函数。jacobian(f)(np.array([1.0, 1.0]))
是在点 (1, 1) 评估的雅可比行列式。对我来说,这应该像一个向量化的 numpy 函数,所以它应该执行得非常快,即使对于 40k 长度的数组也是如此。然而,这不是正在发生的事情。
即使像下面这样的东西也有同样糟糕的表现:
python-3.x - 如何包装 PyTorch 函数并实现 autograd?
我正在阅读有关定义新的 autograd 函数的 PyTorch 教程。我要实现的 autograd 函数是torch.nn.functional.max_pool1d
. 这是我到目前为止所拥有的:
我的问题是:如何获得包装函数的渐变?我知道考虑到我提供的示例非常简单,可能还有其他方法可以做到这一点,但我想做的事情适合这个框架并且需要我实现一个autograd
函数。
编辑:在检查了这篇博文后,我决定尝试以下方法backward
:
添加output
到保存的变量中。然后我运行以下代码:
我明白了Bus error: 10
。
说xT
is tensor([[[ 1.69533562, -0.21779421, 2.28693953, -0.86688095, -1.01033497]]], dtype=torch.float64)
,那么我希望在调用之后找到它(xT.grad
即 包含)。tensor([[[ 3.39067124, -0. , 9.14775812, -0. , -2.02066994]]], dtype=torch.float64)
s.backward()
2*x*grad_of_max_pool
grad_of_max_pool
tensor([[[1., 0., 2., 0., 1.]]], dtype=torch.float64)
我已经弄清楚为什么我得到一个Bus error: 10
. 上面的代码似乎导致了 my backward
at的递归调用grad_input = output.backward(grad_output)
。所以我需要找到其他方法来获得max_pool1d
. 我知道如何在纯 Python 中实现这一点,但结果会比我可以包装库代码要慢得多。
python - 是否可以使用 Autograd 计算神经网络输出相对于其输入之一的导数?
我有一个神经网络模型,它为大约 9 个输入 X 输出大小约为 4000 的向量 Y。我需要计算 Y 输出与输入 X_1 或 X_2 中的一个或两个的偏导数。
我已经有了这些导数,并且我已经为 X_1 和 X_2 训练了两个不同的神经网络。它做得很好,但问题是导数不如计算 Y 的神经网络准确。
我希望有一种方法可以从最终/优化的神经网络计算输出向量 Y 到 X 中的一个输入的导数,这样我就不需要为导数训练两个额外的神经网络。
有没有办法用 autograd 做到这一点?
pytorch - 激活梯度惩罚
这是一个简单的神经网络,我试图惩罚激活梯度的范数:
但是,它不会产生所需的正则化效果。如果我对权重(而不是激活)做同样的事情,效果很好。我做对了吗(就pytorch机器而言)?具体来说,在 grad_norm.backward() 调用中会发生什么?我只想确保更新权重梯度,而不是激活梯度。目前,当我在该行之前和之后打印出权重和激活的梯度时,两者都会发生变化 - 所以我不确定发生了什么。
python - 使用 autograd.grad() 作为损失函数的参数(pytorch)
我想计算网络中两个张量之间的梯度。输入 X 张量通过一组卷积层发送,这些卷积层返回并输出 Y 张量。
我正在创建一个新的损失,我想知道 X 的每个元素的 norm(Y) 梯度之间的 MSE。这里的代码:
不幸的是,我一直在用 torch.autograd.grad() 进行测试,但我不知道该怎么做。我收到以下错误:RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.
设置allow_unused=True
让我回来None
,这不是一个选择。不确定如何计算梯度和范数之间的损失。关于如何编码这种损失的任何想法?
python - pytorch 是否对其计算图进行急切修剪?
这是一个非常简单的例子:
这将打印,
因为,当然,对于 z 为零的条目,ds/dx 为零。
我的问题是:pytorch 是否智能并在达到零时停止计算?还是实际上做计算“ 2*5
”,只是为了以后做“ 10 * 0 = 0
”?
在这个简单的例子中,它并没有太大的区别,但是在我正在研究的(更大的)问题中,这会有所作为。
感谢您的任何意见。
python-2.7 - autograd.hessian_vector_product 和 scipy.optimize.NonlinearConstraint 的问题
我正在尝试使用 运行最小化问题scipy.optimize
,包括NonlinearConstraint
. 我真的不想自己编写衍生代码,所以我习惯autograd
这样做。但即使我对 tominimize
和 to的参数遵循完全相同的程序NonlinearConstraint
,第一个似乎有效,第二个无效。
这是我的 MWE:
当我useconstraint
关闭(在顶部)时,它工作正常并按(0, 0)
预期最小化。当我打开它时,我收到以下错误:
我究竟做错了什么?我认为问题出在hessian_vector_product
因为我hess
在错误消息中看到,但我不确定。