Pytorch深度学习实践笔记3

🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:pytorch深度学习
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!

视频来自【b站刘二大人】

目录

1 梯度下降(Gradient Descent)

2 随机梯度下降(SGD Stochastic Gradient Descent)

3 批量梯度下降(BGD Batch Gradient Descent)

4 小批量梯度下降(mini-Batch GD,mini-batch Gradient Descent)

5 代码


1 梯度下降(Gradient Descent)

  • 梯度:

方向导数在该点的最大值,建立cost与w的关系,优化使得w能够快速收敛

  • 引入:

可以发现上一章节我们寻找权重ω的时候,使用的是遍历 ω 的方法,显然在工程上这是不可行的,于是引入了梯度下降(Gradient Descent)算法。

  • 方案:

我们的目标是找出 ω∗ 最小化 cost(ω)函数 。梯度下降使用公式ω=ω−α∗∂cost∂ω,其中α是人为设定的学习率,显然 ω 总是往cost局部最小化的方向趋近(可以注意并不总是往全局最优的方向)

  • 局部最优:

我们经常担心模型在训练的过程中陷入局部最优的困境中,但实际上由于Mini-batch的存在在实际工程中模型陷入鞍点(局部最优)的概率是很小的

  • epoch:

轮次,一个epoch指的是所有的训练样本在模型中都进行了一次正向传播和一次反向传播


2 随机梯度下降(SGD Stochastic Gradient Descent)


随机梯度下降算法在梯度下降算法的基础上进行了一定的优化,其对于每一个实例都进行更新,也就是不是用MSE,而是

对 ω进行更新
优势:SGD更不容易陷入鞍点之中,同时其拥有更好的性能
优点:
由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势.
不易于并行实现。

for i in range(number of epochs):np.random.shuffle(data)for each in data:weights_grad = evaluate_gradient(loss_function, each, weights)weights = weights - learning_rate * weights_grad


3 批量梯度下降(BGD Batch Gradient Descent)


BGD通常是取所有训练样本损失函数的平均作为损失函数,每次计算所有样本的梯度,进行求均值,计算量比较大,会陷入鞍点
优点:
一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
当样本数目 m 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。(有些样本被重复计算,浪费资源)

for i in range(number of epochs):np.random.shuffle(data)for each in data:weights_grad = evaluate_gradient(loss_function, each, weights)weights = weights - learning_rate * weights_grad


4 小批量梯度下降(mini-Batch GD,mini-batch Gradient Descent)


mini-batch GD采取了一个折中的方法,每次选取一定数目(mini-batch)的样本组成一个小批量样本,然后用这个小批量来更新梯度,这样不仅可以减少计算成本,还可以提高算法稳定性。

for i in range(number of epochs):np.random.shuffle(data)for batch in get_batches(data, batch_size = batch_size):weights_grad = evaluate_gradient(loss_function, batch, weights)weights = weights - learning_rate * weights_grad


优点:融合了BGD和SGD优点

  • 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
  • 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
  • 可实现并行化。

梯度下降:BGD、SGD、mini-batch GD介绍及其优缺点​

blog.csdn.net/qq_41375609/article/details/112913848​编辑


5 代码

  • BGD
import matplotlib.pyplot as plt
import numpy as np# BGD 批量梯度下降x_data = np.arange(1.0,200.0,1.0)
y_data = np.arange(2.0,400.0,2.0)def forward(x,w):return x*wdef cost(x,y,w):cost = 0for x_val,y_true in zip(x,y):y_pred = forward(x_val,w)loss_val = (y_true - y_pred)**2cost = cost + loss_valreturn cost/len(x)def gradient(x,y,w):gradient = 0for x_val,y_true in zip(x,y):gradient_temp = 2 * x_val *(x_val * w - y_true)gradient = gradient + gradient_tempreturn gradient/len(x)w = 1.0
lr = 0.00001epoch_list = []
cost_list = []print("Before train 4: ",forward(400,w))
for epoch in range(100):cost_val = cost(x_data,y_data,w)gradient_val = gradient(x_data,y_data,w)w = w - lr * gradient_valprint("epoch: ",epoch," loss: ",cost_val," w: ",w)epoch_list.append(epoch)cost_list.append(cost_val)if (cost_val < 1e-5):breakprint("After train 4: ",forward(400,w))plt.plot(epoch_list,cost_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.savefig("./data/pytorch2.png")

  • SGD
import matplotlib.pyplot as pltimport numpy as np# SGD随机梯度下降x_data = np.arange(1.0,200.0,1.0)
y_data = np.arange(2.0,400.0,2.0)def forward(x,w):return x * wdef loss(x,y_true,w):y_pred = forward(x,w)return (y_pred-y_true)**2def gradient(x,y,w):return 2 *x *(x *w-y)w = 1.0
lr = 0.00001epoch_list = []
loss_list = []print("Before train 4: ",forward(400,w))
for epoch in range(1000):seed = np.random.choice(range(len(x_data)))loss_val = loss(x_data[seed],y_data[seed],w)gradient_val = gradient(x_data[seed],y_data[seed],w)w -= lr*gradient_valprint("epoch: ",epoch," loss: ",loss_val," w: ",w)epoch_list.append(epoch)loss_list.append(loss_val)if (loss_val < 1e-7):break
print("After train 4: ",forward(400,w))plt.plot(epoch_list,loss_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.savefig("./data/pytorch2_1.png")

  • mini-Batch GD
import matplotlib.pyplot as pltimport numpy as np
import random# mini-batch GD 小批量随机梯度下降x_data = np.arange(1.0,200.0,1.0)
y_data = np.arange(2.0,400.0,2.0)def forward(x,w):return x*wdef cost(x,y,w):cost = 0for x_val,y_true in zip(x,y):y_pred = forward(x_val,w)loss_val = (y_true - y_pred)**2cost = cost + loss_valreturn cost/len(x)def gradient(x,y,w):gradient = 0for x_val,y_true in zip(x,y):gradient_temp = 2 * x_val *(x_val * w - y_true)gradient = gradient + gradient_tempreturn gradient/len(x)def get_seed_two(nums):# 从数组中随机取两个索引index1 = random.randrange(len(nums))index2 = random.randrange(len(nums))while index2 == index1:index2 = random.randrange(len(nums))return index1, index2w = 1.0
lr = 0.00001
batch_size = 2epoch_list = []
loss_list = []# 存储随机取出的数的索引
seed = []# 存储一个batch的数据
x_data_mini = []
y_data_mini = []print("Before train 4: ",forward(400,w))
for epoch in range(1000):# 设定Batchsize 大小为2,每次随机取所有数据中的两个,作为一个batch,进行训练idx1,idx2= get_seed_two(x_data)seed.append(idx1)seed.append(idx2)for i in range(batch_size):x_data_mini.append(x_data[seed[i]])y_data_mini.append(y_data[seed[i]])loss_val = cost(x_data_mini,y_data_mini,w)gradient_val = gradient(x_data_mini,y_data_mini,w)w -= lr*gradient_valprint("epoch: ",epoch," loss: ",loss_val," w: ",w)epoch_list.append(epoch)loss_list.append(loss_val)if (loss_val < 1e-7):break
print("After train 4: ",forward(400,w))plt.plot(epoch_list,loss_list)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.savefig("./data/pytorch2_2.png")

🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!欢迎关注、关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习系列】使用高斯贝叶斯模型进行数据分类的完整流程

目录 一、导入数据 二、选择特征 三、十折交叉验证 四、划分训练集和测试集 五、训练高斯贝叶斯模型 六、预测测试集 七、查看训练集和测试集上的分数 八、查看混合矩阵 九、输出评估指标 一、导入数据 # 根据商户数据预测其是否续约案例 import pandas #读取数据到 da…

2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针

import java.util.Scanner;public class Main {static Scanner scnew Scanner(System.in);public static void main(String[] args) {int nsc.nextInt();//数组长度int tsc.nextInt();//操作次数int arr[]new int[n];char arr1[] new char[t];int arr2[] new int[t];int vis…

C++ RBTree封装mapset

目录 RBTreeNode的声明 RBTree结构 map结构 set结构 改造红黑树 迭代器类 迭代器成员函数 默认成员函数 Insert set map RBTreeNode的声明 template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>*…

非等值连接、等值连接、自然连接

目录 一、笛卡尔积 二、三种连接的关系 三、非等值连接 四、等值连接 五、自然连接 一、笛卡尔积 要理解非等值连接、等值连接、自然连接首先要理解笛卡尔积。 学过《离散数学》的应该很熟悉笛卡尔积。 简单来说&#xff0c;就是有两个集合&#xff0c;其中一个集合中的元…

第五十四周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;基于经验模态分解的混合空气质量预测模型 现有问题 提出方法 方法论 1、扩展ARIMA模型 2、经验模态分解&#xff08;EMD&#xff09; 3、截断奇异值分解&#xff08;SVD&#xff09; SE-ARIMA模型 研究实验 1、数据集 2、评…

如何从U盘恢复误删除的文件

在许多情况下&#xff0c;用户可能会发现其U盘上的数据误删&#xff0c;并且无法访问或恢复它。在这篇文章中&#xff0c;我们将看到如何使用命令提示符尝试从U盘恢复损坏的文件和数据。我们还将列出一些免费的U盘恢复软件及其独特的功能&#xff0c;以便在前一种方法无法产生所…

北邮22级信通院DSP:用C++程序实现给定参数下四种滤波器的Butterworth模拟滤波器设计:给定上下截频和衰减系数求H(p)和H(s)

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、 核心算法 1.1判断滤波器类型 1.2 带通滤波器BP 1.3带阻滤波器B…

分享:大数据风险检测报告,哪里查询比较好?

随着大数据技术的发展&#xff0c;逐渐被运用到各个领域&#xff0c;基于大数据技术的个人风险检测也就是我们常说的大数据报告在金融环境中运用的十分普遍&#xff0c;那大数据风险检测报告哪里查询比较好呢?本文就为大家简单介绍一下。 大数据风险检测报告查询能查到什么? …

Ubuntu coredump文件的生成并利用gdb查看报错位置

1.开启core文件生成 相关链接&#xff1a;gdb调试core dump使用 - 知乎 (zhihu.com) 相关链接&#xff1a;ubuntu | linux下程序崩溃生成coredump的方法_linux崩溃dump-CSDN博客 &#xff08;1&#xff09;ulimit -c unlimited &#xff08;2&#xff09;echo "/tmp/cor…

在ubuntu中关于驱动得问题:如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动 一、nouveau驱动程序加入黑名单 (1) 打开黑名单列表文件 终端输入&#xff1a; sudo gedit /etc/modprobe…

HarmonyOS开发之DevEco Studio安装

HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造&#xff0c;为运行在HarmonyOS和OpenHarmony系统上的应用和服务&#xff08;以下简称应用/服务&#xff09;提供一站式的开发平台。 作为一款开发工具&#xff0c;除了具有基本的代码开发、编译构建及调测等功能…

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

自己手写一个栈【C风格】

#include <iostream> //栈 #define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int Status;//状态类型 typedef int ElemType;//元素类型typedef struct SqStack {ElemType data[MAX_SIZE];int top; };//初始化&#xff0c;方法1 …

CSAPP(datalab)解析

howManyBits /* howManyBits - 返回用二进制补码表示x所需的最小位数* 示例: howManyBits(12) 5* howManyBits(298) 10* howManyBits(-5) 4* howManyBits(0) 1* howManyBits(-1) 1* howManyBits(0x80000000) …

计算机毕业设计 | SpringBoot社区物业管理系统 小区管理(附源码)

1&#xff0c; 概述 1.1 课题背景 近几年来&#xff0c;随着物业相关的各种信息越来越多&#xff0c;比如报修维修、缴费、车位、访客等信息&#xff0c;对物业管理方面的需求越来越高&#xff0c;我们在工作中越来越多方面需要利用网页端管理系统来进行管理&#xff0c;我们…

WordPress安装插件失败No working transports found

1. 背景&#xff08;Situation&#xff09; WordPress 社区有非常多的主题和插件&#xff0c;大部分人用 WordPress 都是为了这些免费好用的主题和插件。但是今天安装完 WordPress 后安装插件时出现了错误提示&#xff1a;“ 安装失败&#xff1a;下载失败。 No working trans…

Vulhub——CAS 4.1、AppWeb、apisix

文章目录 一、Apereo CAS 4.1&#xff08;反序列化命令执行漏洞&#xff09;二、CVE-2018-8715&#xff08;AppWeb认证绕过漏洞&#xff09;三、apisix3.1 CVE-2020-13945(默认密钥漏洞&#xff09;3.2 CVE-2021-45232&#xff08;Dashboard API权限绕过导致RCE&#xff09; 一…

只需一行代码提高3DGS重建质量!随机初始化新SOTA

论文标题&#xff1a; Relaxing Accurate Initialization Constraint for 3D Gaussian Splatting 论文作者&#xff1a; Jaewoo Jung, Jisang Han, Honggyu An, Jiwon Kang, Seonghoon Park and Seungryong Kim 导读&#xff1a; 3DGS在新视角合成和三维重建方面展现了令人印…

2022年CSP-J入门级第一轮初赛真题

一、单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1b;每题有且仅有一个正确选项&#xff09; 第 1 题 以下哪种功能没有涉及C语言的面向对象特性支持&#xff1a;&#xff08; &#xff09;。 A. C中调用printf函数 B. C中调用用户定义的类成…

使用cockpit管理服务器

安装cockpit yum install cockpit启用cockpit systemctl start cockpit浏览器中访问cockpit cockpit监听的端口是9090在浏览器中访问https://ip:9090/效果图 系统 日志 网络 账号