前面文章中,为了更好的理解神经网络模型,使用Numpy手写了一个两层的神经网络模型,但如果网络层数增多,激活函数变得复杂的情况下,这种硬解的方式会非常麻烦。

可喜的是,Pytorch给我们提供了自动求导(Autograd)的功能,可以在计算损失后,自动反向传播求导。

代码示例

import torch

N, D_in, H, D_out = 64, 1000, 100, 10

x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

w1 = torch.randn(D_in, H, requires_grad=True)
w2 = torch.randn(H, D_out, requires_grad=True)

lr = 1e-6

for i in range(500):
    # clamp(min, max) 快速构建分段函数
    y_hat = x.mm(w1).clamp(min=0).mm(w2)
    
    # 定义损失函数
    loss = (y_hat - y).pow(2).sum()
    print(i, loss.item())
    # 反向传播,自动求导
    loss.backward()
    # print(w1.grad)
    # print(w2.grad)

    # 这一步不需要求导
    with torch.no_grad():
        w1 -= lr * w1.grad
        w2 -= lr * w2.grad

        # 更新权重参数后,将梯度归零
        w1.grad.zero_()
        w2.grad.zero_()

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/read/308