当前位置: 首页 > news >正文

【PyTorch入门】 PyTorch不同优化器的比较

本次分享pytorch中几种常用的优化器,并进行互相比较。

PyTorch 优化器原理及优缺点分析

在 PyTorch 中,torch.optim 提供了多种优化器用于神经网络训练。每种优化器背后有不同的更新规则和机制,旨在适应不同的训练需求。以下是五种常见优化器(SGD、Momentum、AdaGrad、RMSprop、Adam)的原理、作用、优缺点及应用场景。

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

原理:

SGD 是最经典的优化算法,基于梯度下降的思想。每次参数更新时,SGD 使用当前参数的梯度对参数进行调整。其更新规则如下:

θ t + 1 = θ t − η ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \eta \cdot \nabla_{\theta} J(\theta_t) θt+1=θtηθJ(θt)

其中, η \eta η 是学习率, ∇ θ J ( θ t ) \nabla_{\theta} J(\theta_t) θJ(θt) 是当前参数点的梯度。

作用:

用于优化损失函数,更新神经网络中的权重参数。

优缺点:

  • 优点
    • 实现简单,计算资源消耗小。
    • 对于某些问题,收敛较快。
  • 缺点
    • 收敛缓慢:每次更新仅依赖单一样本或小批量数据,可能导致目标函数震荡,尤其在复杂的优化空间中。
    • 灵敏度高:学习率的选择非常关键,过大会导致发散,过小则收敛缓慢。

2. Momentum (带动量的梯度下降)

原理:

Momentum 是对 SGD 的改进,通过引入动量项来加速梯度下降,尤其在面对陡峭的梯度或局部最小值时表现更好。动量项有助于保持一定的“惯性”,从而增加当前更新的速度。更新规则如下:

v t + 1 = β v t + ( 1 − β ) ∇ θ J ( θ t ) v_{t+1} = \beta v_t + (1 - \beta) \nabla_{\theta} J(\theta_t) vt+1=βvt+(1β)θJ(θt)
θ t + 1 = θ t − η v t + 1 \theta_{t+1} = \theta_t - \eta v_{t+1} θt+1=θtηvt+1

其中, β \beta β 是动量参数, η \eta η 是学习率。

作用:

加速收敛过程,尤其在梯度变化较小的方向上。

优缺点:

  • 优点
    • 有助于突破局部最小值,优化过程中更加稳定,避免梯度震荡。
    • 相较于普通 SGD,收敛速度更快。
  • 缺点
    • 动量参数 β \beta β 需要调节,最佳值依赖于具体问题。
    • 动量可能导致跳过局部最优解,特别是在复杂的目标函数中。

3. AdaGrad (Adaptive Gradient Algorithm 自适应梯度算法)

原理:

AdaGrad 通过对每个参数使用不同的学习率,使得参数的更新速度自适应地调整。对于频繁出现的特征,AdaGrad 会减少学习率;对于稀疏特征,则增加学习率。具体来说,AdaGrad 会对梯度的历史平方和进行累加,动态调整每个参数的学习率:

G t + 1 = G t + ∇ θ J ( θ t ) 2 G_{t+1} = G_t + \nabla_{\theta} J(\theta_t)^2 Gt+1=Gt+θJ(θt)2
θ t + 1 = θ t − η G t + 1 + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_{t+1} + \epsilon}} \nabla_{\theta} J(\theta_t) θt+1=θtGt+1+ϵ ηθJ(θt)

其中, ϵ \epsilon ϵ 是防止除零错误的小常数。

作用:

适用于具有稀疏特征的数据(如文本处理、推荐系统等),能够让模型快速适应不同特征的梯度变化。

优缺点:

  • 优点
    • 自动调整学习率,避免手动调整学习率的繁琐。
    • 对稀疏数据的收敛速度有显著提升。
  • 缺点
    • 随着训练进行,AdaGrad 的学习率会持续减小,导致训练后期更新过于缓慢。
    • 对于某些问题,可能导致过早收敛,特别是当参数梯度变化不大时。

4. RMSprop (Root Mean Square Propagation 均方根传播)

原理:

RMSprop 是对 AdaGrad 的改进,通过引入衰减因子来防止学习率过快减小。它通过对梯度平方的指数加权平均来调整每个参数的学习率:

v t + 1 = β v t + ( 1 − β ) ∇ θ J ( θ t ) 2 v_{t+1} = \beta v_t + (1 - \beta) \nabla_{\theta} J(\theta_t)^2 vt+1=βvt+(1β)θJ(θt)2
θ t + 1 = θ t − η v t + 1 + ϵ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_{t+1} + \epsilon}} \nabla_{\theta} J(\theta_t) θt+1=θtvt+1+ϵ ηθJ(θt)

其中, β \beta β 是衰减因子, η \eta η 是学习率, ϵ \epsilon ϵ 是防止除零错误的小常数。

作用:

适用于非平稳目标函数(例如递增或递减的动态任务)。特别适用于处理RNN(递归神经网络)和时间序列数据。

优缺点:

  • 优点
    • 对梯度波动较大的问题表现更好,尤其适用于动态目标。
    • 相较于 AdaGrad,能够有效防止学习率过早减小。
  • 缺点
    • 需要调节 β \beta β 和学习率等超参数。
    • 可能需要针对具体问题进一步调整超参数,以获得最优性能。

5. Adam (Adaptive Moment Estimation 自适应矩估计)

原理:

Adam 结合了 Momentum 和 RMSprop 的思想,通过计算梯度的一阶矩(动量)和二阶矩(梯度平方的均值)来进行自适应更新。更新规则如下:

m t + 1 = β 1 m t + ( 1 − β 1 ) ∇ θ J ( θ t ) m_{t+1} = \beta_1 m_t + (1 - \beta_1) \nabla_{\theta} J(\theta_t) mt+1=β1mt+(1β1)θJ(θt)
v t + 1 = β 2 v t + ( 1 − β 2 ) ∇ θ J ( θ t ) 2 v_{t+1} = \beta_2 v_t + (1 - \beta_2) \nabla_{\theta} J(\theta_t)^2 vt+1=β2vt+(1β2)θJ(θt)2
m ^ t + 1 = m t + 1 1 − β 1 t + 1 , v ^ t + 1 = v t + 1 1 − β 2 t + 1 \hat{m}_{t+1} = \frac{m_{t+1}}{1 - \beta_1^{t+1}}, \quad \hat{v}_{t+1} = \frac{v_{t+1}}{1 - \beta_2^{t+1}} m^t+1=1β1t+1mt+1,v^t+1=1β2t+1vt+1
θ t + 1 = θ t − η v ^ t + 1 + ϵ m ^ t + 1 \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_{t+1}} + \epsilon} \hat{m}_{t+1} θt+1=θtv^t+1 +ϵηm^t+1

其中, β 1 \beta_1 β1 β 2 \beta_2 β2 是一阶和二阶矩的衰减率, η \eta η 是学习率, ϵ \epsilon ϵ 是防止除零的常数。

作用:

适用于各种类型的神经网络,尤其在大规模数据集上表现优异。

优缺点:

  • 优点
    • 结合了动量和自适应学习率,通常可以快速收敛。
    • 适用于非平稳目标函数和大规模数据集。
    • 超参数调整较为简单,少量调整即可获得较好的性能。
  • 缺点
    • 对小数据集或过于简单的任务,可能导致过拟合。
    • 对学习率较为敏感,可能需要根据具体问题进行微调。

总结

优化器原理优点缺点适用场景
SGD随机梯度下降实现简单,计算开销小收敛慢,容易震荡基础任务,特别是小规模训练任务
Momentum加入动量加速收敛,避免局部最小值动量参数选择困难适合梯度波动较大的任务
AdaGrad自适应调整每个参数的学习率自动调整学习率,适合稀疏数据学习率逐步减小,可能导致训练后期收敛缓慢处理稀疏数据(如 NLP)
RMSprop使用梯度平方的指数加权平均防止学习率过早减小,适合动态任务需要调节超参数适用于非平稳目标函数,尤其是 RNN 和时间序列任务
Adam结合动量和自适应学习率快速收敛,超参数调节简单对学习率敏感,可能过拟合适用于各种神经网络,尤其是大规模数据集训练

示例可视化代码

import torch
import torch.nn
import torch.utils.data as Data
import matplotlib
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"matplotlib.rcParams['font.sans-serif'] = ['SimHei']#准备建模数据
x = torch.unsqueeze(torch.linspace(-1, 1, 500), dim=1)
y = x.pow(3)#设置超参数
LR = 0.01
batch_size = 15
epoches = 5
torch.manual_seed(10)#设置数据加载器
dataset = Data.TensorDataset(x, y)
loader = Data.DataLoader(dataset=dataset,batch_size=batch_size,shuffle=True,num_workers=2)#搭建神经网络
class Net(torch.nn.Module):def __init__(self, n_input, n_hidden, n_output):super(Net, self).__init__()self.hidden_layer = torch.nn.Linear(n_input, n_hidden)self.output_layer = torch.nn.Linear(n_hidden, n_output)def forward(self, input):x = torch.relu(self.hidden_layer(input))output = self.output_layer(x)return output#训练模型并输出折线图
def train():net_SGD = Net(1, 10, 1)net_Momentum = Net(1, 10, 1)net_AdaGrad = Net(1, 10, 1)net_RMSprop = Net(1, 10, 1)net_Adam = Net(1, 10, 1)nets = [net_SGD, net_Momentum, net_AdaGrad, net_RMSprop, net_Adam]#定义优化器optimizer_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)optimizer_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.6)optimizer_AdaGrad = torch.optim.Adagrad(net_AdaGrad.parameters(), lr=LR, lr_decay=0)optimizer_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)optimizer_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))optimizers = [optimizer_SGD, optimizer_Momentum, optimizer_AdaGrad, optimizer_RMSprop, optimizer_Adam]#定义损失函数loss_function = torch.nn.MSELoss()losses = [[], [], [], [], []]for epoch in range(epoches):for step, (batch_x, batch_y) in enumerate(loader):for net, optimizer, loss_list in zip(nets, optimizers, losses):pred_y = net(batch_x)loss = loss_function(pred_y, batch_y)optimizer.zero_grad()loss.backward()optimizer.step()loss_list.append(loss.data.numpy())plt.figure(figsize=(12,7))labels = ['SGD', 'Momentum', 'AdaGrad', 'RMSprop', 'Adam']for i, loss in enumerate(losses):plt.plot(loss, label=labels[i])plt.legend(loc='upper right',fontsize=15)plt.tick_params(labelsize=13)plt.xlabel('训练步骤',size=15)plt.ylabel('模型损失',size=15)plt.ylim((0, 0.3))plt.show()if __name__ == "__main__":train()

在这里插入图片描述

本次的分享就结束了,感谢大家观看。

相关文章:

【PyTorch入门】 PyTorch不同优化器的比较

本次分享pytorch中几种常用的优化器,并进行互相比较。 PyTorch 优化器原理及优缺点分析 在 PyTorch 中,torch.optim 提供了多种优化器用于神经网络训练。每种优化器背后有不同的更新规则和机制,旨在适应不同的训练需求。以下是五种常见优化器…...

jest使用__mocks__设置模拟函数不生效 解决方案

模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…...

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序,用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能,让用户在手机上畅享更舒适的音乐体验,每位用户都能享受精彩纷呈的收听体验。此外,软件还支持无损音质音乐…...

VMware去虚拟化

介绍两款用于去除VMware虚拟机虚拟化特征的工具,这些工具可以帮助用户在虚拟机中运行游戏时避免被游戏检测到虚拟机环境,从而防止游戏因检测到虚拟机而闪退。这些工具通过修改虚拟机的硬件信息(如硬盘、声卡、网卡、主板芯片组、显卡、主板信…...

汉王扫描王 2.9.16 |免费无广告的智能扫描软件,支持多种格式导出

汉王扫描王是一款功能全面的智能扫描软件,集成了文字识别、表格提取和文档转换等功能。它支持将文档转换为PDF、Word、Excel等多种格式,非常适合学生、教师、业务人员和财务工作者使用。该软件具备手机扫描仪功能,能够自动抠边、矫正文档&…...

毕设中所学

1、交叉引用 在毕业设计论文Word中交叉引用参考文献_交叉引用如何标注[1~6]-CSDN博客 另:将标号或其他文字改为上标的快捷键是CtrlShift。 图的交叉引用一样,修改引用类型即可。 2、ENVI安装 ENVI5.6 安装教程,新手入门(超详细…...

[微服务]分布式搜索Java客户端

快速入门 使用RestClient客户端进行数据搜索可以分为两步 构建并发起请求 代码解读: 第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等 query…...

STM32 拓展 低功耗案例3:待机模式 (hal)

配置PA0的两种方式: 第一种 第二种 复制寄存器代码然后对其进行修改 mian.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body…...

在Linux下安装部署Tomcat教程

摘要 Tomcat是由Apache开发的要给Servlet容器,实现了对Servlet 和JSP的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台,安全管理和Tomcat阀等。简单来说,Tomcat是一个由WEB应用程序的托管平台,可以让用户编写的WEB应用程序,别Tomcat所托管,并提供网…...

第5章 串行接口

8251A的基本特性 可用于同步和异步传送。 同步传送:5~8bit/字符,内同步或外同步,自动插入同步字符; 异步传送:5~8bit/字符,接收/发送时钟频率为通信波特率的1,16或64倍; 可产生中止字符、1,1.5,2位停止位。…...

Vue 百度地图 搜索框+点击地图获取坐标

本文通过vueele百度地图&#xff0c;实现点击地图获取坐标&#xff0c;或者搜索框智能联想下拉框&#xff0c;点击获取坐标及地图位置标点。 百度地图通过public文件夹下index.html,script方式 引入全局 代码如下&#xff1a; <template><div><div id"l-…...

Python学习路线

以下是一个Python详细学习路线&#xff1a; 一、入门阶段&#xff08;第1 - 2个月&#xff09; 环境搭建与基础语法 安装与配置&#xff1a; 从Python官方网站&#xff08;Download Python | Python.org&#xff09;下载适合自己操作系统的Python版本并进行安装。 配置环境变…...

Web Services 简介

Web Services 简介 1. 引言 Web Services 是一种基于网络的软件服务,它允许不同的应用程序在互联网上相互通信和交互。这种技术是基于开放的互联网标准,如HTTP、XML、SOAP和WSDL,使得不同平台和编程语言的应用程序能够轻松地实现互操作性。Web Services 的出现,极大地推动…...

option api compose api

option api & compose api <script setup> import { ref, computed } from vue; // 原始数据 const data ref([ { position: { x: 1, y: 2 } }, { position: { x: 3, y: 4 } }, { position: { x: 5, y: 6 } } ]); // 数据转换函数 const convertData …...

tcpdump的常见方法

详解tcpdump的使用方法&#xff1a;网络数据包捕获与分析 tcpdump是一个功能强大的命令行工具&#xff0c;用于捕获和分析通过网络接口传输的数据包。它广泛应用于网络故障诊断、网络安全监控和协议分析等领域。本文将详细介绍tcpdump的使用方法&#xff0c;包括安装、基本命令…...

【C语言】可移植性陷阱与缺陷(四):字符是有符号整数还是无符号整数

在 C 语言中,字符类型(char)是一个字节大小的整数类型,但它可以被编译器解释为有符号整数或无符号整数,这是一个容易导致可移植性问题的重要因素。这种解释的不确定性可能会在程序的逻辑、比较运算和数据处理等多个方面引发错误。 一、字符类型的默认行为 根据C语言标准…...

[Linux]进程间通信-管道

目录 1. 进程间通信 2.父子进程之间的通信 3.匿名管道 匿名管道的创建 管道读写的情况 管道的5种特性 4.命名管道 指令级 命名管道原理 代码级 读取端 1. 进程间通信 当我们有两个进程操作数据库的时候&#xff0c;一个进程负责写入操作&#xff0c;一个进…...

设置开机自启动的应用

设置开机自启动的应用 step1&#xff1a;按住ShiftctrlEsc step2&#xff1a;找到启动应用 step3&#xff1a;鼠标到启动那里&#xff0c;右键就可以禁用了...

QQ长截屏

QQ长截屏 第一步&#xff1a;CtrlAltA 第二步&#xff1a;点击剪刀之后&#xff0c;再滑动滚轮就可以了。 展示...

38 Opencv HOG特征检测

文章目录 HOGDescriptor 构造函数setSVMDetector 设置支持向量机&#xff08;SVM&#xff09;检测器&#xff0c;用于目标检测。compute 用于计算图像区域的HOG描述符。detectMultiScale 多尺度检测目标。示例 HOGDescriptor 构造函数 HOGDescriptor(); HOGDescriptor(const S…...

Segment Anything论文详细翻译【Part2:引言Introduction】

目录 写在前面 Introduction 第1段 第2段 第3段 第4段 第5段 第6段 第7段 第8段 第9段 第10段 第11段 第12段 Figure2 关键特点 图中具体内容 图例说明 写在前面 为啥要写这篇文章&#xff1f;因为找不到一篇写的特别好的【翻译并仔细解释】文章。网上大多千…...

Mac中配置Node.js前端vscode环境(第二期)

核心组件&#xff1a;vscode、谷歌浏览器、Node.js&#xff08;重点&#xff09;、git 一、Node.js安装&#xff08;nvm安装&#xff09; 点击macos中的终端&#xff0c;保持bash&#xff0c;而不是zsh 若为zsh&#xff0c;则可在终端中使用下面命令变成bash chsh -s /bin/…...

基于COT(Chain-of-Thought Prompt)的教学应用:如何通过思维链提示提升模型推理能力

引言 随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理领域展现出了强大的能力。然而&#xff0c;面对复杂的推理任务时&#xff0c;模型的表现往往不尽如人意&#xff0c;尤其是在需要多步逻辑推导的场景中。为了应对这一挑战…...

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理环境&#xff0c;不需要科学上网(价格便宜、有安全风险&#…...

MySQL图形化界面工具--DataGrip

之前介绍了在命令行进行操作&#xff0c;但是不够直观&#xff0c;本次介绍图形化界面工具–DataGrip。 安装DataGrip 官网链接&#xff1a;官网下载链接 常规的软件安装流程。 参考链接&#xff1a;DataGrip安装 使用DataGrip 添加数据源&#xff1a; 第一次使用最下面会…...

WPF+Prism View与ViewModel绑定

1、开发环境&#xff0c;Win10VS2022.NET8Prism.DryIoc&#xff08;9.0.537&#xff09;或Prism.Unity。 2、通过NuGet安装Prism.DryIoc&#xff08;9.0.537&#xff09;或Prism.Unity。 2.1、创建ViewModels文件夹用于存放ViewModel文件、创建Views文件夹存放View文件。 将…...

关于Zotero

1、文献数据库&#xff1a; Zotero的安装 Zotero安装使用_zotero只能安装在c盘吗-CSDN博客 2、如何使用zotero插件 我刚下载的时候就结合使用的是下面的这两个博主的分享&#xff0c;感觉暂时是足够的。 Zotero入&#x1f6aa;基础 - 小红书 Green Frog申请easyscholar密钥…...

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…...

从索尼爱立信手机打印短信的简单方法

昨天&#xff0c;我买了一部新手机来代替我的旧索尼爱立信Xperia&#xff0c;但手机上有很多珍贵的短信&#xff0c;是我男朋友发来的&#xff0c;我不想失去它们。然后我尝试打印它们&#xff0c;但我无法从我的索尼爱立信手机中取出它们。您有什么从索尼爱立信手机打印短信的…...

深入浅出梯度下降算法:快速抵达函数最小值的方法

引言 梯度是机器学习和优化领域中不可或缺的概念&#xff0c;它为我们提供了理解和调整多维空间中函数行为的工具。本文将详细介绍梯度的定义、性质&#xff0c;并通过具体的一元和多元函数案例展示如何使用梯度下降算法找到最佳参数。 一、梯度的基础知识 1.1 定义与计算 梯…...

OPC DA激活报错

报错提示&#xff1a; 解决办法&#xff1a; 查看Missing license keys&#xff0c;根据提示破解...

PyTorch到C++再到 CUDA 的调用链(C++ ATen 层) :以torch._amp_update_scale_调用为例

今天在看pytorch源码&#xff0c;遇到的问题&#xff0c;记录一下 。 source:/lib/python3.10/site-packages/torch/amp/grad_scaler.py torch._amp_update_scale_(_scale,_growth_tracker,found_inf_combined,self._growth_factor,self._backoff_factor,self._growth_interva…...

yolov5核查数据标注漏报和误报

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…...

C# 设计模式概况

什么是设计模式 大家熟知的GOF23种设计模式&#xff0c;源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书&#xff0c;由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著&#xff0c;四人组Gang of Four简称GOF。总结了在面向…...

STM32 NOR FLASH(SPI FLASH)驱动移植(2)

2&#xff09;FLASH 读取函数 /* * brief 读取 SPI FLASH * note 在指定地址开始读取指定长度的数据 * param pbuf : 数据存储区 * param addr : 开始读取的地址(最大 32bit) * param datalen : 要读取的字节数(最大 65535) * retval 无 */ void norflash_read(uint8_t *pbuf…...

Redis高可用集群部署

根据集群分析和持久化优化方式,这里用docker部署redis分片集群模式并设置为aof-rdb共用方式存储 准备 2核4G及以上服务器;安装好docker环境;配置docker镜像仓库(https://www.ecnfo.com:1443),因为下面镜像是从这个镜像仓库下载的{"builder": {"gc"…...

【玩转23种Java设计模式】行为型模式篇:命令模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

代码随想录算法【Day10】

今日只做一题&#xff0c;剩下的题后面补 232.用栈实现队列 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stIn.push(x);}…...

WKWebView打开pdf文件乱码?各种方案整理。

近期有用户反馈使用我们FinClip SDK运行的小程序&#xff0c;在iOS18.0.1的系统上打开部分pdf文件的时候出现了乱码的现象, 低版本的系统打开没有出现乱码的现象&#xff0c;用电脑打开这个pdf文件也是正常的。经过排查&#xff0c;可能是iOS18的系统对WKWebView进行了调整处理…...

Android中创建ViewModel的几种方法

文章目录 1. 使用 `ViewModelProvider`1.1 在 `Activity` 中创建 `ViewModel`1.2 在 `Fragment` 中创建 `ViewModel`2. 使用 `ViewModelFactory`2.1 创建 `ViewModel` 和 `ViewModelFactory`2.2 在 `Activity` 或 `Fragment` 中使用 `ViewModelFactory`3. 使用 `by viewModels(…...

【C语言】_指针运算

目录 1. 指针-整数 2. 指针-指针 2.1 指针-指针含义 2.2 指针-指针运算应用&#xff1a;实现my_strlen函数 3. 指针的关系运算&#xff08;大小比较&#xff09; 1. 指针-整数 联系关于指针变量类型关于指针类型和指针-整数相关知识&#xff1a; 原文链接如下&#xff1…...

多层设计模式:可否设计各层之间公用的数据定义模块?

在多层程序设计模式中&#xff0c;可以设计一个各层之间公用的数据类型定义模块。这种模块通常被称为“公共模块”或“共享模块”&#xff0c;它包含所有层都需要使用的数据类型定义。这有助于确保数据在不同层之间传递时的一致性和准确性。 以下是一些设计这种公用数据类型定…...

深度学习模型格式转换:pytorch2onnx(包含自定义操作符)

将PyTorch模型转换为ONNX&#xff08;Open Neural Network Exchange&#xff09;格式是实现模型跨平台部署和优化推理性能的一种常见方法。PyTorch 提供了多种方式来完成这一转换&#xff0c;以下是几种主要的方法&#xff1a; 一、静态模型转换 使用 torch.onnx.export() t…...

CDPHudi实战-集成spark

[一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do scp /opt/software/hudi-1.0.0/packaging/hudi-spark-bundle/target/hudi-spark3.4-bundle_2.12-1.0.0.jar cdp73-$i:/opt/cloudera/parcels/CDH/lib/spark3/jars/; done hudi-spark3.4-bu…...

Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 官方文档…...

汇编语言与接口技术--跑马灯

一、 实验要求 在单片机开发板的LED灯D1~D8上实现跑马灯。LED与单片机引脚连线电路如下图: 单片机芯片选择AT89C51&#xff0c;晶振频率设为12MHz&#xff0c;操作参考单片机开发板使用说明。跑马灯点亮的时间间隔约为1秒。分别用定时器的模式1和模式2实现。&#xff08;用P83…...

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…...

Unity网络通信相关

Socket 通信一张图搞定 谁提供服务谁绑定端口&#xff0c;建立Listener,写Host...

leetcode 173.二叉搜索树迭代器栈绝妙思路

以上算法题中一个比较好的实现思路就是利用栈来进行实现&#xff0c;以下方法三就是利用栈来进行实现的&#xff0c;思路很好&#xff0c;很简练。进行next的时候&#xff0c;先是一直拿到左边的子树&#xff0c;直到null为止&#xff0c;这一步比较好思考一点&#xff0c;下一…...

模电面试——设计题及综合分析题0x01(含答案)

1、已知某温控系统的部分电路如下图&#xff08;EDP070252&#xff09;&#xff0c;晶体管VT导通时&#xff0c;继电器J吸合&#xff0c;压缩机M运转制冷&#xff0c;VT截止时&#xff0c;J释放&#xff0c;M停止运转。 &#xff08;1&#xff09;电源刚接通时&#xff0c;晶体…...