美文网首页
pytorch特性 | 自动求导

pytorch特性 | 自动求导

作者: yuanCruise | 来源:发表于2020-01-11 12:27 被阅读0次
传染源:requires_grad

pytorch中最重要的数据结构:tensor。每个tensor有一个很重要的属性requires_grad,该属性决定了在神经网络的迭代过程中,当前tensor是否需要计算梯度,而且该属性是会传染的,只要某个tensor的requires_grad为True,则任何由该tesnor派生出来的任何tensor的requires_grad属性都会变成True。(除非有特殊处理)

import torch

x = torch.ones(2,2,requires_grad=True)
print(x,x.requires_grad)

y = torch.randn_like(x)
print(y,y.requires_grad)

z = x + y
print(z,z.requires_grad)

------------------out:
tensor([[1., 1.],
        [1., 1.]], requires_grad=True) True
tensor([[ 0.9801,  0.6068],
        [-0.8965,  1.4186]]) False
tensor([[1.9801, 1.6068],
        [0.1035, 2.4186]], grad_fn=<ThAddBackward>) True
身份标识(轨迹图):grad_fn

既然前面吧requires_grad称为传染源,那么在pytorch的tensor中还有一个标识:grad_fn,该标识用于标记在requires_grad为True的情况下,当前tensor是通过什么操作得到的。最终将所有的身份标识组合起来就可以得到当前tensor的轨迹图。

import torch
import torch.nn as nn

x = torch.ones(2,2,requires_grad=True)
print(x,x.requires_grad)

y = torch.randn_like(x)
print(y,y.requires_grad)

z = x + y
print(z,z.requires_grad)

m = z*z
print(m)

m = m.view([2,2,1,1])
print(m)

conv = nn.Conv2d(2,2,1)
n = conv(m)
print(n)
--------------------out:
tensor([[1., 1.],
        [1., 1.]], requires_grad=True) True
tensor([[-0.6495,  0.6366],
        [-0.4593, -1.5528]]) False
tensor(..., grad_fn=<ThAddBackward>) True
tensor(..., grad_fn=<ThMulBackward>)
tensor(..., grad_fn=<ViewBackward>)
tensor(..., grad_fn=<ThnnConv2DBackward>)
毁“尸”灭迹:detach

若对某个tensor使用detach方法,则该tensor的requires_gard,将会变为false,从而该变量的身份标识(grad_fn)也就被抹掉了。

import torch
import torch.nn as nn

x = torch.ones(2,2,requires_grad=True)
print(x,x.requires_grad)

y = torch.randn_like(x)
print(y,y.requires_grad)

z = x + y
print(z,z.requires_grad)

m = z*z
print(m)

m = m.detach()

p = m.view([2,2,1,1])
print(p)

conv = nn.Conv2d(2,2,1)
n = conv(p)
print(n)
----------------------out:
tensor([[1., 1.],
        [1., 1.]], requires_grad=True) True
tensor([[-1.2428,  0.2750],
        [ 1.0678, -0.7844]]) False
tensor([[-0.2428,  1.2750],
        [ 2.0678,  0.2156]], grad_fn=<ThAddBackward>) True
tensor([[0.0590, 1.6255],
        [4.2759, 0.0465]], grad_fn=<ThMulBackward>)
tensor([[[[0.0590]],

         [[1.6255]]],


        [[[4.2759]],

         [[0.0465]]]])  False
tensor(..., grad_fn=<ThnnConv2DBackward>)

相关文章

网友评论

      本文标题:pytorch特性 | 自动求导

      本文链接:https://www.haomeiwen.com/subject/eicvactx.html