机器学习 PyTorch
在大多数情况下,基本都是以类的形式实现神经网络。
大多数情况下创建一个继承自 Pytorch 中的 nn.Module 的类,这样可以使用 Pytorch 提供的许多高级 API,而无需自己实现。
下面展示了一个可以从nn.Module创建的最简单的神经网络类的示例。基于 nn.Module的类的最低要求是覆盖__init__()方法和forward()方法。
在这个类中,定义了一个简单的线性网络,具有两个输入和一个输出,并使用 Sigmoid()函数作为网络的激活函数。

  1. import torch
  2. from torch import nn
  3. class LinearRegression(nn.Module):
  4. def __init__(self):
  5. #继承父类构造函数
  6. super(LinearRegression, self).__init__()
  7. #输入和输出的维度都是1
  8. self.linear = nn.Linear(1, 1)
  9. def forward(self, x):
  10. out = self.linear(x)
  11. return out

现在测试一下模型。

  1. # 创建LinearRegression()的实例
  2. model = LinearRegression()
  3. print(model)
  4. # 输出如下
  5. LinearRegression(
  6. (linear): Linear(in_features=1, out_features=1, bias=True)
  7. )

现在让定义一个损失函数和优化函数。

  1. model = LinearRegression()#实例化对象
  2. num_epochs = 1000#迭代次数
  3. learning_rate = 1e-2#学习率0.01
  4. Loss = torch.nn.MSELoss()#损失函数
  5. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)#优化函数

创建一个由方程产生的数据集,并通过函数制造噪音

  1. import torch
  2. from matplotlib import pyplot as plt
  3. from torch.autograd import Variable
  4. from torch import nn
  5. # 创建数据集 unsqueeze 相当于
  6. x = Variable(torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1))
  7. y = Variable(x * 2 + 0.2 + torch.rand(x.size()))
  8. plt.scatter(x.data.numpy(),y.data.numpy())
  9. plt.show()

image.png
关于torch.unsqueeze函数解读。

  1. >>> x = torch.tensor([1, 2, 3, 4])
  2. >>> torch.unsqueeze(x, 0)
  3. tensor([[ 1, 2, 3, 4]])
  4. >>> torch.unsqueeze(x, 1)
  5. tensor([[ 1],
  6. [ 2],
  7. [ 3],
  8. [ 4]])

遍历每次epoch,计算出loss,反向传播计算梯度,不断的更新梯度,使用梯度下降进行优化。

  1. for epoch in range(num_epochs):
  2. # 预测
  3. y_pred= model(x)
  4. # 计算loss
  5. loss = Loss(y_pred, y)
  6. #清空上一步参数值
  7. optimizer.zero_grad()
  8. #反向传播
  9. loss.backward()
  10. #更新参数
  11. optimizer.step()
  12. if epoch % 200 == 0:
  13. print("[{}/{}] loss:{:.4f}".format(epoch+1, num_epochs, loss))
  14. plt.scatter(x.data.numpy(), y.data.numpy())
  15. plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-',lw=5)
  16. plt.text(0.5, 0,'Loss=%.4f' % loss.data.item(), fontdict={'size': 20, 'color': 'red'})
  17. plt.show()
  1. ####结果如下####
  2. [1/1000] loss:4.2052
  3. [201/1000] loss:0.2690
  4. [401/1000] loss:0.0925
  5. [601/1000] loss:0.0810
  6. [801/1000] loss:0.0802

image.png

  1. [w, b] = model.parameters()
  2. print(w,b)
  3. # Parameter containing:
  4. tensor([[2.0036]], requires_grad=True) Parameter containing:
  5. tensor([0.7006], requires_grad=True)

这里的b=0.7,等于0.2 + torch.rand(x.size()),经过大量的训练torch.rand()一般约等于0.5。

附录-代码文件

PytorchSample.ipynb