一、什么是线性回归?
要知道回归问题的输出是一个连续值,与分类的离散值不同,回归问题常见于现实的很多方面,例如比较知名的房屋价格预测等。线性回归的基本要素主要分为特征值和目标值,例如以房屋价格预测这个问题,最终的价格取决于房屋状况,地段,市场等。如果我们将房屋状况,地段,市场这3个要素分别设为x1,x2,x3,那么最终的房屋价格(y)表达式:
其中w1,w2,w3分别为房屋状况,地段,市场的权重值(weight),b为偏差值(bias)。
二、代码示例:
本次示例为手写数据集,主要是为了表达出线性回归的效果。
建议开始学习之前,对pytorch的相关函数的功能有些了解,虽然本文已全部注释相关代码的功能。
1.导入相关包(已经注明相关包的功能及作用)
import torch #pytorch
import torch.nn.functional as F #激励函数
import matplotlib.pyplot as plt #可视化
2.手写数据集(可自己随机定义)
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1) #在[-1,1]区间内随机生成100个数,并按列排序
y=x.pow(2)+0.2*torch.rand(x.size()) #0.2*torch.rand(x.size())此操作主要是为了增加噪点,更加贴近真实数据
输出结果:x和y的数据集大小均为 100 x 1 的张量
3.建立神经网络
class Net(torch.nn.Module): #继承torch的Module
def __init__(self,feature,n_hiddens,output): #可自定义初始化变量
super(Net,self).__init__()
self.hidden=torch.nn.Linear(feature,n_hiddens) #隐藏层
self.predict=torch.nn.Linear(n_hiddens,output) #输出层
def forward(self,data): #Module 中的 forward 功能
data=F.relu(self.hidden(data)) # 激励函数(隐藏层的线性值)
data=self.predict(data) # 输出值
return data
net=Net(feature=1,n_hiddens=10,output=1) #实例化
print(net) #查看net结构
"""
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
"""
可以看见整个net结构,是由1个特征值映射到10层隐藏层中,再由10层隐藏层映射到1个目标值
4.训练网络
optimizer=torch.optim.SGD(net.parameters(),lr=0.2) #优化函数,传入net的所有参数,学习率设定为0.2
loss_func=torch.nn.MSELoss() #误差计算公式(本次采用均方差)
#plt.ion()
#plt.show()
#训练过程
for t in range(100):
prediction=net(x) #给net传入特征向量,此处会调用forward,输出预测值
loss=loss_func(prediction,y) #计算预测值和真实值的误差
optimizer.zero_grad() #清空上一步的残余更新值
loss.backward() #反向传播,计算参数更新值(简单的说就是梯度迭代)
optimizer.step() #将更新的值给到net的parameters()
#可视化整个训练过程,感兴趣可留言
#if t % 5 == 0:
#plt.cla()
#print(prediction)
#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.numpy(), fontdict={'size': 20, 'color': 'red'})
#plt.pause(0.1)
训练结果:
三.结语
本文的线性回归是基于pytorch的简洁实现,核心代码函数都已经被封装好了,具体想知道线性回归是如何从零开始实现,其中的核心函数是如何实现的,请参考我的另一篇博文。
线性回归的底层原理:https://blog.csdn.net/qq_37767529/article/details/123738113
本文全部代码:https://github.com/SallBryant/Nerual-Net-Simple-example/blob/main/Linear-simple.ipynb
分享自己所学的知识,向开源分享的人学习,他们是榜样,为大家学习知识降低了门槛。花时间来创作博客的动力来源于莫凡大佬的传教!链接:https://mofanpy.com/tutorials/machine-learning/torch/regression/