B站视频课《PyTorch深度学习实践》笔记-第2讲-线性模型Linear Model

视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys

【更新课件下载链接】-2020.11.03
链接:https://pan.baidu.com/s/1vZ27gKp8Pl-qICn_p2PaSw
提取码:cxe4

欢迎大家一起交流学习!

Machine learing

Supervised Learning:

训练集

(训练集)

训练集

(开发集)

 测试集             

在训练集上,因为我们的数据量级无法完全的接近真实的分布,所以如果我们在训练集上训练的非常好,它会造成我们在机器学习里面所遇到的一个核心问题:过拟合

过拟合就是说我们在训练集上的误差很小,但是有可能在训练集上学习的时候把噪声也学进来了,所以我们希望我们的模型有一个较好的泛化能力

泛化能力就是说你在训练集上训练完成后,它对于没见过的图像也能够进行正确的识别。

所以,为了测试模型的泛化能力,通常我们会把训练集分成两份,一份用来训练(训练集),一份用来进行评估(开发集)。

因为很多竞赛中不会给测试集的标签(输出值),所以通常我们在拿到训练集之后,会把它分成两部分,一部分用来训练,一部分用来作为开发集对模型进行评估。如果评估结果显示模型性能比较好,那就把所有的训练集都放入模型里再进行一遍训练,然后再去测试集上进行最终的测试。

这就是我们在面对数据集时常用的一种策略。


Model design

一般来说,很多机器学习任务里最常见的一种思路是先用线性模型,看是否有效。因为在很多任务里发现线性模型可以作为最基本的一种方式来先构建出一个机器学习的训练架构。后面如果发现线性模型不好,那么再更换其他模型。

\widehat{y}=x\ast w          \widehat{y}表示预测值

Linear Regression

\widehat{y}=x\ast w

Compute Loss

loss ={ \left ( \widehat{y}-y \right )}^{2}=\left ( x\ast w-y \right )^{^{2}}

求平方可以避免出现负值,进而避免出现虽然loss很高,但是正负误差求和后loss等于0的状况。

Loss function & Cost function

Training Loss (Error)     损失函数针对的是一个样本

loss ={ \left ( \widehat{y}-y \right )}^{2}=\left ( x\ast w-y \right )^{^{2}}

 

Mean Square Error(MSE) 均方误差针对的是整个training set
cost=\frac{1}{N} \sum_{n=1}^{N}\left ( \widehat{​{y}_{n}}-{y}_{n}\right )^{^{2}}

 

目标:找一个最优的w权重值,使得MSE降到最低。平均损失=\sum 每个样本损失

对数据集中所有数据根据不同权重计算出相应MSE,那么问题是,找最优权重时用哪些值作为权重的候选值。因为候选值很可能并不能得到真实的那个MSE最小值,所以想了这样一个方法,就是先用算法设计中的穷举法

穷举法的思路:首先经过一些测试,发现权重在0~4之间应该是存在着损失最小的权重,那么就把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_prey = forward(x)
    return (y_prey - y) * (y_prey - y)

w_list = np.arange(0.0, 4.1, 0.1)
mse_list = []
for w in w_list:
    print('w=', w)
    for x_val, y_val, in zip(x_data, y_data):
        l_sum = 0
        loss_val = loss(x_val, y_val)
        l_sum += loss_val
        print('\t', x_val, y_val, forward(x_val), loss_val)
    print('MSE=', l_sum / 3)
    mse_list.append(l_sum / 3)

plt.plot(w_list, mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

在深度学习里也要画这样的表(图)确定谁的值最优吗?是的,因为在深度学习中我们很难判定结果何时收敛。深度学习中是重视可视化的。

其实在深度学习里做训练的时候确实要经常画这种表(图),但我们不是用权重作为横坐标,而是用训练的轮数epoch,通常训练集的loss会随着epoch增大而下降,然后趋于一个稳定值,此时,再用开发集求loss,会发现其loss先下降,下降到一个点后会再上升,那么根据训练集和开发集图中的最低点作为我们想得到的值。

Visdom是Facebook开源的可视化工具包,将来使用Visdom这个库可以创建一个外部服务,然后可以在代码中绘图。


  • 作业:Linear Model  \widehat{y}=x\ast w+b ,画出cost graph。
  • Tips:

如何画3D图https://matplotlib.org/tutorials/toolkits/mplot3d.html#sphx-glr-tutorials-toolkits-mplot3d-py(并不好用,建议直接百度)

函数np.meshgrid()对于画3D图被普遍使用:https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html#numpy.meshgrid

参考代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 数据集 y_data= 2 * x_data + 2
x_data = [1.0, 2.0, 3.0]
y_data = [4.0, 6.0, 8.0]

# 定义模型(前馈)
def forward(x):
    return x * w + b

# 定义损失函数
def loss(x,y):
    y_prey = forward(x)
    return (y_prey - y) * (y_prey - y)

w_list = np.arange(0.0, 4.1, 0.1)
b_list = np.arange(0.0, 4.1, 0.1)
[w,b] = np.meshgrid(w_list, b_list)
mse_list = []
l_sum = 0
#count = 0
# y_pred_val_dic = {}
# loss_val_dic = {}
for x_val, y_val, in zip(x_data, y_data):
    # count += 1
    # y_pred_val_dic[str(count)] = forward(x_val)
    loss_val = loss(x_val, y_val)
    # loss_val_dic[str(count)] = loss_val
    l_sum += loss_val
# print(y_pred_val_dic)
print(np.where(l_sum == 0)) # 找到MSE=0的位置,即最优解位置,答案为(20,20),对应w=2,b=2,与已知相符

# 定义三维坐标轴(两种方法,这是其中一种)
fig = plt.figure()
ax = plt.axes(projection = '3d')
# 作图
# rstride:行之间的跨度;cstride:列之间的跨度;
# rcount:设置间隔个数,默认为50;ccount:列的间隔个数   不能与上面两个参数同时出现
# cmap:颜色映射表
ax.plot_surface(w,b,l_sum /3,rstride=1, cstride=1, cmap=plt.cm.coolwarm)
ax.set_title('Cost value')
plt.show()

效果图:

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳少阴天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值