深度学习除了可以完成分类任务,还可以完成回归性质类的预测任务,下面将用实际例子来讲述
import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch.autograd import Variable
# 定义决策变量 x
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
# 定义响应变量 y
y = x.pow(3)+0.1*torch.randn(x.size())
# 将响应变量 y 和 决策变量 x 进行 tensor 化
x , y =(Variable(x),Variable(y))
print(x)
print(y)
class Net(nn.Module):
def __init__(self,n_input,n_hidden,n_output):
super(Net,self).__init__()
# 定义全连接层 1
self.hidden1 = nn.Linear(n_input,n_hidden)
# 定义全连接层 2
self.hidden2 = nn.Linear(n_hidden,n_hidden)
# 定义输出层 (输出预测结果的 layer)
self.predict = nn.Linear(n_hidden,n_output)
# 神经网络的结构通常是一层线性函数(linear)加一层非线性函数(relu,sigmoid,tanh),否则相当于只有一层
def forward(self,input):
# 定义执行函数
## 执行第一个隐含层
out = self.hidden1(input)
## 第一个隐含层结束后加一个非线性函数 relu()
out = F.relu(out)
## 执行第二个隐含层
out = self.hidden2(out)
## 第二个隐含层结束后加一个非线性函数 sigmoid()
out = F.sigmoid(out)
## 预测层, 输出预测的响应变量值
out = self.predict(out)
return out
# 初始化模型参数
net = Net(1,20,1)
print(net)
# 定义优化器
optimizer = torch.optim.SGD(net.parameters(),lr = 0.1)
# 定义损失函数
loss_func = torch.nn.MSELoss()
plt.ion()
plt.show()
for t in range(5000):
# 训练模型
prediction = net(x)
# 计算损失函数
loss = loss_func(prediction,y)
# 梯度清零
optimizer.zero_grad()
# 反向传播
loss.backward()
# 优化迭代
optimizer.step()
# 每训练1000次, 画一次图
if t % 1000 ==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.05)
plt.ioff()
plt.show()
其中决策变量 x 为:
![](https://img.haomeiwen.com/i19396348/9d34c989be4d640c.png)
其中响应变量 y 为:
![](https://img.haomeiwen.com/i19396348/a4be65e64ac79042.png)
训练的效果:
![](https://img.haomeiwen.com/i19396348/8f96608864a350dc.png)
![](https://img.haomeiwen.com/i19396348/d3d552a862960283.png)
![](https://img.haomeiwen.com/i19396348/bd99b7a7c9d215f9.png)
![](https://img.haomeiwen.com/i19396348/434b4f39c4e00b02.png)
训练完毕以后经过模型预测的响应变量 y:
![](https://img.haomeiwen.com/i19396348/c88025f7b7fd9f9c.png)
利用深度学习进行回归任务学习的好处是我们并不需要事先先假设一个回归模型,用于估计回归的参数
而是让模型去学习数据特征,不断迭代,生成最优化的权重参数,从而得到最fit的模型
然后通过新的决策变量,利用训练好的模型预测对应的响应变量
网友评论