深度学习实践学习1——线性模型

感谢 b 站 up:刘二大人
视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=4&spm_id_from=pageDriver&vd_source=2314316d319741d0a2bc13b4ca76fae6

线性模型

所有监督学习的模型,在做 Traning 的过程中,需要三个步骤:

  1. 准备数据集 Dataset;
  2. 模型 Model 选择设计;【根据 Dataset 情况来决定】
  3. 训练 Training;【最简单就是人工 Training 】
  4. 确定 Model 里的权重,就可以做推理 inferring 工作【拿数据——得结果】

问题

在这里插入图片描述
在这里插入图片描述
监督学习:训练时知道输出值是多少,这样可以根据模型计算的值与输出值之间的差异对模型进行调整。
【测试集的数据在 Training 时是不能看的,因为测试集的数据是用来判断模型是否有好的泛化能力。测试集的 y 实际上在 Dataset 中是已知的,但不能告诉这个 Model ,只能拿 Model 算出的结果和已知的测试集的结果进行比对,然后根据正确的比例,计算相应指标来判断 Model 是优是劣】

1.数据集

实际上 Dataset 一般要分为两个部分:,一部分是 Training集,一部分是测试集
在这里插入图片描述
在训练集上,因为数据量级无法完全接近表示真实分布,所以如果训练集训练的非常好,会造成ML中核心的问题:过拟合。
希望模型有很好的泛化能力,为了测试模型的泛化能力通常会把训练集再分为两份:1.训练集;2.开发集【验证集:模型评估】

2.模型

所谓模型就是找到一个函数 y = f(x),f(x)的形式很多,每一种选择就是一个模型。【一般来说,在很多ML任务里,最常见的思路是先用一个线性模型来看看,是否有效,后面如果模型不好,再更换。】
在这里插入图片描述
现在的问题是:w 和 b 的值取多少?这就是训练所追求的目标。
先对模型进行一个简化:
在这里插入图片描述
此时问题就是找 w。
一般会随机猜一个权重,可大可小,接下来就是评估——取定权值,它所表示的模型与数据集里的数据之间偏移程度有多大(误差有多大)
最常见的就是计算y_hat - y(预测值-数据值)每个样本的平方和/绝对值【越小越好】
这个评估模型再ML中叫:loss损失函数
在这里插入图片描述
【注意,这是针对一个样本的loss,一般求平均平均loss,降到越低越好】
而对于整个训练集而言:MSE 均方误差
在这里插入图片描述
在找最优权重时,哪些值做为权重的候选,用穷举思路,比如:经过测试发现权重在0-4之间可能存在损失最小的权重,【因为不能把实数域的所有数全取出来,所以只是在里面采样】

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 = [] # 因为对权值w要取多个
mse_list = [] # 所以把权重和权重对应的损失值保存到列表,所以先准备两个空列表
for w  in np.arange(0.0, 4.1, 0.1): # w权重采样,间隔0.1,生成序列
    print('w=',w)
    l_sum = 0
    for x_val, y-val in zip(x_data, y_data): # 把数据集的数据用zip拼成这次数据样本的x,y
        y_pred_val = forward(x_val) # 这里是为了打印,也可不写,因为loss中求解了
        loss_val = loss(x_val, y_val)
        l_sum += loss_val # 将给定权重w下的所有样本的loss求和,后面打印时除以样本总数转成MSE
        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()

在这里插入图片描述
在这里插入图片描述
在DL训练时,表里横坐标一般不是权重,而是训练的轮数(Epoc),因为在DL中很难判定结果什么时候收敛,一般测试集随epoc下降到平滑,而开发集随epoc先下降到某个点又上升,这个点就是最优的。

在这里插入图片描述
【训练的时间很长,需要通过打印日志或绘图来实时掌握训练情况】
visdom库可以实时绘图【学习】

课后作业

如果在x*w+b模型下,
在这里插入图片描述
提示:w 和 b两参数,loss函数在 w 和 b 构成的平面上进行取值;
绘制曲面图 去看 np.meshgrid()函数
1.用 meshgrid 画图

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 + b

def loss(x, y): # 定义损失函数
    y_pred = forward(x) # 预测值
    return (y_pred - y) * (y_pred - y) # 误差的平方

w_list = [] # 因为对权重w要取好多个
b_list = []
mse_list = [] # 所以把权重和权重对应的损失值保存到列表,所以要先准备两个空列表
for w in np.arange(0.0, 4.1, 0.1): #w权重采样,间隔为0.1,生成序列
    print('w=', w)
    for b in np.arange(0.0, 4.1, 0.1):
        print('b=', b)
        l_sum = 0
        for x_val, y_val in zip(x_data, y_data):#把数据集的数据用zip拼成这次数据样本的x,y
            y_pred_val = forward(x_val) # 这里是为了打印,也可以不写,因为下面loss中求解了
            loss_val = loss(x_val, y_val)
            l_sum += loss_val # 将给定权重w下的所有样本的loss求和,后面打印时除以样本总数转成MSE
        print('\t', x_val, y_val, y_pred_val, loss_val)
        print('MSE=', l_sum / 3) # MSE
        w_list.append(w)
        b_list.append(b)
        mse_list.append(l_sum / 3)# MSE
print(mse_list)

w_list_mesh, b_list_mesh = np.meshgrid(np.arange(0.0, 4.1, 0.1),np.arange(0.0, 4.1, 0.1),indexing='ij')
mse_list_mesh = (np.array(mse_list)).reshape(41, 41)
print('w',np.shape(w_list_mesh), 'b', np.shape(b_list_mesh), 'mse', np.shape(mse_list_mesh))

fig = plt.figure(figsize=plt.figaspect(0.5))  # 不能直接用pyplot的plot方法画三维图,要先创建一个figure
ax = fig.add_subplot(1, 2, 1, projection='3d')  # 然后对figure添加用于作图的窗口
ax.scatter(w_list, b_list, mse_list)
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('mse')
ax.set_title('Loss(scatter)')
ax = fig.add_subplot(1, 2, 2, projection='3d')  # 然后对figure添加用于作图的窗口
ax.scatter(w_list, b_list, mse_list)
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('mse')
ax.set_title('Loss(wireframe)')
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41175681/article/details/128944183