PyTorch深度学习实践第二讲线性模型

目录

  • 监督学习四步骤
  • 线性模型
  • 泛化
  • 代码
  • 作业

监督学习四步骤

  1. DataSet(数据集)
  2. Model(模型选择和设计,例如神经网络,决策树等)
  3. Training(大部分模型都需要训练,都有些例如KNN不需要训练)
  4. Inferring(推导使用)

线性模型

假设一个学生每周花费x小时在学习上,那么他可能会在最终测验上取得y分。

x y
1 2
2 4
3 6
4 ?

PyTorch深度学习实践第二讲线性模型_第1张图片
进行猜测之后可能为

  • y ^ = x ∗ w + b \hat{y}=x * w + b y^=xw+b
  • y ^ = a ∗ x 2 + b ∗ x + c \hat{y}=a * x ^ 2 + b * x + c y^=ax2+bx+c
  • y ^ = a ∗ e b x + c \hat{y}=a * e ^ {bx} + c y^=aebx+c

经过观测后为 y ^ = x ∗ w + b \hat{y}=x * w + b y^=xw+b,简化后为 y ^ = x ∗ w \hat{y}=x * w y^=xw
我们不知道权重w是多少扫,因此需要对结果做出评估:

Train Loss (Error)
l o s s = ( y ^ − y ) 2 = ( x ∗ w − y ) 2 loss=(\hat{y} - y) ^ 2 = (x * w - y)^2 loss=(y^y)2=(xwy)2

评估模型被称之为Loss损失。
目标是找到权重w使得每个点的平均损失最小,因此:

针对样本 Train Loss (Error) l o s s = ( y ^ − y ) 2 = ( x ∗ w − y ) 2 loss=(\hat{y} - y) ^ 2 = (x * w - y)^2 loss=(y^y)2=(xwy)2
针对Training Set Mean Square Error => MSE c o s t = 1 N ∑ n = 1 N ( y n ^ − y n ) 2 cost=\frac{1}{N} \sum^{N}_{n=1} (\hat{y_n} - y_n)^2 cost=N1n=1N(yn^yn)2

泛化

当我们获得数据集时将其分为训练集和测试集,其中训练集数据是不可见的。
数据集划分
因此训练完模型之后我们可能不一定符合 ( x , y ) (x,y) (x,y)的分布,也有可能太过于符合,将噪声也学习进去造成过拟合。显然这不是我们希望看到的,我们应当希望看到我们的模型具有一定的泛化能力,也就是对于没训练过的数据也有较好的识别能力。所以我们要将训练集进行分离。
训练集划分
当在训练集上训练完后再使用开发集进行评估,使得模型具有一定的泛化能力。

代码

# @Filename: LinearModel.py
# @Time    : 2023/1/26 13:09
# @Author  : 筱翼深凉

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 = []
for w in np.arange(0.0, 4.0, 0.1):
    print('w=', w)
    loss_sum = 0
    for x_val, y_val in zip(x_data, y_data):
        y_pred_val = forward(x_val)  # 计算预测值
        loss_val = loss(x_val, y_val)  # 计算误差
        loss_sum += loss_val
        print('\t', x_val, y_val, y_pred_val, loss_val)
    print('MSE=', loss_sum / 3)
    w_list.append(w)
    mse_list.append(loss_sum / 3)
plt.plot(w_list, mse_list)
plt.xlabel('w')
plt.ylabel('LOSS')
plt.show()

作业

# @Filename: Exercise.py
# @Time    : 2023/1/26 13:36
# @Author  : 筱翼深凉
"""
    将模型更换为 y = w * x + b
"""

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
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 + b


# 计算误差
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)


W = np.arange(0, 4, 0.1)
B = np.arange(-2, 2, 0.1)
[w, b] = np.meshgrid(W, B)

loss_sum = 0
for x_val, y_val in zip(x_data, y_data):
    y_pred_val = forward(x_val)  # 计算预测值
    loss_val = loss(x_val, y_val)  # 计算误差
    loss_sum += loss_val
print('MSE=', loss_sum / 3)
MSE = loss_sum / 3

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, loss_sum / 3)
plt.show()

PyTorch深度学习实践第二讲线性模型_第2张图片

你可能感兴趣的:(AI,深度学习,pytorch)