torch.autograd.grad()函数使用

torch.autograd.grad()函数使用

import torch
# x = torch.FloatTensor([[0,1,2,3],[1,2,3,4],[2,3,4,5]]).requires_grad_(True)
# print(x)
x = torch.tensor([[0.,1.,2.,3.],[1.,2.,3.,4.],[2.,3.,4.,5.]]).requires_grad_(True)
# print(x)
'''
tensor([[0., 1., 2., 3.],
        [1., 2., 3., 4.],
        [2., 3., 4., 5.]], requires_grad=True)
'''
y = x ** 2 + x
# print(y)
'''
tensor([[ 0.,  2.,  6., 12.],
        [ 2.,  6., 12., 20.],
        [ 6., 12., 20., 30.]], grad_fn=)
'''
weight = torch.ones(y.size()).requires_grad_(True)
# print(weight)
'''
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]], requires_grad=True)
'''
# 求y对x的一阶导数
dydx1 = torch.autograd.grad(outputs=y,
                            inputs=x,
                            grad_outputs=weight,
                            retain_graph=True,
                            create_graph=True,
                            only_inputs=True)
# print(dydx)
'''
(tensor([[ 1.,  3.,  5.,  7.],
        [ 3.,  5.,  7.,  9.],
        [ 5.,  7.,  9., 11.]], grad_fn=),)
'''
dydx2 = torch.autograd.grad(outputs=dydx1,
                            inputs=x,
                            grad_outputs=weight,
                            retain_graph=True,
                            create_graph=True,
                            only_inputs=True)
# print(dydx2)
'''
(tensor([[2., 2., 2., 2.],
        [2., 2., 2., 2.],
        [2., 2., 2., 2.]], grad_fn=),)
'''

# 当输出是一个标量的时候,不需要规定输出权重
# 令z等于所有x元素相加
z = torch.sum(x)
# print(z)
# tensor(30., grad_fn=)
dzdx = torch.autograd.grad(outputs=z,
                            inputs=x,
                            retain_graph=True,
                            create_graph=True,
                            only_inputs=True)
print(dzdx)
'''
(tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]),)

'''

你可能感兴趣的:(一点一滴深度学习,深度学习)