【pytorch深度学习实践】笔记—03-1.梯度下降算法

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 【pytorch深度学习实践】笔记—03-1.梯度下降算法

梯度的引入与思考

【问题1】为什么要引入梯度下降,梯度下降是用来解决什么问题的?

【思考】回忆一下在笔记02中我们是如何找到的w?对,是穷举!

我们是在[0.0,4.0]区间,每隔0.1取一个值,穷举了所有w的可能取值,根据w-loss图像得出结论:loss最小时,w=2。

18a5c1f4d35d3bf143bdf48854ec4c08_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDY4ODc2,size_16,color_FFFFFF,t_70#pic_center.png

在实际情况中,一方面我们很可能一开始就无法确定w的大致范围,进而导致没办法穷举w的值。另一方面,权重W也可能是多维的,一一穷举会很麻烦。所以我们就希望,可不可以让程序自己来寻找最合适的w值。


此时,就把求w值问题变成一个如何寻找w最小值问题。


【问题2】如何寻找最小w?

【思考】可通过下列步骤寻找w最小值:

①初始化w:先假定w取一个值,作为寻找的起始点。

②判断方向:根据梯度值,判断w应该往左走还是往右走可以找到w最小值(沿着梯度反方向,即为寻找最小值的方向)。

移动:移动的过程就是更新权重w的过程,每次朝着梯度反方向③小幅度移动。

④更新权重w:移动完成后,将当前w值作为最新权重值,更新公式如下图所示:

1.png


不断重复上述操作,当w快找到最小值点时,此时w-loss图像的梯度接近0(可以理解为曲线在接近w最小值点斜率接近0),此时cost对w的导数接近为0,在公式中w=w-α×0。此时得到的w即为所求的w。


【概念】梯度方向定义:函数上升的方向即为梯度的方向。

所以,梯度的反方向即为函数下降的方向(即:寻找LOSS最小值点的方向)


梯度下降寻找权重w最小值

1.导入数据集

PS:与之前代码相同

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

2.定义模型

PS:与之前代码相同

def forward(x):
    return x * w

3.定义损失函数

PS:与之前代码相同

# 定义损失函数MSE
# loss = (y_pred - y)²
# loss_sum = += loss (对每个x=1.0,2.0,3.0,求loss后求和)
# loss_sum / len(xs) 在对cost求均值
def cost(xs, ys):
    loss_sum = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)  # 计算预测值y
        loss_sum += (y_pred - y) ** 2
        return loss_sum / len(xs)


4.定义梯度算法

y_pred预测值公式如下:

1.png

cost(w)损失函数公式如下:

1.png

gradient梯度公式如下:

1.png


gradient梯度关于权重w、初始值Xn和Yn的公式如下(由上述公式根据复合函数求导法则推导而来):

1.png


# 定义梯度计算方法 求cost(w)对w的偏导数 梯度也需要求和后求均值
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)

5.训练模型

for epoch in range(100):  # 默认步长为1,epoch从0-99训练100次
    cost_val = cost(x_data, y_data)  # 计算均方损失MSE
    grad_val = gradient(x_data, y_data)  # 计算梯度
    w -= 0.01 * grad_val  # 学习率lr等于0.01  # 使用梯度下降的方法更新权重
    print(' Epoch:', epoch, ' w=', w, ' loss=', cost_val)  # 每训练一次,打印一下权重w和损失loss的值

6.全部代码

import matplotlib.pyplot as plt
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 定义的初始权重值
w = 1.0
# 定义模型y=wx
def forward(x):
    return x * w
# 定义损失函数MSE
# loss = (y_pred - y)²
# loss_sum = += loss (对每个x=1.0,2.0,3.0,求loss后求和)
# loss_sum / len(xs) 在对cost求均值
def cost(xs, ys):
    loss_sum = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)  # 计算预测值y
        loss_sum += (y_pred - y) ** 2
        return loss_sum / len(xs)
# 定义梯度计算方法 求cost(w)对w的偏导数 梯度也需要求和后求均值
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)
# 最终绘制图像的x
epoch_list = []
cost_list = []
print('Predict (before training)', 4, forward(4))
for epoch in range(100):  # 默认步长为1,epoch从0-99训练100次
    cost_val = cost(x_data, y_data)  # 计算均方损失MSE
    grad_val = gradient(x_data, y_data)  # 计算梯度
    w -= 0.01 * grad_val  # 学习率lr等于0.01  # 使用梯度下降的方法更新权重
    print(' Epoch:', epoch, ' w=', w, ' loss=', cost_val)
    epoch_list.append(epoch)  # 收集当前是第几次训练
    cost_list.append(cost_val)  # 收集对应训练的损失值
print('Predict (after training)', 4, forward(4))
# 绘图
plt.plot(epoch_list, cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()


7.展示pytorch绘制的图像(epoch-loss)

从图中可以发现,当训练epoch次数增加的时候,损失值会越来越小。

此时打印4 和forward(4),就会得到forward(4)的值接近于8。所以权重w=y/x=2

1.png

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
95 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
62 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
8天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
36 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
8天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
28 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
8天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
43 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
15天前
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
35 7
|
1月前
|
机器学习/深度学习 并行计算 PyTorch
深度学习环境搭建笔记(一):detectron2安装过程
这篇博客文章详细介绍了在Windows环境下,使用CUDA 10.2配置深度学习环境,并安装detectron2库的步骤,包括安装Python、pycocotools、Torch和Torchvision、fvcore,以及对Detectron2和PyTorch代码的修改。
101 1
深度学习环境搭建笔记(一):detectron2安装过程
|
24天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
71 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
56 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
43 1