3.1 – 关系拟合 (回归 Regression) 我会这次会来见证神经网络是如何通过简单的形式将一群数据用一条线条来表示. 或者说, 是如何在数据当中找到他们的关系, 然后用神经网络模型来建立一个可以代表他们关系的线条.
建立数据集 我们创建一些假数据来模拟真实的情况. 比如一个一元二次函数: y = a * x^2 b , 我们给 y 数据加上一点噪声来更加真实的展示它.
1 2 3 4 5 6 7 8 9 10 11 12 13 import torchfrom torch.autograd import Variableimport matplotlib.pyplot as pltx = torch.unsqueeze(torch.linspace(-1 , 1 , 100 ), dim=1 ) y = x.pow (2 ) 0.2 *torch.rand(x.size()) x, y = torch.autograd.Variable(x), Variable(y) plt.scatter(x.data.numpy(), y.data.numpy()) plt.show()
建立神经网络 建立一个神经网络我们可以直接运用 torch 中的体系. 先定义所有的层属性( init () ), 然后再一层层搭建( forward(x) )层于层的关系链接. 建立关系的时候, 我们会用到激励函数, 如果还不清楚激励函数用途的同学, 这里有非常好的一篇动画教程 (如下).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import torchimport torch.nn.functional as F class Net (torch.nn.Module): def __init__ (self, n_feature, n_hidden, n_output ): super (Net, self ).__init__() self .hidden = torch.nn.Linear(n_feature, n_hidden) self .predict = torch.nn.Linear(n_hidden, n_output) def forward (self, x ): x = F.relu(self .hidden(x)) x = self .predict(x) return x net = Net(n_feature=1 , n_hidden=10 , n_output=1 ) print (net) """ Net ( (hidden): Linear (1 -> 10) (predict): Linear (10 -> 1) ) """
训练网络 训练的步骤很简单, 如下:
1 2 3 4 5 6 7 8 9 10 11 12 optimizer = torch.optim.SGD(net.parameters(), lr=0.5 ) loss_func = torch.nn.MSELoss() for t in range (100 ): prediction = net(x) loss = loss_func(prediction, y) optimizer.zero_grad() loss.backward() optimizer.step()
可视化训练过程 为了可视化整个训练的过程, 更好的理解是如何训练, 我们如下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import matplotlib.pyplot as pltplt.ion() plt.show() for t in range (100 ): ... loss.backward() optimizer.step() if t % 5 == 0 : plt.cla() plt.scatter(x.data.numpy(), y.data.numpy()) plt.plot(x.data.numpy(), prediction.data.numpy(), \'r-\', lw=5) plt.text(0.5, 0, \'Loss=%.4f\' % loss.data[0], fontdict={\'size\': 20, \'color\': \'red\'}) plt.pause(0.1)
所以这也就是在我 github 代码 中的每一步的意义啦.
文章来源:莫烦