- 博客(50)
- 收藏
- 关注
原创 手撕 Transformer (2):嵌入层和位置编码的实现
本文详细讲解了Transformer输入部分的实现,包括嵌入层和位置编码。嵌入层将词汇数字表示转换为向量表示,并通过乘以$\sqrt{d_{model}}$来放大信号。位置编码为并行处理的Transformer补充顺序信息,与嵌入向量相加后输入模型。文章通过PyTorch代码演示了嵌入层的实现细节,包括随机初始化、训练更新机制以及填充处理(padding_idx)。同时解释了位置编码的必要性,指出其用于解决Transformer因并行处理而缺乏顺序感知的问题。
2026-04-02 09:09:32
303
原创 手撕 Transformer (1):Transformer 的结构拆解
本文拆解了Transformer模型的基本结构,将其分为四个主要部分:输入部分(包含文本嵌入层和位置编码)、输出部分(由Linear和Softmax组成)、编码器(N个编码器层,含多头自注意力和前馈网络)和解码器(N个解码器层,含掩码自注意力、交叉注意力和前馈网络)。文章着重于结构解析,后续将详细说明各部分功能,并提供了系列文章的链接地址供读者深入阅读。
2026-03-31 21:00:36
191
原创 Transformer 掩码张量全解析:从核心作用到代码实现
本文深入解析了Transformer模型中的两种关键掩码机制。填充掩码(Padding Mask)用于处理不定长序列中的填充噪声,通过屏蔽无效位置确保注意力机制聚焦于实际内容。未来信息掩码(Subsequent Mask)则解决解码器训练时的"信息泄露"问题,采用上三角矩阵形式强制模型在预测时只能关注历史信息。文章详细阐述了两种掩码的数学原理和代码实现,特别解释了未来信息掩码通过torch.triu生成上三角矩阵、使用uint8类型优化计算效率等关键技术细节。这些掩码机制共同保障了Tra
2026-03-30 09:53:27
439
原创 浅谈正余弦位置编码的数学原理
Transformer的位置编码采用正余弦函数形式,通过不同频率的正弦波叠加实现多尺度位置表示。设计目标包括唯一性、相对位置线性可表示性和多尺度编码。频率按维度指数衰减(底数10000为经验值),偶数维用正弦、奇数维用余弦,形成对称表示。这种编码既能区分绝对位置,又便于学习相对位置关系,是Transformer处理序列顺序的关键机制。
2026-03-13 21:45:08
498
原创 转码刷 LeetCode 笔记[3]:151. 反转字符串中的单词(Python)
反转字符串中的单词是经典的字符串操作问题,常规解法(如" ".join(reversed(s.split())))虽能通过测试,但额外空间复杂度为 O (N),无法满足 “O (1) 额外空间复杂度下原地操作” 的进阶要求。本文将拆解 “原地反转单词” 的核心思路 —— 先去除字符串中多余空格,再整体反转字符串,最后逐个反转单词内部字符,并通过快慢指针、双指针等核心技巧,详细分析实现过程中易踩坑的细节,最终给出符合进阶要求的完整原地解法。
2026-03-01 15:23:18
605
原创 转码刷 LeetCode 笔记[2]:203. 移除链表元素(python)
移除链表节点,一般用的方法是,把前驱节点的指针域指向目标节点的下一个节点。先创建虚拟头节点,指向头节点,然后通过循环找到等于。已经删除了一个节点,如果再次右移,就会在循环中漏掉一个节点。节点就不在链表里了,所以不能返回这个被废弃的。如果链表开头的节点就等于。,那在循环中,这个旧的。,它表示此时真正的头节点。
2025-08-09 11:22:38
209
原创 转码刷 LeetCode 笔记[1]:3.无重复字符的最长子串(python)
len(seen) 是不重复的字符数量,当把题目改为“允许最多两个重复”时,len(seen)输出的结果就不是子串长度了。循环,可以只要出现重复字符,就删掉一次该字符,并实现左边界右移,直到窗口中没有重复子串为止。是窗口的实际长度,也就是从 left 到 right 之间的子串长度。输入"abcabcbb",输出的是5,正确结果是3。中并没有正确地移除所有在左边界左边的字符;输入"pwwkew",输出4,正确结果是3。中的每个元素,而不是只要重复就一直删。没有真正维护滑动窗口的左边界,只是。
2025-07-31 22:43:21
1023
原创 0基础的人关于C++多态产生的一系列疑问
之前在面试的时候被问过懂不懂C++,懂不懂“多态”。我之前搞科研一直在用Python,不会C++。完全没听过“多态”这个词,只听说过“多模态”(无端联系,搞深度学习搞的)。全文主要记录了我的几大疑问:什么是多态?什么是面向对象编程?Python是面向对象编程(OOP)语言吗?什么是编译?除了面向对象编程,还有哪些编程范式?C++基类和Python父类有什么区别?
2025-03-14 19:31:54
736
原创 基于ESP32的桌面小屏幕实战[8]:任务创建
任务创建成功后,调度器会根据任务的优先级和时间片分配 CPU 时间,运行 test_task_example 函数中的代码。此处为 NULL,表示不需要任务句柄,如果需要在其他地方引用或管理此任务,可以传入指向句柄的指针,例如 TaskHandle_t 类型的变量地址。:任务名称,是一个字符串标识符,用于在调试时识别任务。:指向任务函数的指针,也就是任务的入口函数。:任务函数的输入参数,这里传递的是 NULL。是 FreeRTOS 提供的一个延迟函数,使任务进入阻塞状态,等待指定的时间后再继续执行。
2025-03-13 16:09:56
726
原创 基于ESP32的桌面小屏幕实战[7]:第一个工程Hello world!以及打印日志
本文构建下载了示例工程hello world,并在其中调用esp_log.h中的日志函数打印日志。
2025-02-05 20:45:16
975
原创 基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
本文分为两部分:Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置,可以实现用VSCode操作虚拟机。为了后续工作,搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础,包括Linux指令、Git、Makefile、裸机和RTOS。环境搭建ESP32学习方法:主要看API手册和历程API和寄存器的关系:因为寄存器的操作太复杂了,所以原厂工程师把寄存器的操作封装成API。
2025-01-25 21:02:41
1011
1
原创 基于ESP32的桌面小屏幕实战[5]:PCB下单
在选择表面处理工艺时,应综合考虑产品的具体需求、环保法规以及成本等因素。例如,对于环保要求较高的消费电子和通信设备,无铅喷锡是首选;而对于某些对焊接性能有特殊要求的工业控制或汽车电子领域,有铅喷锡可能仍有应用。同时,对于需要高平整度和良好焊接性能的高端板子,沉金工艺可能是更合适的选择。选择需要SMT贴片,让立创贴好元器件再发给我。选择了SMT贴片后,订单中会提供钢网,不需要单独下单。可以看到“焊盘喷镀”有3个选项。其他地址、联系人信息、开票、支付方式填好。我在这里选择有铅喷锡,因为我穷。
2025-01-05 22:08:59
421
原创 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
板框大小根据屏幕尺寸确定。33mm×37mm画个框,然后在右侧轮廓对象设置宽和高鼠标右键,添加圆角可以先把元件移进来,然后点击2D预览3D效果图会更直观过孔可以把顶层和底层连起来一般在整个板框设计完之后进行铺铜。铺铜指的是在PCB的闲置空间或没有布线的区域填充固体铜皮,这些铜区也被称为灌铜或敷铜。增加载流面积,提高载流能力减小地线阻抗,提高抗干扰能力降低压降,提高电源效率与地线相连,减小环路面积多层板对称铺铜可以起到平衡作用填充区域可以设置禁止铺铜。
2024-12-15 20:21:38
1742
原创 反复出现 idf.py: command not found 的解决办法
使用ESP-IDF时不用反复安装编译链、设置环境,而用 get_idf 命令代替之。
2024-12-15 19:40:38
2089
原创 基于ESP32的桌面小屏幕实战[3]:硬件设计之主控模块、墨水屏和TP、USB转串口、蜂鸣器、稳压
由于它的容量较大,它能够提供较长时间的能量存储,帮助平滑电源电压的较大波动。虽然它的容量较小,但在高频下,它的等效串联电阻(ESR)较低,因此对于高频噪声的抑制效果更好。TP触摸屏,通常指的是Touch Panel触摸屏,是一种透明的触摸感应面板,它安装在显示屏幕的前面,用于检测用户的触摸操作并将其转换为电信号,以供电子设备(如智能手机、平板电脑、触摸屏显示器等)处理。使用一个大容量和一个小容量电容的原因是它们各自对电源噪声的不同频率成分有不同的响应,共同工作可以更有效地抑制宽频谱范围内的噪声。
2024-11-11 16:30:54
1901
原创 基于ESP32的桌面小屏幕实战[2]:硬件设计之充电管理
确定SCL和SDA连接的引脚,需要在《ESP32WROOM32E ESP32WROOM32UE 技术规格书》中找哪个引脚是固定有I2C功能的。一般可以理解为输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。在ESP32的datasheet的附录“A.4. IO_MUX”表格中显示,IO34和IO35只支持输入,不支持输出。高电平最低要达到多少伏,比如给出的是3.7V,那么在3.7~VCC的范围内,单片机都会识别成高电平。点击放置就能直接用。
2024-11-06 15:13:50
1887
原创 51 单片机[11]:蜂鸣器播放提示音和音乐
如果最短的是四分音符,那么把四分音符当作1,二分音符就为2,全音符就为4。无源蜂鸣器通常由一个线圈和一个振动膜组成,当给无源蜂鸣器施加变化的电压信号时,线圈中的电流会产生变化的磁场,这使得与线圈相连的振动膜振动,从而产生声音。由开发板的原理图可知,蜂鸣器是默认被使用的。每隔1毫秒触发一次定时器中断,每次中断执行的任务都是翻转Buzzer的状态,这就相当于给蜂鸣器输入了一个频率为 500Hz 的方波,导致它持续发声。8051单片机的机器周期是晶振频率的1/12,因此在12MHz晶振下,机器周期为。
2024-10-24 16:17:13
2522
原创 解决No module named ‘triton‘的问题
在Windows系统中,这是因为triton只支持Linux系统。需要安装triton for windows
2024-09-03 17:13:01
4429
6
原创 如何在D盘创建虚拟环境?包括安装PyTorch和配置PyCharm
本文首先在D盘创建了虚拟环境,然后在虚拟环境中安装了PyTorch,最后配置了pycharm的解释器。
2024-08-31 15:00:48
3882
原创 51 单片机[9]:LED点阵屏
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
2024-07-26 11:17:48
1246
原创 51 单片机[7]:计时器
51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。定时器作用:(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作(2)替代长时间的Delay,提高CPU的运行效率和处理速度……定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。
2024-07-08 09:12:30
3162
原创 51 单片机[5]:模块化编程及LCD1602调试工具
模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。把上个例子的Delay.c和Delay.h复制粘贴到项目目录,并添加进左侧边栏。现在,在main.c文件中,可以通过鼠标右键打开Delay.h文件。选择.h文件,同样命名为Delay,点击Add。
2024-06-04 16:26:07
1238
原创 51 单片机[6]:矩阵键盘及密码锁
按下S1,显示0001,按下S3,显示0013。但是当数字很大超出数据范围时,密码就出现错误了,显示的数字就不按按下的按键显示了。,然后快速循环这个过程,最终实现所有按键同时检测的效果。当引脚输出为低时,它的驱动能力很强,可吸收相当大的电流……,然后快速循环这个过程,最终实现所有数码管同时显示的效果。按下S1,LCD显示01,按下S2,LCD显示02。:S1 ~ S9为数字1 ~ 9,S10为0,S11为确认,S12为取消。注意,要在下划线中间打一个竖杠,这样在点击模板后,光标会出现在该位置。
2024-06-04 10:36:24
1408
1
原创 51 单片机[4]:数码管显示
由数码管的引脚定义可知,89C52开发板上的数码管是4位一体的,4个数码管共阴极,通过位选确定哪个位显示数字,通过段选确定显示什么数字。P07是高位,P00是低位。这种做法节约了I/O口,但是限制了数码管的显示,因为在4个数码管中,无论几位显示,都会显示相同的数字。事实真是这样吗?事实上,我们可以利用数码管的余辉和人眼的视觉暂留来同时显示不同的数字。
2024-05-19 18:04:14
4259
原创 51 单片机[3]:独立按键控制LED
如图所示,独立按键在开发板的左下角,K1~K4。独立按键是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。独立按键在开发板原理图中的样子如下图所示。
2024-05-17 10:45:01
4699
原创 C 语言笔记:字符串处理函数
获取字符串长度函数、字符串拷贝函数、字符串追加函数、字符串比较函数、字符查找函数、字符串匹配函数、字符串转换数值、字符串切割函数、格式化字符串操作函数、const
2024-05-02 15:49:25
1163
2
原创 C 语言笔记:指针(上)
内存相关知识、指针的相关概念、指针的定义方法、指针的分类、指针和变量的关系、指针和数组元素之间的关系、指针的运算、指针数组、指针的指针、字符串和指针
2024-03-29 09:42:40
827
1
原创 如何解决 Qt 6.6.0 里 printf() 输出中文乱码?
在使用Qt 6.6.0时,printf()中出现中文时,输出可能会出现乱码,本文解决了这一问题。
2024-03-12 10:42:22
819
1
原创 C 语言笔记:函数(上)
库函数:C 库实现的自定义函数:程序员自己实现的函数系统函数:操作系统实现的函数函数的定义方法返回值类型 函数名字(形参列表) {// 函数体,函数的功能在函数体实现 }函数名字是标识符,所以需要满足标识符的命名规则形参可以有,也可以没有,也可以有多个,但是即使是没有,函数名字后面也必须加括号函数体上下位置必须有大括号如果要返回函数的结果,则return后边的变量或者值必须与函数名左边的返回值类型一致形参必须带类型,而且以逗号分隔函数的定义不能嵌套所有函数的定义是平行的。
2024-02-29 19:53:24
913
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅