文章目录
- 线性模型
- pytorch
- 使用sklearn训练
pytorch是一个基础的python的科学计算库,它有以下特点:
- 类似于numpy,但是它可以使用GPU
- 可以用它来定义深度学习模型,可以灵活的进行深度学习模型的训练和使用
线性模型
线性模型的基本形式为: f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b,线性模型的参数是w和b,它的学习是通过不断减少损失实现的,其损失一般为均方损失
pytorch代码实现:
# from tkinter import W
import numpy as np
import matplotlib.pyplot as plt
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
def forward(x):
return x*w
def loss(x,y):
y_pred=forward(x)
return (y_pred-y)*(y_pred-y)
w_list=[]
mse_list=[]
# 对于不同的w,手动模拟学习的过程
for w in np.arange(0.0,4.1,0.1):
print("w=",w)
l_sum=0# 损失值
# 一次计算MSE的过程
for x_val,y_val in zip(x_data,y_data):
# 计算预测值
y_pred_val=forward(x_val)
# 计算损失函数
loss_val=loss(x_val,y_val)
l_sum+=loss_val
print("\t",x_val,y_val,y_pred_val,loss_val)
print("MSE=",l_sum/3)
w_list.append(w)
mse_list.append(l_sum/3)
# 画图
plt.plot(w_list,mse_list)
plt.ylabel("Loss")
plt.xlabel("w")
plt.show()
结果截图:
pytorch
# 使用pytorch
import torch
import matplotlib.pyplot as plt
# 加载数据
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])
# 构造线性模型
# tensor.nn.Linear(in_features, out_features, bias=True)其中in_features表示输入的样本,out_features表示输出的样本
class LinearModule(torch.nn.Module):
def __init__(self):
super(LinearModule,self).__init__()
self.linear=torch.nn.Linear(1,1)
# 定义前馈函数
def forward(self,x):
y_pred=self.linear(x)
return y_pred
# 构造对象
model=LinearModule()
# 定义损失函数
# torch.nn.MSELoss(size_average=True, reduce=True)其中size_average是否求均值、reduce是否降维求和
criterion=torch.nn.MSELoss(size_average=False)
# 定义优化器
# SGD表示随机梯度下降
# torch.optim.SGD(params【权重参数】, lr=【学习率】, momentum=0【冲量】)
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
epoches=[]
losses=[]
# 训练
for epoch in range(1000):
# 前馈
y_pred=model(x_data)
# 计算损失函数
loss=criterion(y_pred,y_data)
print(epoch,loss.item())
# 获取数据
epoches.append(epoch)
losses.append(loss.item())
# 清零
optimizer.zero_grad()
# 反馈
loss.backward()
# 权重更新
optimizer.step()
# 输出权重和偏移量
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
# 画图
plt.plot(epoches,losses)
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.show()
# 预测值
x_test=torch.tensor([4.0])
y_test=model(x_test)
print('y_pred=',y_test.data)
部分结果截图
使用sklearn训练
# 使用sklearn训练
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
lr=LinearRegression()
x=np.array([1.0,2.0,3.0],dtype='float')
x=x.reshape(-1,1)
print(x.shape)
y=np.array([2.0,4.0,6.0],dtype='float')
y=y.reshape(-1,1)
print(y.shape)
lr.fit(x,y)
print('直线的斜率:',lr.coef_)
print('截距:',lr.intercept_)
# 画图
plt.plot(x,y,'b.')
plt.xlabel('X',fontsize=18)
plt.ylabel('Y',rotation=0,fontsize=18)
plt.plot(x,y,'r-',linewidth=2,label='predictions')
plt.legend(loc="upper left", fontsize=14)
plt.show()
训练结果截图