一、回归任务介绍:
拟合一个二元函数 y = x ^ 2.
二、步骤:
- 导入包
- 创建数据
- 构建网络
- 设置优化器和损失函数
- 前向和后向传播训练网络
- 画图
三、代码:
导入包:
import torch from torch.autograd import Variable import torch.nn.functional as F import matplotlib.pyplot as plt
创建数据
#torch中的数据要是二维的,unsqueeze是将一维数据转化成二维数据 tmp = torch.linspace(-1,1,100) x = torch.unsqueeze(tmp,dim=1) y = x.pow(2) + 0.2*torch.rand(x.size()) print(tmp) #torch.Size([100]) print(x) #torch.Size([100, 1])
#转成向量
x,y = Variable(x),Variable(y)
查看数据图像:
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
构建网络
#Net类继承了Module这个模块 class Net(torch.nn.Module): def __init__(self,n_feature,n_hidden,n_output): #在搭建模型之前需要继承的一些信息,super表示继承nn.Module的信息,此步骤必须有 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(1,10,1) plt.ion() plt.show() #可以看到搭建的图流程 print(net)
打印的结果:
设置优化器和损失函数
optimizer = torch.optim.SGD(net.parameters(),lr = 0.5) #传入网络的参数来优化它们 loss_func = torch.nn.MSELoss()
前向和后向传播训练网络
for t in range(100): #forward prediction = net(x) loss = loss_func(prediction,y) #预测值pre在前,实际值y在后,不然结果会不一样 #backward() optimizer.zero_grad() #梯度全部设为0 loss.backward() #loss计算参数的梯度 optimizer.step() #采用优化器以lr=0.5来优化梯度 ###########################以下为可视化过程################################## 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) plt.ioff() plt.show()
训练结果:
第一次:
最后一次: