代码部分:
import numpy as np
import torch
import matplotlib.pyplot as plt
from torch import nn,optim
from torch.autograd import Variable
x_data=np.random.rand(100)#数组中加入在[0,1]之间均匀分布的随机样本。构建x的值
noise=np.random.normal(0,0.01,x_data.shape)#生成高斯分布的概率密度随机数
y_data=x_data*0.01+0.2+noise #构建y的值
plt.scatter(x_data,y_data)#装载数据,看看坐标系下的数据分布
plt.show() #看图
#把数据变成俩维度的
x_data=np.reshape(x_data,(-1,1))
y_data=np.reshape(y_data,(-1,1))
#把俩维度的变成一个tensor
x_data=torch.FloatTensor(x_data)
y_data=torch.FloatTensor(y_data)
#tensor变成变量
input=Variable(x_data)#表示输入
target=Variable(y_data)#表示输出
#构建神经网络的模型
class LinearRegression(nn.Module):
def __init__(self):#定义网络结构
super(LinearRegression, self).__init__()#父类的初始化
self.fc=nn.Linear(1,1)#线性回归,表示输入一个神经元,输出一个神经元,全连接层
def forward(self,x):#定义网络计算,表示前向传递,pytorch默认做了后向传递
out=self.fc(x) #表示把x值传给全连接层,返回一个y值,然后return
return out
#定义模型(实例化模型)
model=LinearRegression()
#定义代价函数(均方差二次函数)
mes_loss =nn.MSELoss()
#定义优化器(随即梯度下降法)
optimizer=optim.SGD(model.parameters(),lr=0.1)#lr表示学习率,model.parameters()表示把参数传递进优化器
#如何查看参数
for name,parameters in model.named_parameters():
print("name:{},param:{}".format(name,parameters))
for i in range(1001):#训练1001次
out=model(input) #把输入传递进去
#计算loss损失函数
loss=mes_loss(out,target) #根据输入和输出计算损失
#梯度清零
optimizer.zero_grad() #先把梯度清零,防止缓存
#计算梯度
loss.backward() #计算梯度
#修改权值
optimizer.step() #根据梯度,修改w和b的值
if i%200 == 0: #每训练200次就打印一次损失函数
print(i,loss.item())
F:\开发工具\pythonProject\tools\venv\Scripts\python.exe F:/开发工具/pythonProject/tools/bys/pychartools.py
name:fc.weight,param:Parameter containing:
tensor([[0.9746]], requires_grad=True)
name:fc.bias,param:Parameter containing:
tensor([0.2897], requires_grad=True)
Process finished with exit code 0
fc.bias表示截取和偏置,fc.weight表示斜率
结果:
0 0.8948118686676025
200 0.0001185736691695638
400 0.00010005112562794238
600 0.00010000772454077378
800 0.00010000762267736718
1000 0.00010000763722928241
初始值是0.8948118686676025,经过一次次的训练,斜率约来越小,最后变成0.00010000763722928241