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

【博士每天一篇文献-算法】Fearnet Brain-inspired model for incremental learning

阅读时间:2023-12-16

1 介绍

年份:2017
作者:Ronald Kemker,美国太空部队;Christopher Kanan,罗切斯特大学
期刊: arXiv preprint
引用量:520
Kemker R, Kanan C. Fearnet: Brain-inspired model for incremental learning[J]. arXiv preprint arXiv:1711.10563, 2017.
image.png
image.png
提出一种名为 FearNet 的新型神经网络模型,这个模型受到大脑记忆机制的启发,用于解决增量学习中的灾难性遗忘问题。FearNet 模型不存储先前的例子,使其具有内存效率。它使用一个由大脑启发的双记忆系统,新记忆从受海马体复合体启发的网络巩固到受内侧前额叶皮层启发的长期存储网络。记忆巩固的灵感来自于睡眠期间发生的过程。FearNet 还使用一个受基底外侧杏仁核启发的模块来确定在回忆时使用哪个记忆系统。

2 创新点

  1. FearNet 的架构包括三个神经网络:一个受海马体复合体启发的用于快速回忆的近期记忆系统,一个受内侧前额叶皮层启发的用于长期存储的网络,以及一个受基底外侧杏仁核启发的用于确定使用哪个记忆系统进行回忆的网络。
  2. 受到睡眠期间记忆重放的启发,FearNet 使用生成式自编码器进行伪重放,这通过生成先前学习的例子并在巩固期间与新信息一起重放,减轻了灾难性遗忘,这个过程不涉及存储以前的训练数据。FearNet 使用了一个受基底外侧杏仁核启发的模块来决定在特定情况下应该使用哪个记忆系统进行回忆,这增加了模型的灵活性和准确性。
  3. FearNet 在大型图像(CIFAR-100、CUB-200)和音频数据集(AudioSet)上取得了最先进的结果,并且具有相对较小的内存占用,展示了双记忆模型如何被扩展。

3 相关研究

  1. 重放(Rehearsal)方法:通过在新学习会话中混合旧样本来模拟独立同分布条件,以减少灾难性遗忘。这种方法需要存储所有训练数据。 参考论文:Hetherington P A, Seidenberg M S. Is there “catastrophic interference” in connectionist networks?[C]//11th Annual Conference Cognitive Science Society Pod. Psychology Press, 2014: 26-33.
  2. 伪重放(Pseudorehearsal):由 Robins (1995) 提出,不重放过去的训练数据,而是生成新的例子。这种方法启发了 FearNet 的记忆巩固方法。 参考文献:Robins A. Catastrophic forgetting, rehearsal and pseudorehearsal[J]. Connection Science, 1995, 7(2): 123-146.
  3. PathNet:使用进化算法找到 DNN 的最优路径,然后冻结该路径上的权重。它假设每个学习会话都看到所有类别,不适合增量类别学习。 参考文献:Fernando C, Banarse D, Blundell C, et al. Pathnet: Evolution channels gradient descent in super neural networks[J]. arXiv preprint arXiv:1701.08734, 2017.
  4. Elastic Weight Consolidation (EWC):一种正则化方案,将可塑性重定向到对之前学习会话不太重要的权重上。 参考论文:Kirkpatrick J, Pascanu R, Rabinowitz N, et al. Overcoming catastrophic forgetting in neural networks[J]. Proceedings of the national academy of sciences, 2017, 114(13): 3521-3526.
  5. Fixed Expansion Layer (FEL) 模型:通过使用稀疏更新来减轻灾难性遗忘,具有连接性约束的第二隐藏层(FEL层)在训练期间不更新。 参考论文:Coop R, Mishtal A, Arel I. Ensemble learning in fixed expansion layer networks for mitigating catastrophic forgetting[J]. IEEE transactions on neural networks and learning systems, 2013, 24(10): 1623-1634.
  6. GeppNet:使用自组织映射(SOM)作为长期记忆,输入通过二维格子重新组织,并通过简单的线性层进行分类。 参考论文:Gepperth A, Karaoguz C. A bio-inspired incremental learning architecture for applied perceptual problems[J]. Cognitive Computation, 2016, 8(5): 924-934.
  7. iCaRL 框架:一种增量类别学习框架,使用 DNN 进行监督表示学习,通过存储的示例和学习会话数据更新 DNN。 参考论文:Rebuffi S A, Kolesnikov A, Sperl G, et al. icarl: Incremental classifier and representation learning[C]//Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2017: 2001-2010.

4 算法

4.1 模型结构

image.png
图1展示了FearNet模型的结构,它由三个受大脑启发的模块组成,这些模块分别对应于人类大脑中的不同部位,具体如下:

  1. mPFC (Medial Prefrontal Cortex, 内侧前额叶皮层):这部分负责长期存储(long-term storage)。在FearNet中,mPFC作为一个神经网络,被训练来重建其输入(使用对称的编码器-解码器,即自编码器),并计算分类概率。mPFC的设计允许它通过自编码器生成伪示例,这有助于在不需要存储先前训练样本的情况下进行记忆巩固。
  2. HC (Hippocampal Complex, 海马体复合体):这部分负责近期存储(recent storage)。在FearNet中,HC被建模为一个概率神经网络,它使用存储的训练样本来计算输入特征向量属于某个类别的条件概率。一旦HC中的例子被巩固到mPFC,它们就会被从HC中移除。
  3. BLA (Basolateral Amygdala, 基底外侧杏仁核):这部分用于决定在回忆时使用mPFC还是HC。BLA在预测时使用,以确定应该使用短期记忆系统还是长期记忆系统来进行输入的分类。BLA的输出是一个介于0和1之间的值,值为1表示应该使用mPFC进行分类。

FearNet通过这三个模块的交互来实现增量学习,其中mPFC和HC分别处理长期和近期的记忆存储,而BLA则在预测阶段决定使用哪个记忆系统。这种设计模仿了大脑如何处理和巩固记忆,使得FearNet能够在学习新类别的同时,减少对旧类别知识的遗忘。
image.png
FearNet模型中两个子系统,分别是内侧前额叶皮层(mPFC)和基底外侧杏仁核(BLA)。

  1. mPFC (Medial Prefrontal Cortex, 内侧前额叶皮层) 子系统:
    • 负责长期存储远程记忆(long-term storage of remote memories)。
    • 在FearNet中,mPFC是一个深度神经网络(DNN),它不仅被训练来使用对称的编码器-解码器结构重建其输入(即自编码器),而且还用于计算分类概率。
    • 自编码器的重建能力允许mPFC生成伪样本,这些样本用于在不需要存储实际训练数据的情况下进行记忆巩固。
  2. BLA (Basolateral Amygdala, 基底外侧杏仁核) 子系统:
    • 在预测时使用,以确定记忆应该从短期记忆还是长期记忆中召回。
    • BLA作为决策模块,帮助FearNet在进行预测时选择最合适的记忆系统。它的输出将影响是使用HC(海马体复合体,处理近期记忆)还是mPFC(处理长期记忆)来进行特定输入的分类。

在FearNet模型中,BLA的作用是动态选择最合适的记忆系统来处理当前的输入数据。这种设计模仿了大脑如何处理记忆的检索过程,即在需要时选择从短期记忆或长期记忆中提取信息。通过这种方式,FearNet能够灵活地处理新信息和旧信息,减少灾难性遗忘,同时提高增量学习的性能。

4.2 算法步骤

(1)训练阶段

  1. 初始化mPFC:使用基础知识集初始化mPFC网络。
  2. 存储类统计信息:为基础知识中的每个类别存储均值(µt)和协方差矩阵(Σt)。
  3. 循环学习会话:对于T/2到T的每个类别c:
    • 将类别c的数据(X, y)存储在HC(海马体复合体)中。
    • 如果c满足睡眠条件(例如,每K个学习会话后):
      • 使用HC中的数据和mPFC解码器生成的伪示例对mPFC进行微调。
      • 更新所有见过的类别的均值和协方差矩阵。
      • 清除HC中的数据。
    • 否则:
      • 更新BLA(基底外侧杏仁核)网络。

(2)预测阶段

  1. 输入数据:接收输入数据X。
  2. BLA预测:BLA网络预测使用HC还是mPFC进行回忆的概率A(X)。
  3. 计算ψ值:计算ψ值,它是HC预测的最高概率与BLA输出的组合。
  4. 决策回忆
    • 如果ψ值大于mPFC预测的最高概率,则使用HC进行回忆。
    • 否则,使用mPFC进行回忆。
  5. 输出预测:返回回忆网络的预测结果作为最终输出。

5 实验分析

(1)基于蒸馏回放 的ICaRL算法
image.png
说明在增量学习中,保留足够数量的示例对于维持对先前学习类别的记忆至关重要。
(2)不同的增量学习模型性能
image.png
image.png

  1. X轴:表示模型训练过程中所见到的类别数量。随着模型学习越来越多的类别,X轴的值增加。
  2. Y轴:表示平均测试准确率,即模型对所有至今见过的类别的测试样本正确分类的比例。
  3. 曲线:每条曲线代表一个不同的模型或基线方法,包括:
  • Offline MLP:这是一个非增量学习基线,它一次性接收所有训练数据。
  • 1-Nearest Neighbor (1-NN):最近邻算法,它通过存储所有训练数据来避免遗忘。
  • GeppNet+STM:GeppNet的变体,使用固定大小的短期记忆缓冲区。
  • GeppNet:基于自组织映射的增量学习模型。
  • FEL(Fixed Expansion Layer):使用稀疏更新来减少灾难性遗忘。
  • iCaRL(Incremental Classifier and Representation Learning):一种特别为增量类别学习设计的框架。
  • FearNet:本文提出的模型,使用双记忆系统和伪重演机制。
  1. 评价指标:
  • Ω b a s e \Omega_{base} Ωbase:衡量模型对基础知识(即早期学习过的类别)的保持能力。
  • Ω n e w \Omega_{new} Ωnew衡量模型对最新学习类别的测试准确率。
  • Ω a l l \Omega_{all} Ωall衡量模型对所有至今见过的类别的综合测试准确率。
  1. 实验结论
  • FearNet的优越性能:FearNet在CIFAR-100、CUB-200和AudioSet数据集上的所有类别至今所见的平均测试准确率(Mean-class test accuracy)表现出色,这表明它在增量学习过程中有效地减少了灾难性遗忘。
  • 减少灾难性遗忘:FearNet的设计显著降低了学习新类别时对旧类别知识遗忘的风险。这一点从图4中FearNet曲线相对于其他方法保持较高准确率可以看出。
  • 与现有方法的比较:表2中列出的FearNet与其他方法相比,通常具有更高的 Ω b a s e \Omega_{base} Ωbase Ω a l l \Omega{all} Ωall值,这表明FearNet在保持基础知识和整合新知识方面更有效。
  • FearNet的内存效率:FearNet不存储先前训练的示例,而是使用生成模型来模拟旧的记忆,这使得它在内存使用上更加高效。

(3)验证BLA的有效性
image.png
展示了FearNet在使用BLA进行网络选择与已知记忆位置的理想情况(预言者)之间的性能差异。BLA能够较好地预测应该使用mPFC(长期记忆)还是HC(近期记忆)进行回忆,这表明BLA在实际应用中是有效的。
(4)记忆巩固对于维持长期记忆的稳定性分析
image.png

  • X轴:表示在FearNet模型中进行记忆巩固(或称为“睡眠”)的频率。这个频率指的是模型在连续学习新类别之前,将新学到的信息从短期记忆(HC)转移到长期记忆(mPFC)的次数。
  • Y轴:表示性能指标,是平均测试准确率或其他衡量模型性能的指标。
  • 曲线:展示了随着睡眠频率减少(即学习更多类别后进行记忆巩固的间隔变长),FearNet在不同性能指标上的变化趋势。

图中显示了随着睡眠频率的减少(即记忆巩固间隔的增加),FearNet的性能在某些方面有所下降。这表明定期进行记忆巩固对于维持长期记忆的稳定性是重要的。
(5)多模态学习能力
截屏2024-06-23 下午4.41.42.png
表4显示了FearNet在处理来自不同模态(如图像和音频)的数据时的学习能力。这表明FearNet能够适应并学习多种类型的输入数据。Ωbase指标反映了模型对基础知识的保留能力。实验发现,当基础知识集较大或更具代表性时,模型在增量学习过程中对基础知识的保留更好。Ωnew指标衡量了模型对新类别的学习能力。实验结果表明,即使在增量学习新模态的数据时,FearNet也能够有效地学习新知识。Ωall指标提供了模型在整个测试集上的整体性能的视图。这揭示了FearNet在整合新旧知识方面的能力。
(6)内存需求
截屏2024-06-23 下午4.43.40.png
FearNet显示出比其他模型更低的内存需求,这表明它在内存使用上更为高效。
(7)对角线协方差矩阵(Diagonal Covariance Matrix)代替完整的协方差矩阵(Full Covariance Matrix)对FearNet模型性能的影响。
截屏2024-06-23 下午4.44.27.png
如果性能指标下降不多,这表明模型对协方差矩阵类型的敏感度较低。使用对角线协方差矩阵通常会减少模型的内存占用,因为它只存储方差而不是完整的协方差矩阵。如果性能下降可接受,这可能是一个内存优化的有效策略。这个实验说明了在FearNet模型中使用对角线协方差矩阵作为协方差矩阵简化的一种可能方法,以及这种方法对模型性能和内存效率的潜在影响。

6 思考

(1)结构比较复杂,分为三个模块,模块之间有生物启发的复杂关系。
(2)论文的“睡眠”是一个比喻,指的是FearNet在一定数量的学习会话后进行记忆巩固的过程。

相关文章:

【博士每天一篇文献-算法】Fearnet Brain-inspired model for incremental learning

阅读时间:2023-12-16 1 介绍 年份:2017 作者:Ronald Kemker,美国太空部队;Christopher Kanan,罗切斯特大学 期刊: arXiv preprint 引用量:520 Kemker R, Kanan C. Fearnet: Brain-…...

Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toast提示(超详解)

简介  今天宏哥在这里首先给小伙伴们和童鞋们分享一个有关昙花的小典故:话说昙花原是一位花神,她每天都开花,四季都灿烂。她还爱上了每天给她浇水除草的年轻人。后来,此事给玉帝得知。于是,玉帝大发雷霆,要…...

大数据之路 读书笔记 Day1

大数据之路 读书笔记 Day1 阿里巴巴大数据系统体系架构图 1. 数据采集层 #mermaid-svg-YqqD2w3qV6jc2aGP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YqqD2w3qV6jc2aGP .error-icon{fill:#552222;}#mermaid-sv…...

吴恩达揭秘:编程Agent如何革新软件开发行业

作为 AI 领域的杰出人物,吴恩达教授对编程 Agent 的兴起表示了极大的兴趣。他认为,编程 Agent 有潜力通过自动执行繁琐的任务、提高代码质量和加速开发周期来彻底改变软件开发行业。 本文将深入探讨吴恩达对编程 Agent 的见解, 多代理系统质…...

Study--Oracle-04-SQL练习

一、SQL语句思维导图 二、SQL练习 -- 以employee_id 为排序,列出前5个人 -- FETCH select employee_id,first_name from employees order by employee_id FETCH FIRST 5 rows only; -- 以employee_id 为排序,从第6个人开始 到第10个人 -- offset …...

目前音质最好的麦克风是哪款,一文读懂无线麦克风推荐哪些品牌好

​在自媒体时代,无线领夹麦克风成为自媒体人不可或缺的助手。它帮助我们在各种环境中保持清晰声音,提升创作效率与作品质量。然而,面对众多无线麦克风产品,挑选一款性价比高、性能卓越的款式却成为难题。今天,我将分享…...

Python笔记 异常、模块与包

一、了解异常 异常的概念 什么是异常 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。 二、异常的捕获 1.知道为什么要捕获异常 世界上没有完美的程…...

spark查看日志

Logger 当 Spark 任务已经提交到集群运行后&#xff0c;可以通过以下几种方式查看LoggerFactory输出的日志&#xff1a; Web 界面&#xff1a;在 Spark 任务运行时&#xff0c;可以通过访问 Spark 的 Web UI 来查看日志。通常&#xff0c;可以在浏览器中输入http://<drive…...

【LeetCode】每日一题:LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …...

记录一个Xshell使用中Xmanager...X11转发的提示问题

希望文章能给到你启发和灵感&#xff5e; 如果觉得有帮助的话&#xff0c;点赞关注收藏支持一下博主哦&#xff5e; 阅读指南 一、环境说明1.1 硬件环境1.2 软件环境 二、问题和错误三、解决四、理解和延伸一下 一、环境说明 考虑环境因素&#xff0c;大家适当的对比自己的软硬…...

Mamba 模型

建议观看讲解视频&#xff1a;AI大讲堂&#xff1a;革了Transformer的小命&#xff1f;专业拆解【Mamba模型】_哔哩哔哩_bilibili 1. 论文基本信息 2. 创新点 选择性 SSM&#xff0c;和扩展 Mamba 架构&#xff0c;是具有关键属性的完全循环模型&#xff0c;这使得它们适合作…...

30-33、SpringBoot项目部署\属性配置方式\多环境开发(一个文件)\多环境分组(多个文件)

1、打包插件:和springboot的版本保持一致 根pom <build><plugins><!--打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.1.3</versi…...

【PyQt5】一文向您详细介绍 setContentsMargins() 的作用

【PyQt5】一文向您详细介绍 setContentsMargins() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通…...

分页查询前端对接

文章目录 添加角色修改角色当点击修改按钮后,那么就会弹出对话框,所以要设置显示为true点击修改的时候就是 要显示对话框 制作用户管理页面开发后端接口用户查询前端整合新增接口功能实现修改 添加角色 首先添加 添加表单的组件 那么总结一下 就是使用 组件 然后再使用变量接…...

从一万英尺外看libevent(源码刨析)

从一万英尺外看libevent 温馨提示&#xff1a;阅读时间大概二十分钟 前言 Libevent是用于编写高速可移植非阻塞IO应用的库&#xff0c;其设计目标是&#xff1a; 可移植性&#xff1a;使用libevent编写的程序应该可以在libevent支持的所有平台上工作。即使没有好的方式进行非…...

Linux部署SVN

一.下载与安装 &#xff08;1&#xff09;yum安装 yum install subversion &#xff08;2&#xff09;源文件编译安装 ①下载svn源文件 subversion-xxx.tar.gz&#xff08;subversion 源文件&#xff09; subversion-deps-xxx.tar.gz&#xff08;subversion依赖文件&…...

Linux高并发服务器开发(二)系统调用函数

文章目录 1 系统调用2 errno3 虚拟内存空间4 文件描述符5 常用文件IO函数6 阻塞和非阻塞7 lseek 偏移函数8 文件操作函数之stat函数9 文件描述符复制 dup10 fcnlt函数 修改文件属性11 目录相关操作12 时间相关函数 1 系统调用 根据系统调用&#xff0c;获取驱动信息、CPU的信息…...

rk3568 Android 11在系统怎样执行命令获取SN号

目录 1. 使用ADB&#xff08;Android Debug Bridge&#xff09;2. 使用Shell脚本或应用程序3. 使用系统API4. 直接在设备上使用Shell5. getprop使用方法常见属性示例注意事项 在瑞芯微RK3568 Android 11系统中执行命令或获取SN号&#xff08;序列号&#xff09;通常可以通过几种…...

PostgreSQL 性能优化与调优(六)

1. 索引优化 1.1 创建索引 索引可以显著提高查询性能。创建索引的基本语法如下&#xff1a; CREATE INDEX index_name ON table_name (column_name);例如&#xff0c;为 users 表的 username 列创建索引&#xff1a; CREATE INDEX idx_username ON users (username); 1.2 …...

win10 安装openssl并使用openssl创建自签名证书

win10创建自签名证书 下载安装配置openssl 下载地址&#xff1a; https://slproweb.com/download/Win64OpenSSL-3_3_1.exe https://slproweb.com/products/Win32OpenSSL.html 完成后安装&#xff0c;一路next&#xff0c;到达选位置的之后选择安装的位置&#xff0c;我这里选…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...