PyTorch深度学习实践概论笔记2-线性模型

28 篇文章 17 订阅
7 篇文章 1 订阅

关于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, Z2D数组形式的数据值
rstride数组行距(步长大小)
cstride数组列距(步长大小)
color曲面块颜色
cmap曲面块颜色映射
facecolors单独曲面块表面颜色
norm将值映射为颜色的Nonnalize实例
vmin映射的最小值
vmax映射的最大值

模型训练可视化常用工具

Visdom是FaceBook开源的可视化工具包,使用Visdom库可以创建web服务,可以在代码里面进行绘图往图里面添加新的点,想知道模型训练的怎么样了,就可以远程访问服务器上Visdom提供的web服务。

老师建议:在深度学习过程中记得对模型进行持久化存盘。

说明:记录学习笔记,如果错误欢迎指正!写文章不易,转载请联系我。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值