在pytorch中tensor的detach和data的区别
detach()将tensor的内容复制到新的tensor中,而data将tensor的内容复制到当前tensor中。这两种方式在修改tensor的时候,都会将原本的tensor进行修改。重点是detach在你想要进行autograd的时候就会提醒
要求导只需要做到两点:
变量.grad注意:结果为标量才可以进行求导,所以如果所求表达式结果为矩阵,那么就需要把对应矩阵的写在backward里
需要被计算梯度的变量:
import torch
from torch.autograd import Variable
#生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
a = Variable(torch.Tensor([[2,3]]),requires_grad=True)
print(a.type())
w = Variable(torch.ones(2,1),requires_grad=True)
out = torch.mm(a,w)
#括号里面的参数要传入和out维度一样的矩阵
#这个矩阵里面的元素会作为最后加权输出的权重系数
out.backward()
# out.backward()
print("gradients are:{}".format(w.grad.data))
print("gradients are:{}".format(a.grad.data))

那么就会有一种更为通用的求导方式:
Variable以及requires_grad;表达式变量.backward(对应矩阵表达)
out.backward(torch.FloatTensor([[1,1],[1,1]]))变量.grad
import torch
from torch.autograd import Variable
#生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
a = Variable(torch.Tensor([[2,3],[1,2]]),requires_grad=True)
print(a.type())
w = Variable(torch.ones(2,2),requires_grad=True)
out = torch.mm(a,w)
#括号里面的参数要传入和out维度一样的矩阵
#这个矩阵里面的元素会作为最后加权输出的权重系数
out.backward(torch.FloatTensor([[1,1],[1,1]]))
# out.backward()
print("gradients are:{}".format(w.grad.data))
print("gradients are:{}".format(a.grad.data))
