原文关系拟合 (回归) - PyTorch 莫烦Python (mofanpy.com)
定义数据点集
1 2
| x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1) y=x.pow(2)+0.2*torch.rand(x.size())
|
注:
1 2
| torch.linspace(start,end,step)构造等差数列 torch.unsqueeze()升维
|
x是(-1,1)区间内的100个等差数,y=x^2,外加了一些随机噪声
定义网络结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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)
|
注:
init是固定格式,不可修改,可以传参
forward是前向传播,函数名不可修改
输入是一个x,输出是一个预测值y,所以输入输出维度都是1
relu是激活函数,用于把多个线性单元转为非线性映射
定义优化器和损失函数
optimizer=torch.optim.SGD(net.parameters(),lr=0.5)
loss_func=torch.nn.MSELoss()#均方差,用在回归问题
注:
SGD是一种优化算法
net.parameters()是网络的所有参数,固定写法
lr是learning rate学习率
MSELOSS是均方差mean square error loss,适合用于计算回归问题的误差
训练
1 2 3 4 5 6 7
| 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 20
| plt.ion() plt.show()
for t in range(100): prediction=net(x) loss=loss_func(prediction,y)
optimizer.zero_grad() 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,fontdict={'size':20,'color':'red'}) plt.pause(0.1)
plt.ioff() plt.show()
|
每隔5次训练就画一下预测曲线,实时打印在画布
源代码
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import torch import torch.nn.functional as F import matplotlib.pyplot as plt
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)
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1) y=x.pow(2)+0.2*torch.rand(x.size())
optimizer=torch.optim.SGD(net.parameters(),lr=0.5) loss_func=torch.nn.MSELoss()
plt.ion() plt.show()
for t in range(80): prediction=net(x) loss=loss_func(prediction,y)
optimizer.zero_grad() 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,fontdict={'size':20,'color':'red'}) plt.pause(0.1)
plt.ioff() plt.show()
|