自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(202)
  • 收藏
  • 关注

原创 ONNX 动态量化:核心参数调优指南

本文详细解析了ONNX动态量化中影响模型性能的关键参数配置。重点介绍了weight_type、per_channel、reduce_range和extra_options四个核心参数的优化策略,推荐使用QUInt8数据类型、开启每通道量化(per_channel=True)、保持完整数值范围(reduce_range=False),并通过extra_options启用激活值对称量化和子图融合等高级选项。文章提供了优化后的量化代码示例,并建议通过F1分数下降幅度(优秀<0.5%,合格<1.5%)和

2026-04-03 16:01:26 385

原创 RoBERTa 微调:防过拟合终极调参手册

《RoBERTa微调防过拟合调参手册》针对小数据集(~2.6k)场景,提出系统性调参策略:1)通过冻结层和Dropout限制模型容量;2)使用Weight Decay和Label Smoothing优化训练过程。文章提供四类Loss曲线诊断图谱及应对方案,详细列出Dropout、Weight Decay等核心参数的调优范围,并给出实战配置模板。调参顺序建议从基础参数开始,逐步加入正则化手段,最后提醒常见误区如过度追求低Train Loss等。核心是通过平衡模型复杂度和训练稳定性来提升泛化性能。

2026-04-03 15:59:50 360

原创 ONNX 图优化(Graph Optimization)核心笔记——记录roberta模型转换成onnx模型后的图优化动作

ONNX图优化是通过调整计算图结构来无损提升模型推理效率的关键步骤。它能删除无用节点、合并重复运算、提前计算常量,在不改变模型精度的情况下实现20%-50%的推理加速。特别适合BERT等Transformer模型,通过optimize_model函数可针对性优化注意力机制和全连接层。优化失败时可降级使用原模型,确保流程不受影响。作为模型部署前的必备环节,图优化能显著减少显存占用、提升计算效率,并为后续量化做好准备,是模型性能优化的重要手段。

2026-04-03 15:57:25 415

原创 训练与推理时 Tokenizer Padding 用法笔记

本文总结了训练与推理时Tokenizer Padding的核心用法差异。训练时需使用padding="max_length"固定长度补齐,确保批量数据形状一致,适配DataLoader并行计算。推理时则采用padding=True动态补齐,按当前批次最长文本长度补齐,减少无效计算,显著降低延迟50%-70%。关键区别在于训练求稳定(固定长度),推理求效率(动态长度)。通过对比表格和代码示例清晰展示了两种场景下的参数设置与效果差异。

2026-04-03 11:46:20 255

原创 Tokenizer 与 Embedding 核心笔记

本文介绍了NLP中Tokenizer与Embedding的核心概念与区别。Tokenizer是将原始文本转换为整数ID序列的预处理工具,负责分词、添加标记、编码映射和格式标准化,属于无语义的格式转换阶段。Embedding则是模型的第一层神经网络,将ID转换为包含语义的高维向量,具有可学习性。二者的关键区别在于:Tokenizer是外部预处理(文字→数字),而Embedding是模型内部组件(数字→语义向量)。它们共同构成了文本处理的必经流程:文本→Tokenizer→Embedding→模型,缺一不可。

2026-04-03 10:56:55 449

原创 PyTorch导出ONNX报错(ShapeInferenceError)问题笔记(含dynamo=False作用解析)

针对BERT类模型导出ONNX时出现的ShapeInferenceError问题,核心解决方案是在torch.onnx.export()中添加dynamo=False参数。该参数强制切换回传统静态导出器,避免PyTorch 2.0+默认的Dynamo动态导出器导致的形状推理错误(如将768维中间特征误判为4维输出)。经测试,该方法适用于各种环境配置(新旧版本、有无onnxscript等),能确保模型正常导出和量化。关键原理是传统导出器能准确识别BERT模型的层级结构,绕开新导出器对onnxscript的依赖

2026-04-01 19:08:15 1262

原创 什么情况是过拟合,什么情况判定为欠拟合,什么情况下判定微调后效果不如预训练,什么情况下说明是分类边界模糊,什么是权重过大导致过拟合

模型调参诊断指南 针对五大关键场景(过拟合、欠拟合、灾难性遗忘等),本文提供系统化诊断方案: 1️⃣ 过拟合 特征:训练指标完美但验证指标下降 标准:训练/验证F1差距>10%或Loss差距>0.3 方案:增加dropout/早停/权重衰减 2️⃣ 欠拟合 特征:训练/验证指标均低于基线 标准:最终F1<0.7且指标差距<5% 方案:增大学习率/减少冻结层/检查数据 3️⃣ 灾难性遗忘 特征:微调后效果不如预训练模型 标准:验证F1低于zero-shot基线 方案:减小学习率/分层解

2026-03-31 18:17:58 467

原创 什么情况是训练好验证差,什么情况判定为收敛慢,什么情况下判定为震荡,什么情况下说明是泛化差

训练状态诊断指南摘要 本文系统化拆解了四种关键训练现象的诊断方法,提供六维分析框架:现象描述、曲线特征、量化标准、原因分析、调参方案和代码监控。重点包括: 过拟合:训练指标持续优化但验证指标恶化,建议增加正则化、早停或减少训练轮数 收敛慢:损失下降缓慢,可尝试增大学习率、减少冻结层或调整batch size 指标震荡:曲线波动剧烈,需检查学习率、batch size或梯度裁剪 欠拟合:训练验证指标均不佳,应增加模型容量或调整数据预处理 文中提供量化判断标准和对应调参策略,并附代码监控示例,帮助开发者快速定位

2026-03-31 18:17:10 386

原创 RoBERTa 分类模型正则化调优实验——即dropout和冻结层对过拟合的影响

RoBERTa分类模型正则化调优实验总结 本实验研究了dropout率和冻结底层网络对中文文本四分类任务的影响。实验采用chinese-roberta-wwm-ext模型,测试了5种不同配置组合。结果显示: 提高dropout率至0.20(无冻结)能有效抑制过拟合,保持最佳性能(F1=0.8774) 冻结底层网络虽提升泛化稳定性,但会轻微降低性能(F1下降约1.3%) 最优配置为dropout=0.20且不冻结底层,其验证损失最低(0.3685),过拟合程度可控 建议后续可微调dropout率或尝试更复杂的

2026-03-19 18:01:43 376

原创 二分查找类算法题核心笔记

二分查找算法核心摘要(150字) 二分查找的核心在于处理区间长度为1时(left==right)的逻辑选择: 类型A(找边界/定值):用while left<right,当区间缩至1个元素时直接返回结果(如找最小值); 类型B(推导结果):用while left<=right,需处理最后1个元素后推导答案(如插入位置判断)。 关键区别: 类型A答案是数组已有元素位置 类型B答案需逻辑推导 更新边界时需注意: 保留可能解用right=mid 排除已检查解用left=mid+1/right=mid-

2026-02-14 10:29:37 537

原创 在做算法题时,有时不知道该用for x in range(0,n),还是for num in nums

摘要: 本文提供了一套清晰的Python循环选择指南,通过"一句话判断法"和快速决策表帮助开发者选择正确的迭代方式。核心原则是:需要索引或修改原数组时用for i in range(),仅需值时用for num in nums,两者都需要时用enumerate。文章包含实用模板、常见错误示例和自测问题,特别推荐enumerate作为通用解决方案,并总结了特殊场景的处理方法。最终建议初学者从保险的range写法开始,逐步优化选择。

2025-12-30 16:39:12 361

原创 [特殊字符] 回溯算法学习笔记(二):“选与不选“ vs “循环遍历“的抉择

本文系统分析了回溯算法的两种核心递归模式:选与不选模式(二叉决策)和循环遍历模式(多叉决策)。选与不选模式适用于元素可选可不选的场景(如子集问题),通过两次递归调用实现;循环遍历模式适用于必须做出选择的场景(如全排列问题),通过循环+递归实现。文章提供了模式选择决策指南、经典问题分类、代码模板及可视化对比,并总结了判断标准表和实用技巧(如画小规模决策树、剪枝优化)。两种模式分别对应不同的决策树结构和适用场景,掌握其本质特征能有效提升解题效率。

2025-12-30 09:55:30 610

原创 [特殊字符] 回溯算法学习笔记(一):固定长度 vs 可变长度Path的选择

回溯算法中固定长度Path与可变长度Path的对比摘要: 固定长度Path适用于结果长度确定的问题(如电话号码组合、全排列),采用预分配数组和索引赋值的方式,通过隐式覆盖实现回溯。可变长度Path适用于结果长度不确定的问题(如子集、组合),使用列表的append/pop操作,需要显式回溯。关键区别在于:固定长度关注"位置填充",可变长度关注"元素选择"。选择依据主要看问题是否要求确定长度的解,以及是排列型还是组合型问题。两种模式在部分题目中可以互换,但通常固定长度更高

2025-12-29 18:06:18 987

原创 算法中DFS & BFS 核心学习笔记

本文系统对比了DFS与BFS两种图搜索算法:BFS采用队列逐层扩展("水波纹扩散"),适合最短路径问题;DFS采用栈或递归深度优先("一条路走到黑"),擅长环检测和回溯问题。文章从核心思想、空间复杂度、应用场景、代码模板等多维度对比,并给出决策树和记忆口诀。关键差异在于BFS保证最短路径但空间消耗大,DFS空间高效但不保证路径最优。选择依据是问题需求(求最短用BFS,查环用DFS)和空间限制(宽图用DFS,深图用BFS)。

2025-12-22 11:19:20 458

原创 算法17. 电话号码的字母组合

本文介绍了如何解决电话号码字母组合问题。给定一个数字字符串,返回其对应电话按键上的所有字母组合。通过回溯算法实现:1) 建立数字到字母的映射表;2) 使用深度优先搜索遍历所有可能组合;3) 当路径长度等于数字长度时保存结果。时间复杂度为O(3^N * 4^M),空间复杂度为O(N)。适用于长度1-4的数字输入,能有效生成所有字母组合。

2025-12-16 10:11:26 171

原创 如何理解python中异步函数的await?既然是异步,不阻塞,为什么还叫作“等待”

await 并非阻塞等待,而是挂起当前协程并让出控制权给事件循环,使其能调度其他任务。它等待的是可等待对象(如协程、Task)的结果,而非直接执行函数。当遇到I/O操作时,事件循环会切换执行其他就绪任务,待操作完成后再恢复原协程。这种机制实现了单线程下的高效并发,与同步阻塞等待有本质区别。关键点在于:1) await触发异步操作执行;2) 等待期间允许任务切换;3) 仅适用于原生异步I/O操作。

2025-12-03 16:32:48 559

原创 算法55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。输入:nums = [2,3,1,1,4]输入:nums = [3,2,1,0,4]

2025-11-28 10:35:18 307

原创 算法347.前 K 个高频元素

本文介绍了一种解决"返回数组中出现频率前k高元素"问题的方法。该方法采用桶排序思想,分为三个步骤:首先统计每个元素的出现频率;然后将相同频率的元素放入对应桶中;最后从最高频开始倒序遍历桶,直到收集到k个元素。这种方法时间复杂度为O(n),其中n为数组长度,适用于大数据量情况。示例表明该方法能正确找出前k个高频元素,如输入[1,1,1,2,2,3]和k=2时,输出为[1,2]。

2025-11-28 09:48:08 193

原创 算法33. 搜索旋转排序数组

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。

2025-11-26 17:30:49 191

原创 算法34. 在排序数组中查找元素的第一个和最后一个位置

本文介绍了使用二分查找算法在有序数组中查找目标值的起始和结束位置。通过两次二分查找:第一次查找目标值首次出现的位置(左边界),第二次查找目标值最后出现的位置(右边界)。若目标值不存在,则返回[-1, -1]。该方法时间复杂度为O(log n),空间复杂度为O(1),满足题目要求。示例展示了对于输入数组[5,7,7,8,8,10],查找8返回[3,4],查找6返回[-1,-1]的情况。

2025-11-26 17:06:03 230

原创 算法74. 搜索二维矩阵

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。给你一个整数 target ,如果 target 在矩阵中,返回 true;否则,返回 false。每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。

2025-11-26 16:36:25 215

原创 算法131. 分割回文串

摘要 本文介绍了如何将一个字符串分割为所有可能的回文子串组合。通过回溯算法,从字符串起始位置开始,枚举所有可能的子串结束位置。当子串是回文时,将其加入当前路径,并递归处理剩余字符串。当处理完整个字符串时,保存当前分割方案。最终返回所有可行的回文分割方案。该方法时间复杂度为O(n*2^n),适用于长度不超过16的字符串。

2025-11-25 18:02:19 447

原创 算法79. 单词搜索

本文解决二维字符网格中查找单词是否存在的问题。通过深度优先搜索(DFS)算法,从每个网格点出发,检查能否按顺序匹配单词的所有字符。算法首先统计字符频率进行剪枝优化,然后通过递归搜索相邻单元格,使用临时标记避免重复访问。若找到完整匹配路径则返回true,否则恢复网格状态继续搜索。该方法能有效处理相邻字符组合成单词的情况,确保每个单元格只使用一次。时间复杂度为O(mn*4^L),其中m、n为网格尺寸,L为单词长度。

2025-11-25 17:59:35 177

原创 算法22. 括号生成

输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

2025-11-25 17:42:54 186

原创 算法39. 组合总和

本文介绍了一种使用深度优先搜索(DFS)解决组合总和问题的算法。给定一个无重复元素的整数数组candidates和目标值target,算法通过递归回溯的方式,找出所有可以使数字和等于target的不同组合。每个数字可以无限次使用。算法从第一个候选数开始,每次决策选择或不选择当前数,并递归处理剩余目标值。当目标值减为0时记录有效组合,否则回溯尝试其他可能。该方法保证了找到所有满足条件的组合,时间复杂度取决于组合数量(保证少于150个)。

2025-11-25 17:22:56 155

原创 算法78. 子集

摘要 本文介绍了一种使用深度优先搜索(DFS)生成数组所有子集的算法。给定一个元素互不相同的整数数组,算法通过递归方式遍历每个元素,分别考虑包含或不包含该元素的情况,最终生成所有可能的子集组合。关键点在于每次递归调用后需要恢复现场,确保路径的正确性。该算法时间复杂度为O(2^n),空间复杂度为O(n),适用于长度不超过10的数组。

2025-11-25 16:22:30 246

原创 算法46. 全排列

摘要 本文介绍了使用深度优先搜索(DFS)算法生成数组全排列的解法。给定一个不含重复数字的数组,通过递归回溯的方式枚举所有可能的排列组合。算法维护一个路径数组记录当前排列,并使用标记数组避免重复使用数字。当路径长度等于输入数组长度时,将当前排列加入结果集。时间复杂度为O(n!),空间复杂度为O(n),适用于长度不超过6的输入数组。该方法能正确处理示例中的各种情况,包括单元素数组。

2025-11-25 15:00:11 369

原创 算法208. 实现 Trie (前缀树)

本文实现了一个前缀树(Trie)数据结构,用于高效存储和检索字符串。前缀树通过树形结构存储字符串,每个节点代表一个字符,路径表示字符串。主要功能包括: insert:插入字符串 search:精确查找字符串是否存在 startsWith:查找是否存在以指定前缀开头的字符串 实现采用字典存储子节点,通过find辅助方法统一处理查找逻辑。该方法返回2表示完全匹配,1表示前缀匹配,0表示不匹配。这种实现方式在自动补全、拼写检查等场景有广泛应用,时间复杂度为O(L)(L为字符串长度)。

2025-11-24 18:07:29 423

原创 算法236. 二叉树的最近公共祖先

摘要 本文介绍了如何在二叉树中找到两个节点的最近公共祖先(LCA)。通过递归方法,从根节点开始遍历,若当前节点等于p或q则直接返回;否则分别在左右子树中查找。当左右子树分别找到p和q时,当前节点即为LCA。时间复杂度为O(n),空间复杂度为O(h),其中h为树高。该方法简洁高效,适用于所有二叉树结构。

2025-11-24 16:19:21 1045

原创 Python “nonlocal“ 关键字笔记

nonlocal关键字用于在嵌套函数中修改外层函数的变量。当需要重新赋值不可变对象(如数字、字符串)或重新绑定可变对象(如列表、字典)时,必须使用nonlocal;而仅读取变量或修改可变对象内容时则不需要。关键区别在于是否使用赋值操作(=)。简单记忆:只有使用=赋值时才需要nonlocal。

2025-11-23 13:04:39 303

原创 算法15. 三数之和

本文介绍了如何找出数组中所有和为0且不重复的三元组。通过排序数组便于去重,然后使用双指针法将三数之和问题转化为两数之和问题。在遍历过程中,外层循环固定第一个数,内层双指针寻找另外两个数,同时通过跳过重复元素避免重复解,并利用剪枝优化减少不必要的计算。最终返回所有满足条件的三元组集合。算法时间复杂度为O(n²),空间复杂度为O(1)。

2025-11-18 16:11:26 315

原创 算法155. 最小栈

摘要 设计一个支持push、pop、top操作,并能在O(1)时间内获取最小值的栈MinStack。使用辅助栈存储当前最小值,每个元素入栈时记录当前栈的最小值。push操作比较新元素与当前最小值;pop直接删除栈顶;top返回栈顶元素值;getMin返回栈顶记录的最小值。该方案通过空间换时间,保证所有操作的时间复杂度均为O(1)。

2025-11-10 18:11:30 266

原创 算法394. 字符串解码

摘要:本文提出了一种递归解决字符串解码问题的方法。给定形如"k[encoded_string]"的编码字符串,需要将其解码为重复k次的字符串。算法通过递归处理字符串中的字母和数字:遇到字母时直接拼接;遇到数字时找到匹配的括号对,递归解码括号内内容并重复k次,再处理剩余部分。该方法有效处理了嵌套编码的情况,如"3[a2[c]]"解码为"accaccacc"。时间复杂度为O(n),其中n是输出字符串长度。

2025-11-10 18:04:54 228

原创 算法739. 每日温度

本文介绍了一种使用单调栈解决每日温度问题的算法。给定一个温度数组,要求返回每个温度之后第一个更高温度出现的天数差。算法采用从右向左遍历的方式,维护一个单调递减栈来存储温度索引。对于每个温度,弹出栈中所有小于等于当前温度的元素,栈顶即为第一个更高温度的索引,计算天数差存入结果数组。该方法时间复杂度为O(n),空间复杂度为O(n),能高效处理大规模数据。

2025-11-10 17:59:37 249

原创 算法215. 数组中的第K个最大元素

文章摘要:题目要求在未排序数组中找到第k大的元素。给出了两种解法:第一种直接排序后取倒数第k个元素,但时间复杂度为O(nlogn);第二种采用快速选择算法,基于快速排序思想,通过随机选择基准值将数组分为三部分,递归缩小查找范围,平均时间复杂度为O(n)。后者是更优解,符合题目要求的线性时间复杂度。

2025-11-10 17:55:58 314

原创 算法763. 划分字母区间

摘要: 题目要求将字符串划分为多个片段,每个字母只能出现在一个片段中。通过记录每个字母的最后出现位置,遍历字符串时动态更新当前片段的右边界。当遍历位置与右边界重合时,表示完成一个片段的划分,记录其长度并开始下一个片段。示例中"ababcbacadefegdehijhklij"被划分为[9,7,8]。该算法时间复杂度为O(n),空间复杂度为O(1)(仅需存储26个字母的最后位置)。

2025-11-07 15:54:53 283

原创 算法322. 零钱兑换

本文解决了一个经典的动态规划问题——硬币找零问题。使用递归方法配合记忆化搜索,计算凑成指定金额所需的最少硬币数。算法定义了一个深度优先搜索函数dfs(i,c),表示使用前i种硬币凑出金额c的最优解。通过比较选与不选当前硬币的情况,求出最小值。时间复杂度为O(n⋅amount),空间复杂度为O(n⋅amount),其中n为硬币种类数。若无法凑出目标金额则返回-1。

2025-11-06 16:26:13 347

原创 算法72. 编辑距离

摘要 本文解决字符串最小编辑距离问题,计算将word1转换为word2所需的最少操作次数(插入、删除或替换字符)。采用记忆化深度优先搜索(DFS)方法,递归比较字符,通过三种操作路径选择最小值。使用字典c缓存中间结果避免重复计算。算法时间复杂度为O(mn),适用于500字符以内的字符串转换。示例显示"horse"转"ros"需3步,"intention"转"execution"需5步。

2025-11-04 17:50:13 284

原创 算法5. 最长回文子串

这篇文章介绍了使用动态规划方法求解最长回文子串的算法。通过构建二维数组dp[i][j]记录子串s[i...j]是否为回文串,先初始化长度为1和2的子串情况,然后逐步扩展子串长度。当两端字符相等且内部子串为回文时,当前子串即为回文串。时间复杂度O(n^2),空间复杂度O(n^2)。最终返回最长回文子串的起始索引和长度。

2025-10-27 11:32:12 159

原创 算法287. 寻找重复数

该问题要求在给定数组中找出唯一重复的数字,且不修改数组和使用常量空间。解决方案采用快慢指针法:将数组视为链表,数值作为指针指向下一位置。快指针每次走两步,慢指针走一步,当两者相遇时,将快指针重置到起点,然后两者同步前进,再次相遇点即为重复数字。该方法巧妙地将查找重复数转化为链表环检测问题,满足题目要求的时间复杂度O(n)和空间复杂度O(1)。

2025-10-22 11:17:33 218

Python3.8.0 windows64安装包

Python3.8.0 windows64安装包

2023-08-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除