代码之家  ›  专栏  ›  技术社区  ›  Juan Leni

我怎样才能得到火炬中震颤图的数据?

  •  1
  • Juan Leni  · 技术社区  · 6 年前

    我有一些函数z(x,y),我想生成一个震动图(梯度的二维图)。像这样的:

    为了做到这一点,我必须在线性网格上运行渐变,并将数据调整为matplotlib.quiver所做的格式。

    一种简单的方法是在循环中向前和向后迭代:

    范围(10)中的i的
    
    对于范围(10)内的J:
    x=焊炬张量(1.*i,要求“grad=true”)。
    Y=焊炬张量(1.*j,需要_Grad=true)
    Z=X**2+Y**2
    后退()
    打印(x.grad,y.grad)
    < /代码> 
    
    

    这显然是非常低效的。有一些关于如何从x,y生成一个线性网格的例子,但是我以后需要把网格改回正向公式的格式,得到梯度向量,然后把它们放回去,等等。

    numpy中的一个简单例子是:

    导入matplotlib.pyplot as plt n=25 x_范围=np.linspace(-25,25,n) y_范围=np.linspace(-25,25,n) x,y=np.网格(x_范围,y_范围) Z= x** 2 +y** 2 u,v=2×x,2*y PLT.震动(x,y,u,v,z,alpha=.9) < /代码>

    使用pytorch的标准方法是什么?有一些简单的例子吗?

    为了做到这一点,我必须在线性网格上运行渐变,并将数据调整为matplotlib.quiver所做的格式。

    一种简单的方法是在循环中向前和向后迭代:

    for i in range(10):
        for j in range(10):
            x = torch.tensor(1. * i, requires_grad=True)
            y = torch.tensor(1. * j, requires_grad=True)
            z = x ** 2 + y ** 2
            z.backward()
            print(x.grad, y.grad)
    

    这显然是非常低效的。有一些关于如何从x,y生成一个线性网格的例子,但是我以后需要把网格改回正向公式的格式,得到梯度向量并把它们放回去,等等。

    numpy中的一个简单例子是:

    import matplotlib.pyplot as plt
    n = 25
    x_range = np.linspace(-25, 25, n)
    y_range = np.linspace(-25, 25, n)
    X, Y = np.meshgrid(x_range, y_range)
    Z = X**2 + Y**2
    U, V = 2*X, 2*Y
    plt.quiver(X, Y, U, V, Z, alpha=.9)
    

    使用pytorch的标准方法是什么?有一些简单的例子吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   iacolippo    6 年前

    您可以通过传递 torch.tensor s of ones来计算非标量的梯度。

    导入matplotlib.pyplot as plt 进口火炬 #创建网格网格 n=25 A=火炬林空间(-25,25,N) B=焊炬。林空间(-25,25,N) X = A重复(n) y=b.重复(n,1).t().连续().视图(-1) x.要求_Grad=真 Y.要求_Grad=真 Z= x** 2 +y** 2 #这条线将计算梯度 Torch.Signed.Backward([Z],[Torch.ones(x.size()),Torch.ones(y.size())]) #分离到绘图 plt.quiver(x.detach(),y.detach(),x.grad,y.grad,z.detach(),alpha=0.9) 显示() < /代码>

    如果需要重复执行此操作,则需要将渐变归零(set x.grad=y.grad=none. )。

    quiverplot

    如果需要重复进行此操作,则需要将渐变归零(设置 x.grad = y.grad = None )