本文利用神经网络实现对一元线性回归问题的求解。
直接上代码,必要注释都已添加:
#从头搭建一个线性回归网络
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))