关于pytorch深度学习框架的学习,课程名称《PyTorch深度学习实践概论》,视频来源B站up主“刘二大人”。
上一讲PyTorch深度学习实践概论笔记1-概况主要是深度学习概况,接下来看第2讲:线性模型。
0 前言
一般而言,处理问题的步骤是:
①准备数据集
②模型选择设计
③训练(大部分模型都需要训练,KNN不需要训练(因为推理时间长,就看新的样本跟数据集里哪一个数据特征最接近,根据训练样本决定它的类别))
④应用推理一般拿到数据集,我们将其分成两个部分,训练集和测试集
最简单的training方法就是人眼判断。
1 Machine learning
1.1 问题分析
我们要面对的问题如下图:
x是学生每周学习的时间,y是期末考试的分数。给出y的数据是training时候需要的,没有给结果的数据要不测试要不推理。
机器学习的过程:
①拿到数据。②进行训练。③用训练好的模型计算预测结果。
在这里,x和y值都已知的学习是监督学习(supervised learning)。数据分为训练集(用于模型学习)和测试集(用于评估性能)。在训练过程中,为了避免过拟合,将训练集中的一部分划分为开发集(dev)。
1.2 Model design
模型多种多样。一般做机器学习,常见的是线性模型。
这里对模型进行简化,y = x*w。yhat是预测值。
1.2.1 Linear Regression
一开始的时候随机猜一个w,然后要去评估此时w预测出来的yhat和真实数据y的偏移程度多大,来评估模型误差。
Compute Loss
这里计算loss用的函数如上图所示。
列举几个不同w的loss,w=2时MSE最小。
How to draw the graph
不知道w在哪,推荐穷举法。代码如下:
#导入包
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和cost的list
w_list = []
mse_list = []
#不同的权重w计算loss
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_pred_val = forward(x_val)
loss_val = loss(x_val, y_val)
l_sum += loss_val
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()
图像如下:
2 作业
用模型y = x*w + b来画图。解答如下:
tips中的ref:The mplot3d Toolkit — Matplotlib 3.5.1 documentation
ref:numpy.meshgrid — NumPy v1.21 Manual
画图之前先看一下np.meshgrid()函数。这个函数是用来生成网格点坐标矩阵的。例如,在二维坐标系中,x轴取值[1,2,3],y轴取值[4,5],一共可以获得6个点的坐标:(1,4) (2,4) (3,4) (1,5) (2,5) (3,5)。官方文档的函数介绍为:
运行官方文档的example。
import numpy as np
nx,ny = (3,2)
x = np.linspace(0,1,nx)
y = np.linspace(0,1,ny)
xv,yv = np.meshgrid(x,y)
print(xv)
print(yv)
[[0. 0.5 1. ]
[0. 0.5 1. ]]
[[0. 0. 0.]
[1. 1. 1.]]
xv,yv = np.meshgrid(x,y,sparse=True)#输出稀疏数组
print(xv)
print(yv)
[[0. 0.5 1. ]]
[[0.]
[1.]]
# meshgrid很擅长用网格估计函数
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.1)
y = np.arange(-5,5,0.1)
xx,yy = np.meshgrid(x,y,sparse=True)
z=np.sin(xx**2+yy**2)/(xx**2+yy**2)
h = plt.contourf(x,y,z)
plt.axis('scaled')
plt.show()
作业的代码如下所示:
#导入包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#准备训练集
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和cost的list
w_list = []
b_list = []
mse_list = []
#不同的权重w计算loss
for w in np.arange(-4, 4.1, 0.1):
print('w=', w)
for b in np.arange(-4,4.1,0.1):
print("b=",b)
l_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)
l_sum += loss_val
print('\t', x_val, y_val, y_pred_val, loss_val)
print('MSE=', l_sum / 3)
w_list.append(w)
b_list.append(b)
mse_list.append(l_sum / 3)
#w和b网格化
w_array,b_array = np.meshgrid(w_array,b_array)
mse_array1 = np.expand_dims(mse_array,axis=0)
#画图
fig = plt.figure(figsize=(12,8))
ax = Axes3D(fig)
ax.plot_surface(w_array,b_array,mse_array1,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
plt.title('3D pic')
plt.show()
图像如下:
补充学习:
-
为了绘制 3D 图形,需要调用 Axes3D 对象的plot_surface()方法来完成。
-
设置x,y,z轴标签代码:
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
fig.colorbar(surf, shrink=0.5, aspect=5)
-
关于plot_surface参数,如下:
参数 | 描述 |
---|---|
X, Y, Z | 2D数组形式的数据值 |
rstride | 数组行距(步长大小) |
cstride | 数组列距(步长大小) |
color | 曲面块颜色 |
cmap | 曲面块颜色映射 |
facecolors | 单独曲面块表面颜色 |
norm | 将值映射为颜色的Nonnalize实例 |
vmin | 映射的最小值 |
vmax | 映射的最大值 |
模型训练可视化常用工具
Visdom是FaceBook开源的可视化工具包,使用Visdom库可以创建web服务,可以在代码里面进行绘图往图里面添加新的点,想知道模型训练的怎么样了,就可以远程访问服务器上Visdom提供的web服务。
老师建议:在深度学习过程中记得对模型进行持久化存盘。
说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。