学习b站刘二大人的《pytorch深度学习实践》,其实不是第一次学了。但是之前看了之后没有持续的使用,已经忘记了。现在回头速刷一遍。顺便做个记录,再用自己的方式改写一些代码。
视频链接:https://www.bilibili.com/video/BV1Y7411d7Ys?t=744&p=3
监督学习范式
- 1。划分数据集,训练集和测试集、验证集。在训练集上学习模型,在测试集上评估模型的性能,在验证集上做模型的选择和调参。但很多时候,数据集很小。往往只分成训练集和测试集。
- 2。如下图,我们现在的任务是学习4小时,应该取得多少分数?
- 3。在这一讲中,用的是枚举的方式寻找最优参数,代码如下,实际任务中根本不可能枚举。
- 4。而在深度学习方法中,应用最广泛的是梯度下降法,以此方法寻找到最佳权重参数。
- 5。本讲使用的模型是线性模型:
Y = W X Y =WX Y=WX
- 6。使用的是均方误差来衡量损失。
L o s s = 1 n ( Y _ p r e − Y _ t u r e ) 2 Loss = \frac{1}{n}(Y\_{pre}-Y\_ture)^2 Loss=n1(Y_pre−Y_ture)2
代码实践
import numpy as np
import matplotlib.pyplot as plt
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([2.0, 4.0, 6.0])
def forward(x,w):
'线性模型:y_pred = w * x'
return x * w
def loss(x,y,w):
'损失:loss=(y_pred-y)**2'
y_pred = forward(x,w)
return sum((y_pred - y) ** 2)/3
# 枚举求权重
Loss = []
for w in np.arange(0.0,4.1,0.1):
l = loss(x_data,y_data,w)
# print('权重w-->%f,平均平方损失loss-->%f'%(w,l))
Loss.append((w,l))
Loss = np.array(Loss)
fig = plt.figure(figsize=(10,5.5),dpi=100)
plt.plot(Loss[:,0],Loss[:,1])
plt.show()
实验结果
获取最优权重
#获得最优权重,利用最优权重做预测
import pandas as pd
L = pd.DataFrame(Loss,columns=['权重','损失'])
L = L.sort_values(by='损失')
#获得最优权重
best_w = L.iloc[0,0]
best_w # 2
利用最优权重对测试数据做预测
x = 4.0
def forward(x,w):
'线性模型:y_pred = w * x'
return x * w
forward(x,best_w) # 8
本讲小结
- 1,引入了一些机器学习的及其概念,如过拟合、欠拟合、训练集、测试集、验证集。度量模型的好坏–损失函数等等,更详细的机器学习基础可以看李航–机器学习方法;
- 2,介绍了最基础的线性模型,其中线性模型的最小二乘法,概率论讲得很清楚了。但凡回归预测模型,基本都离不开最小二乘法,也就是用平方损失或均方损失来进行误差反向传播,更新权重。
作业
- 线性模型多一个偏置项。绘制出损坏随着权重w和偏置b的曲线图,如上图,是一个3d模型。
- 本节所用的寻找权重的办法就是穷举法,多了一个偏置b后,就多了一个循环。代码如下。
import numpy as np
import matplotlib.pyplot as plt
x_data = np.array([1.0, 2.0, 3.0])
y_data = np.array([2.0, 4.0, 6.0])
def forward(x,w,b):
'线性模型:y_pred = w * x + b'
return x * w + b
def loss(x,y,w,b):
'损失:loss=(y_pred-y)**2'
y_pred = forward(x,w,b)
return sum((y_pred - y) ** 2)/3
# 枚举求权重与偏置
Loss = []
w_list = np.arange(0.0,4.1,0.5)
b_list = np.arange(-2,2.1,0.5)
for w in w_list:
for b in b_list:
l = loss(x_data,y_data,w,b)
# print('权重w-->%f,平均平方损失loss-->%f'%(w,l))
Loss.append((w,b,l))
Loss = np.array(Loss)
# 网格化矩阵
x, y = np.meshgrid(w_list, b_list)
mse = np.reshape(Loss[:,2],(9,9))
# 画图
ax = plt.figure().add_subplot(projection='3d')
ax.plot_surface(x, y, mse, linewidth=0.2,
antialiased=True,cmap=plt.get_cmap('rainbow'))
plt.show()
实验结果: