pytorch学习(一)线性模型

时间:2024-01-23 19:40:41

文章目录

    • 线性模型
    • 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()

训练结果截图
在这里插入图片描述