Pytorch学习笔记(一)

Pytorch学习笔记(一)

标签 : pytorch


tensor

x = torh.Tensor(2, 3) #生成一个2*3的tensor

Variable

位于pytorch.autograd中,有data(Tensor类型),gradgrad_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