PyTorch笔记

2019-07-22

与tensorflow的对比

tensorflow中,需要先定义静态的计算图,每次执行时,只有输入的数据不同,而计算图相同; 而pytorch中,每次执行都需要重新定义动态的计算图。
静态图的好处是可以事先最优化图的结构或定义好计算结点的分布。坏处是面对一些结构与数据相关的模型比较麻烦。比如RNN的长度可能随样本长度而动态地改变,这需要通过for循环实现,在tensorflow中,for循环需要嵌入到图中,成为图的一个子结构;但在pytorch中,只需要用普通的for循环来处理。

自定义autograd.Function

相当于自定义一种新的计算图节点类型,在backprop时可以自动完成梯度的传递。

定义

class MyAutoGrad(torch.autograd.Function):
    @staticmethod
    def forward(ctx,input):
        """
            根据输入input计算输出output,ctx是一个context对象,可用于存储backward需要的信息
        """
        ctx.save_for_backward(input)
        return output
    @staticmethod
    def backward(ctx,grad_output):
        """
            该函数根据输出的梯度grad_output计算输入的梯度grad_input
        """
        input,=ctx.saved_tensors
        """
            计算input的梯度grad_input
        """
        return grad_input

调用

func=MyAutoGrad.apply
"""
    输入input
"""
pred=func(input)
"""
    计算loss
"""
loss.backward()   # 自动计算梯度
input

如何避免梯度的追踪

用梯度更新参数时必须关闭梯度的追踪

a.
with torch.no_grad():
    更新tensor
b.
通过tensor.data更新

nn package

包含了常用的神经网络结构,损失函数等

nn.Module

相当于将若干个节点组合成一个可复用的模块,同时可能包含可学习的参数,可通过继承该类实现自定义。

实例

(括号里是常用的参数,不代表所有参数)

nn.Sequential(m1,m2,...) 顺次连接若干个层
nn.Linear(d_in,d_out) 全连接层
nn.ReLU() ReLu激活函数

成员

Module.parameters() 包含了所有参数,可迭代

损失函数

nn.MSELoss(reduction='sum') 最小平方误差损失(注意是个类)

optim package

包含了常见的最优化算法,封装了参数更新等过程

torch.matmul

对于高维的张量,执行batched matrix multiplication