您的位置:首页 > 理论基础 > 计算机网络

深度学习 一元线性回归网络 Pytorch

2020-01-15 06:15 375 查看

深度学习 用Pytorch写一元线性回归网络

一元线性回归的求解方法有很多种,博主之所以用深度学习的方法实现主要是为了在提高自己的理解的同时给要学习的同学提供一些帮助,本人小白,请大佬路过留情,不要嘲笑。网络虽简单,但对理解数学原理,也是能起到比较好的帮助。

直接上代码,必要注释都已添加:

#从头搭建一个线性回归网络
import torch
import numpy as np
import torch.nn as nn
from torch.nn import MSELoss
import matplotlib.pyplot as plt

#定义训练数据
x = np.random.randn(256)
noise = np.random.randn(256)/4
y = 5*x+7+noise

#可以作图查看生长的离散点
plt.scatter(x,y)
plt.show()

#将训练数据转化为float32格式
x_train = x.reshape(-1,1).astype('float32')
y_train = y.reshape(-1,1).astype('float32')

#定义网络
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.linear = nn.Linear(1,1)#只需一个一元线性网络层
def forward(self,x):
y = self.linear(x)
return y

#实例化网络,定义代价函数
net = Net()

#实例化代价函数(损失函数)
criterion = MSELoss()

#定义学习率
learning_rate = 0.01

#定义训练轮数
epochs = 100

for i in range(100):
#转化为Tensor
inputs = torch.from_numpy(x_train)
labels = torch.from_numpy(y_train)

outputs = net(inputs)
#计算代价
loss_mse = criterion(outputs,labels)
#反向传播之前将梯度清零,否则pytorch会使用上次和这次计算所得梯度之和作为新的梯度
net.zero_grad()
#反向传播,计算梯度
loss_mse.backward()
#这里使用梯度下降法更新权重
for f in net.parameters():
f.data.sub_(learning_rate*f.grad.data)
#更新梯度也可以使用优化器,更加方便一些:
#from torch.optim import SGD
#optimizer = SGD(net.parameters(),lr=0.01)
#optimizer.zero_grad()
#optimizer.step()
if (i+1)%10 == 0:
print('epochs {0} of {1},loss:{2}'.format(i+1,epochs,loss_mse))
  • 点赞
  • 收藏
  • 分享
  • 文章举报
小韩不要作小白 发布了19 篇原创文章 · 获赞 0 · 访问量 1363 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: