PyTorch 深度学习实践
02.Linear Model
刘二大人视频学习笔记,2023年07月06日。
本章是对线性模型的介绍,做一些重要内容的记录,共勉。
(🥺我在电脑用Typora写,最终要存在优快云上,所以截图很麻烦,尽量以文字形式记录)
0.前言
深度学习等需要经过的三个步骤:
1.数据集
2.模型的选择(神经网络,决策树,朴素贝叶斯……)
3.训练
4.(三个步骤有四个很正常吧)推理
面临的问题:
给定数据都属于Training的数据,未知的属于Test的数据。机器学习就是,拿到数据集进行训练,然后对未知的输入得出对应的结果。对于知道x和y的值的学习称为监督学习。
一般把数据集分为两部分,训练集(x,y)和测试集(x)。
过拟合:数据过多,甚至把噪声都学习进来,这样我们就需要要求需要泛化的特性,即对未知图像也可以得出正确结果。
1.模型设计
对于上面的问题,我们需要找到合适的模型,即需要找到
y
=
f
(
x
)
y = f(x)
y=f(x)
对于f(x)来说,他的形式是多样的,即模型是多样的。首先最简单的就是线性模型,也即
y
^
=
ω
∗
x
+
b
\widehat{y} = \omega * x + b
y
=ω∗x+b
首先可以简化一下模型,为
y
^
=
ω
∗
x
\widehat{y} = \omega * x
y
=ω∗x
2.计算损失
这
里肉眼可见 ω = 2 \omega = 2 ω=2,但是具体过程是随机取值,用所取值与实际值杜比,所以需要一个方式Evaluate Model Error(评估模型误差)
在机器学习里,叫这个评估模型为Loss(损失),简单的方法是:
l
o
s
s
=
(
y
^
−
y
)
2
=
(
x
∗
ω
−
y
)
2
loss = (\widehat{y} - y)^2 = (x*\omega -y)^2
loss=(y
−y)2=(x∗ω−y)2
x(Hours) | y(Points) | y_predict(w=3) | Loss(w=3) |
---|---|---|---|
1 | 2 | 3 | 1 |
2 | 4 | 6 | 4 |
3 | 6 | 9 | 9 |
mean = 14/3 |
所以目标就是找到一个 ω \omega ω值使得Loss的mean值最低。
3.Loss Function & Cost Function
- Trainning Loss(Error)
l o s s = ( y ^ − y ) 2 = ( x ∗ ω − y ) 2 loss = (\widehat{y}-y)^2=(x*\omega-y)^2 loss=(y −y)2=(x∗ω−y)2
- Mean Square Error(MSE)
c o s t = 1 N ∑ n = 1 N ( y ^ n − y n ) 2 cost = \frac{1}{N}\sum_{n=1}^{N}(\widehat{y}_n - y_n)^2 cost=N1n=1∑N(y n−yn)2
穷举法:计算 ω \omega ω取不同值时的Loss和MSE值,得到Loss- ω \omega ω曲线。
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 = []
mse_list = []
for w in np.arange(0.0,4.1,0.1):
print('w = ',w)
l_sum = 0;
for x_val,y_val in zip(x_data,y_data):
y_prd_val = forward(x_val)
loss_val = loss(x_val,y_val)
l_sum += loss_val
print('\t',x_val,y_val,y_prd_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()
- visdom一个web端的实时绘图工具。
5.作业
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 假设b = 7,w = 2
x_data = [1.0,2.0,3.0]
y_data = [9.0,11.0,13.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 = []
mse_list = []
W=np.arange(0.0,4.1,0.1)
B=np.arange(5.0,9.1,0.1)
[w,b]=np.meshgrid(W,B)
l_sum = 0
for x_val,y_val in zip(x_data,y_data):
y_prd_val = forward(x_val)
loss_val = loss(x_val,y_val)
l_sum += loss_val
print('\t',x_val,y_val,y_prd_val,loss_val)
print('MSE = ',l_sum/3)
w_list.append(w)
mse_list.append(l_sum/3)
fig = plt.figure()
ax = Axes3D(fig)
ax = fig.add_axes(Axes3D(fig))
ax.plot_surface(w, b, l_sum/3)
plt.show()