Pytorch学习笔记(一)
标签 : pytorch
tensor
x = torh.Tensor(2, 3) #生成一个2*3的tensor
Variable
位于pytorch.autograd
中,有data
(Tensor类型),grad
,grad_fn
等属性
#####只有在需要时才使用Variable类型,否则使用numpy或tensor
Function
重写function需要实现forward()
与backward()
,下面给出
class LinearFunction(Function):
# forward 和 backward 都是 静态方法
@staticmethod
# bias 是个可选参数,有个 默认值 None
# ctx 参数必选,用于保存上下文供backward使用
def forward(ctx, input, weight, bias=None):
# input,weight 都是 Tensor
ctx.save_for_backward(input, weight, bias)
output = input.mm(weight.t())
if bias is not None:
output += bias.unsqueeze(0).expand_as(output)
return output
# 返回Tensor
# 由于 forward 只有一个返回值,所以 backward 只需要一个参数接收梯度。
@staticmethod
def backward(ctx, grad_output):
# grad_output 是 Variable 类型。
# 在开头的地方将保存的 tensor 给 unpack 了
# 然后给所有应该返回的梯度以 None 初始化。
# saved_variables 返回的是 Variable!!!
input, weight, bias = ctx.saved_variables
grad_input = grad_weight = grad_bias = None
# needs_input_grad 检查是可选的
# 返回值的个数需要和 forward 形参的个数(不包含 ctx)一致
if ctx.needs_input_grad[0]:
grad_input = grad_output.mm(weight)
if ctx.needs_input_grad[1]:
grad_weight = grad_output.t().mm(input)
if bias is not None and ctx.needs_input_grad[2]:
grad_bias = grad_output.sum(0).squeeze(0)
# 梯度的顺序和 forward 形参的顺序要对应。
return grad_input, grad_weight, grad_bias