赞
踩
本文利用神经网络实现对一元线性回归问题的求解。
直接上代码,必要注释都已添加:
#从头搭建一个线性回归网络 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))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。