PyTorch: 定制化nn模块

译者:@yongjay13@speedmancs

校对者:@bringtree

本例中的全连接神经网络有一个隐藏层, 后接ReLU激活层, 并且不带偏置参数. 训练时通过最小化欧式距离的平方, 来学习从x到y的映射.

在实现中我们将定义一个定制化的模块子类. 如果已有模块串起来不能满足你的复杂需求, 那么你就能以这种方式来定义自己的模块。

  1. import torch
  2. from torch.autograd import Variable
  3. class TwoLayerNet(torch.nn.Module):
  4. def __init__(self, D_in, H, D_out):
  5. """
  6. 在构造函数中,我们实例化两个nn.Linear模块并将它们分配为成员变量.
  7. """
  8. super(TwoLayerNet, self).__init__()
  9. self.linear1 = torch.nn.Linear(D_in, H)
  10. self.linear2 = torch.nn.Linear(H, D_out)
  11. def forward(self, x):
  12. """
  13. 在forward函数中,我们接受一个变量的输入数据,我们必须返回一个变量的输出数据.
  14. 我们可以使用构造函数中定义的模块以及变量上的任意运算符.
  15. """
  16. h_relu = self.linear1(x).clamp(min=0)
  17. y_pred = self.linear2(h_relu)
  18. return y_pred
  19. # N 批量大小; D_in是输入尺寸;
  20. # H是隐藏尺寸; D_out是输出尺寸.
  21. N, D_in, H, D_out = 64, 1000, 100, 10
  22. # 创建随机张量来保存输入和输出,并将它们包装在变量中.
  23. x = Variable(torch.randn(N, D_in))
  24. y = Variable(torch.randn(N, D_out), requires_grad=False)
  25. # 通过实例化上面定义的类来构建我们的模型
  26. model = TwoLayerNet(D_in, H, D_out)
  27. # 构建我们的损失函数和优化器.
  28. # 对SGD构造函数中的model.parameters()的调用将包含作为模型成员的两个nn.Linear模块的可学习参数.
  29. criterion = torch.nn.MSELoss(size_average=False)
  30. optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
  31. for t in range(500):
  32. # 正向传递:通过将x传递给模型来计算预测的y
  33. y_pred = model(x)
  34. # 计算和打印损失
  35. loss = criterion(y_pred, y)
  36. print(t, loss.data[0])
  37. # 梯度置零, 执行反向传递并更新权重.
  38. optimizer.zero_grad()
  39. loss.backward()
  40. optimizer.step()