要在Pytorch中执行backward,我们可以使用一个可选参数y.backward(v)来计算乘以v的雅可比矩阵 x = torch.randn(3, requires_grad=True)
y = x * 2
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad) 我认为计算雅可比矩阵的成本是相同的,因为计算雅可比矩阵所必需的AD图中的每个节点仍然是计算的。那么为什么Pytorch不想给我们雅可比矩阵呢?
我有两个变量,x和theta。我只想尽量减少对theta的损失,但作为损失函数的一部分,我需要一个关于x的不同函数(f)的导数。这个导数本身与最小化无关,只是它的输出。但是,在PyTorch中实现此操作时,我会得到一个运行时错误。
最起码的例子如下:
# minimal example of two different autograds
import torch
from torch.autograd.functional import jacobian
def f(theta, x):
return torch.sum(theta * x ** 2)
def df(theta,
如何在pytorch中使用优化方法时包含边界。我有一个变量的张量,每个变量都有不同的界限。
upper_bound = torch.tensor([1,5,10], requires_grad=False)
lower_bound = torch.tensor([-1,-5,-10], requires_grad=False)
X = torch.tensor([10, -60, 105], require_grad=True)
for _ in range(100):
optimizer.zero_grad()
loss = ..
loss
我正在探索PyTorch,但我不理解以下示例的输出:
# Initialize x, y and z to values 4, -3 and 5
x = torch.tensor(4., requires_grad = True)
y = torch.tensor(-3., requires_grad = True)
z = torch.tensor(5., requires_grad = True)
# Set q to sum of x and y, set f to product of q with z
q = x + y
f = q * z
# Compute the deriv
如何在PyTorch中区分矩阵?我尝试过以下几种方法,但都不起作用:
实例1:
a = torch.tensor([1., 2, 3], requires_grad=True)
b = torch.tensor([4., 5, 6], requires_grad=True)
c = a*b
c.backward()
#print(b.grad)
>>> RuntimeError: grad can be implicitly created only for scalar outputs
实例2:
a = torch.tensor([1., 2, 3], requires
我试图在pytorch中实现减法,这样我就可以在我的图形处理器上运行它,但我遇到了问题,因为pytorch.gesv给出的结果与scipy.linalg.spsolve不同。下面是我的scipy代码:
def baseline_als(y, lam, p, niter=10):
L = len(y)
D = sparse.diags([1,-2,1],[0,-1,-2], shape=(L,L-2))
w = np.ones(L)
for i in range(niter):
W = sparse.spdiags(w, 0, L, L)
Z = W + lam
我和有同样的问题。但是,我希望在每个组(或标签)中创建我的张量的产品。不幸的是,我找不到一个本机PyTorch函数来解决我的问题,就像产品的假设scatter_prod_ (和等效于scatter_add_ )一样,这是中使用的函数。
从的问题中回收示例代码,考虑2D张量:
samples = torch.Tensor([
[0.1, 0.1], #-> group / class 1
[0.2, 0.2], #-> group / class 2
[0.4, 0.4], #-> group / class 2
[0.0, 0
似乎有几种方法可以在PyTorch中创建张量的副本,包括
y = tensor.new_tensor(x) #a
y = x.clone().detach() #b
y = torch.empty_like(x).copy_(x) #c
y = torch.tensor(x) #d
根据我在执行b或d时得到的UserWarning,a和d显然更倾向于使用a。为什么它是首选的?表演?我认为它的可读性较低。
使用c的任何理由/反对
我正在计算(50500,)大小向量之间的巨大外积,发现NumPy是(多?)这样做比PyTorch更快。
以下是测试结果:
# NumPy
In [64]: a = np.arange(50500)
In [65]: b = a.copy()
In [67]: %timeit np.outer(a, b)
5.81 s ± 56.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
-------------
# PyTorch
In [73]: t1 = torch.arange(50500)
In [76]: t2
请考虑以下代码:
import torch
from torch import nn
a = torch.tensor([1.], requires_grad=True)
b = nn.Tanh()(a)
# b = nn.Linear(1,1)(a)
b *= 1
# b = b * 1
b.sum().backward()
在RuntimeError中运行代码将得到以下结果:
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation
对我来说,标签的维度应该与神经网络最后一层的维度相同,这对我来说是有直觉的。然而,通过一些使用PyTorch的实验,它以某种方式被证明是有效的。 代码: import torch
import torch.nn as nn
X = torch.tensor([[1],[2],[3],[4]], dtype=torch.float32) # training input
Y = torch.tensor([[2],[4],[6],[8]], dtype=torch.float32) # training label
model = nn.Linear(1,3)
learning_rate