Pytorch:函数的手动梯度计算方法

计算函数:y = x**2*e**x的导数

 

公式

y ( z ) = x 2 e x , . y(z) = x^{2}e^{x},.y(z)=x2ex,.

y ′ = 2 x e x + x 2 e x , . y^{'}= 2xe^{x}+x^{2}e^{x},.y′=2xex+x2ex,.
一般可以手动计算出导数的可导函数,可以手动求导。
学习torch,掌握tensor,autograd,Variable,nn,nn.Module,loss,optim,Dataset是关键。自动微分是深度学习得以实现的关键。下面将模拟实现函数的求导功能。

  1. 定义函数;
  2. 定义导函数。

code实现

import torch as t
from torch.autograd import Variable as V

def fn(x):
    y = x**2*t.exp(x)
    return y

def grad_fn(x):
    """手动求导"""
    dx = 2*x*t.exp(x) + x**2*t.exp(x)
    return dx

# 测试
x = V(t.randn(3,4),requires_grad=True)
y = fn(x)
# 输出求导结果
print(grad_fn(x))
"""
tensor([[ 0.1414,  0.1452, 11.5258, -0.2398],
        [ 1.0525, 10.6380,  3.0432, -0.3667],
        [-0.3050, -0.0358, -0.3827, -0.4155]], grad_fn=)
"""

# torch.autograd自动求导时,执行
y.backward(t.ones(y.size()))
print(x.grad)
"""
tensor([[ 0.1414,  0.1452, 11.5258, -0.2398],
        [ 1.0525, 10.6380,  3.0432, -0.3667],
        [-0.3050, -0.0358, -0.3827, -0.4155]])

"""

参考书:《深度学习框架PyTorch:入门与实践 》_陈云(著)

你可能感兴趣的:(Pytorch,pytorch,手动求梯度,梯度)