- 博客(193)
- 资源 (6)
- 收藏
- 关注
原创 深度学习-10-测试
如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数。在上面的第二步骤中,我们是手动定义x = 3.0 并且我们手动求导发现导函数是 2x ,并且求得值是 6.0 ,这一步骤是否可以自动化呢?这个测试案例是测试-平方函数,我们知道 2的平方等于4 ,结果确实等于4。达到高效测试的目的。
2024-06-08 15:52:19
494
原创 深度学习-09-让函数更简单
'''step09.py优化-函数更易于使用'''if data is not None: # 新增y = self.forward(x) # 新增output = Variable(as_array(y)) # 转成 ndarray 类型output.set_creator(self) # 输出者保存创造者对象self.output = output # 保存输出者。我是创造者的信息,这是动态建立 "连接"这 一 机制的核心。
2024-06-05 22:31:32
812
原创 深度学习-08-从递归到循环
如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。前面实现的方法是递归的结构,我们知道递归的结构在调用嵌入很深的时候,效率会很低。届时要处理的是复杂的计算图,不过在使用循环的情况下,代码实现也是很容易扩展到复杂的计算图的处理,而且循环的执行效率也会变高。第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数。在这个阶段,将创建自动微分的机制。
2024-06-05 20:26:19
554
原创 深度学习-04-数值的微分
经过上面几节的学习及开发,我们已经有了变量 Variable,函数Function,复合函数的定义,接下来我们学习导数及微分。先复习高数以及高中的导数,然后实现一种数值微分的方法来求导,最后我们实现一种替代数值微分的更高效算法-反向传播算法。什么是导数导数是微积分中的一个基本概念,它描述了函数在某一点的变化率。更准确地说,导数是函数在该点附近的变化量与自变量变化量之比的极限。导函数定义导函数是函数的导数在自变量取值范围内所形成的函数。
2024-06-02 11:12:56
1047
原创 深度学习-03-函数的连续调用
本节实现了函数的连续调用,能实现连续调用,得益于我们定义的Function 类输入输出参数都是Variable 箱子变量类型。通过简单函数组合可以构成复合函数,有了复合函数,我们就可以执行复杂的计算。本节例子程序所描绘的多个函数的计算图如下所示。
2024-06-02 10:17:32
573
原创 深度学习-02-创建变量的函数
在步骤1我们定义了箱子,定义了变量,了解了变量是什么,这一章如何将变量变成魔法箱子,就是如何使用变量。使用变量,莫过于通过函数去实现,变普通箱子为魔法箱子。初中我们就学会了二次函数 f(x) = ax^2+bx+c 和反比例函数f(x) = k/x ,再熟悉不过了。在数学中,函数定义是指将一个或多个输入值(称为自变量)映射到一个输出值(称为因变量)的规则。函数通常用符号表示,例如 f(x),其中 f 表示函数名称,x 表示自变量。
2024-06-01 17:29:27
777
原创 深度学习-01-作为“箱子“的变量
"箱子 " 就是变量,里而可以仔放数据。变量的要点可以总结如下 :• 箱子和数据是不同的东两• 箱子里 可以放数据(=赋值)• 往"箱子"里看一看就能知道数据是什么在 Python 中,变量定义非常简单,不需要像其他语言那样显式声明数据类型。你只需要使用变量名,然后用等号 = 赋值即可。Python 是动态类型语言,这意味着你不需要在定义变量时指定数据类型。Python 会根据你赋的值自动推断变量类型。变量名必须以字母或下划线 _ 开头,后面可以跟字母、数字或下划线。
2024-06-01 16:33:13
523
原创 设计模式 22 访问者模式 Visitor Pattern
访问者模式是一种行为型设计模式,它允许你在不改变已有类结构的情况下,为一组对象添加新的操作。它将算法与对象结构分离,使你能够在不修改现有类的情况下,为这些类添加新的操作。访问者模式是一种强大的设计模式,但需要谨慎使用。在实施访问者模式时,需要仔细考虑元素接口和访问者接口的设计,以及具体访问者类的实现。同时,需要了解访问者模式的局限性,并选择合适的应用场景。
2024-05-28 20:44:50
1161
原创 设计模式 21 备忘录模式 Memento Pattern
备忘录模式是一种行为型设计模式,它允许你将一个对象的状态保存到一个独立的“备忘录”对象中,并在之后恢复到该状态。备忘录模式是一种强大的设计模式,可以帮助我们实现状态的保存和恢复功能。在使用备忘录模式时,需要注意封装性、管理、性能、安全性以及使用场景等方面,以确保其有效性和安全性。
2024-05-28 18:04:10
978
原创 设计模式 20 中介者模式 Mediator Pattern
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过封装对象之间的交互,促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象,将系统中对象之间复杂的交互关系集中管理,使得对象之间不直接相互通信,而是通过中介者进行通信,从而降低对象之间的耦合度,提高系统的可维护性和扩展性。在中介者模式中,中介者对象充当了协调者的角色,负责处理系统中各个相互关联对象之间的交互,对于系统其他对象来说,与中介者进行通信是唯一的接口。
2024-05-27 20:44:55
1104
原创 设计模式 19 模板模式 Template Pattern
模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。在模板模式中,定义了一个抽象类,其中包含了一个模板方法(template method),这个方法定义了算法的基本结构和步骤,但其中的具体步骤由子类来实现。模板模式主要用于在不同子类中封装通用的行为,同时保持整体算法结构的一致性。通过模板方法模式,使得父类能够控制方法的执行顺序,同时细节延迟到子类实现。通过模板模式,可以实现代码复用、减少重复代码的编写,同时保持算法的统一性和一致性。
2024-05-27 20:02:18
1296
原创 设计模式 18 迭代器模式 Iterator Pattern
迭代器模式 (Iterator Pattern) 是一种行为型设计模式,它提供了一种访问集合元素的标准方法,而无需暴露集合的内部表示。提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。核心思想来自将遍历集合的逻辑从集合本身中分离出来,封装到一个独立的迭代器对象中。迭代器对象负责维护遍历的当前位置,并提供访问下一个元素的方法。想象一个书架,上面摆满了书籍。直接访问: 你直接走到书架前,从最左边开始一本一本地拿书阅读。
2024-05-26 16:11:21
1492
原创 设计模式 17 组合模式 Composite Pattern
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。它允许你将对象组合成树形结构,以表示“部分-整体”层次关系。
2024-05-26 09:33:00
1213
原创 设计模式 16 解释器模式 Interpreter Design Pattern
解释器模式 (Interpreter Design Pattern) 是一种行为型设计模式,它定义了一种语法表示,并提供了一种解释器来解释该语法表示的句子。核心概念:语法表示 (Grammar): 定义了语言的结构和规则,通常使用上下文无关文法 (Context-Free Grammar) 来表示。解释器 (Interpreter): 一个对象,它根据语法规则解析和执行语言的句子。主要组成部分:抽象解释器 (AbstractExpression): 定义解释器的接口,包含解释方法。
2024-05-21 22:50:30
1021
原创 设计模式 15 Decorator Pattern 装饰器模式
Decorator Pattern 装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过创建一个包装对象,也称为装饰器,来包裹原始对象,装饰器对象与原始对象有相同的接口,因此可以在不改变客户端代码的情况下,增加或修改对象的功能。装饰器模式的优点包括:动态地给对象添加新的行为,而无需修改对象的源代码或继承结构。可以独立地增加对象的功能,因为每个装饰器都是独立的类。保持了类的单一职责,使得代码更易于维护和扩展。
2024-05-20 19:09:21
787
原创 Linux 内核开发 28 内核模块文件ko文件介绍
内核模块文件ko文件,格式为elf格式,ELF(Executable and Linkable Format)可执行链接格式,是一种用于存储可执行程序、目标代码、共享库和内核模块的标准文件格式。它被广泛应用于各种操作系统,包括Linux、Unix和嵌入式系统。内核模块文件ko是一种ELF格式文件,它包含了内核模块的代码和数据。我们可以使用一些工具来解析内核模块文件ko的ELF格式,以了解内核模块的内部结构和功能。参考资料。
2024-05-20 12:35:20
1188
原创 Linux 内核开发 27 POSIX共享内存
支持 POSIX 共享内存,linux 内核使用的是通过一个名为tmpfs的特殊文件系统来实现内存共享,并且将文件系统挂载在rootfs的/dev/shm上。这种实现与linux 文件系统api 相互一致,所以每个文件都有inode 与名称与之对应。使用posix 应用开发者来说,更具灵活性(相比systemv 内存共享模式)。映射实现由tmpfs文件系统处理。shm_open()是 POSIX 共享内存的 API 函数之一,用于创建或打开 POSIX 共享内存对象。
2024-05-18 18:01:48
1107
原创 Linux 内核开发 26 System V共享内存
使用 System V 共享内存时,有几个重要的注意点需要考虑:1. 键和标识符:- 在 System V 共享内存中,共享内存由一个键(key)唯一标识。在创建共享内存时,需要指定一个键。这个键可以是一个数值或者使用 `ftok()` 函数从文件路径生成。另外,共享内存还有一个与之相关联的标识符(identifier),这个标识符是由系统自动生成的。2. 共享内存大小限制:- System V 共享内存的大小受限于系统的设置,通常在 `sysctl` 中可以调整。
2024-05-18 17:03:53
832
原创 Linux 内核开发 25 - 中的 cpuidle subsystem 介绍
总的来说, cpuidle 子系统是 Linux 内核中实现 CPU 电源管理的重要组件,通过动态检测 CPU 的使用状态,选择合适的低功耗状态,并提供统一的管理接口,从而提高系统的能源效率。2. 选择低功耗状态:cpuidle 子系统会根据当前 CPU 的状态和系统的需求,选择最合适的低功耗状态,例如 C1、C2、C3 等。3. 进入低功耗状态:cpuidle 子系统会调用特定的 CPU 指令将 CPU 切换到选择的低功耗状态,需要先保存 CPU 的上下文。
2024-05-16 20:52:07
894
原创 设计模式14- Chain of Responsibility Method 责任链设计模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式。它通过把请求从一个对象传到链条中的下一个对象的方式,直到请求被处理完毕,以实现解耦。责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。该模式把这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2024-05-15 20:12:39
744
原创 24 内核开发- Linux 内核各种设计模式
内核使用桥接模式将文件系统抽象与具体的文件系统实现分离开来,如 ext4 和 XFS。实现: 内核使用策略模式来选择不同的内存管理算法,如 Buddy 系统和 SLOB。实现: 文件系统使用观察者模式来通知 inotify 模块文件系统更改。实现: 内核使用责任链模式将系统调用请求传递给一系列内核函数。实现: 内核使用状态模式来管理进程的状态,如运行、等待和停止。实现: 内核使用模板方法模式来实现文件系统操作,如读写文件。实现: 内核使用代理模式来限制对系统调用和文件操作的访问。
2024-05-15 18:00:56
1447
翻译 run0: a systemd-based, more secure replacement for sudo
SUID 进程是一个奇怪的概念:它们由非特权代码调用,并继承由非特权代码预期和控制的执行上下文。这种方法解决了对 sudo 的大量攻击媒介,并附带了许多有趣的功能,例如在使用时为您的终端提供不同的背景色调,或在终端窗口标题中显示一个小红点,以进一步指示您正在使用提升的特权。或者换句话说:目标命令在一个隔离的 exec 上下文中调用,从 PID 1 新建派生,不从客户端继承任何上下文(好吧,不可否认,我们确实传播了 $TERM,但这是一个显式异常,即允许列表,而不是拒绝列表)。
2024-05-14 19:13:18
121
原创 设计模式-13 - Prototype Design Pattern 原型设计模式
原型设计模式是一种创建对象的方式,它通过复制一个现有的对象(原型)来创建一个新对象。仅在需要创建大量相同对象时才使用原型设计模式,考虑使用对象池来管理克隆对象的创建和销毁,使用原型设计模式来创建不可变对象,以避免意外修改。探索其他设计模式,例如工厂方法模式或单例模式,以了解它们如何与原型设计模式一起使用。通过遵循这些最佳实践,您可以有效且高效地使用原型设计模式来创建对象并提高应用程序的性能。
2024-05-14 18:59:09
648
原创 设计模式-12 - Adapter Pattern 适配器设计模式
适配器模式是一种结构型设计模式,它允许具有不同接口的两个类一起工作。它通过创建一个适配器类来实现这一点,该适配器类将一个类的接口转换为另一个类所需的接口。自定义的适配器,需要考虑确保其既能满足当前需求,又能保持良好的扩展性,为未来需求预留扩展性。
2024-05-14 12:26:57
567
原创 设计模式-11 - Bridge Method 桥接模式
桥接模式是一种设计模式,它将抽象部分与其实现部分分离,使它们可以独立变化。它允许你改变抽象部分和实现部分的实现,而无需更改它们的接口。结构:抽象(Abstraction):定义抽象接口,客户端代码与之交互。实现(Implementor):实现抽象接口并提供具体行为。扩展抽象(Refined Abstraction):扩展抽象接口,提供更加具体的接口。具体实现(Concrete Implementor):实现扩展抽象接口并提供具体的实现。一个常见的桥接模式示例是图形绘制库。
2024-05-13 17:42:52
781
原创 设计模式-10 - Memento Design Pattern
备忘录模式是一种设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。其结构:Originator:创建和管理备忘录的对象。Memento:存储 Originator 状态的备忘录对象。Memento 对象是不可变的。Caretaker:存储 Memento 对象,而不了解其实际内容。示例:一个文本编辑器可以使用备忘录模式来存储文档的状态,以便用户可以撤消和重做编辑操作。
2024-05-13 15:13:35
632
原创 设计模式-09 - 享元模式 flyweight pattern
享元模式是一种设计模式,它使用共享对象来减少内存使用和提高性能。它通过存储共享的对象实例池来实现,这些实例可以被多个客户端同时使用。享元模式定义了一个接口,使客户端可以访问共享的轻量级对象。享元可以根据其内部状态进行细分,客户端只需要提供它需要的状态即可。享元对象被存储在共享池中,如果客户端请求一个已经存在的享元,则会返回该享元,否则会创建一个新的享元并将其添加到池中。| || || || |Flyweight Factory:创建和管理享元对象。
2024-05-11 18:53:18
706
1
原创 设计模式-08 - 模板方法模式 Template Method
模板方法模式是一种设计模式,它定义了一个操作的骨架,而由子类来决定如何实现该操作的某些步骤。它允许子类在不改变算法结构的情况下重定义算法的特定步骤。模板方法模式适合用于以下情况:需要定义一个算法的骨架,但允许子类实现特定步骤:例如,一个排序算法,其中骨架定义了排序过程,而子类定义了具体的比较方法。需要避免在子类中重复代码:例如,一个图形绘制框架,其中抽象类定义了绘制过程的骨架,而子类定义了绘制特定形状的具体方法。
2024-05-10 19:38:59
738
原创 23 内核开发- Linux 内核下半段的实现方式
下半部,就是执行中断处理密切相关但是中断处理程序本身不执行的工作。linux 2.6后,内核提供了三种方式实现下半部:软中断,tasklets和工作队列。以前曾经用过的BH和任务队列接口已经废除。
2024-05-10 19:23:27
423
原创 设计模式-07 设计模式-观察者模式(Observer Pattern)
观察者模式是一种软件设计模式,它定义了一种一对多的依赖关系,其中一个对象(称为“主题”)维护了一个依赖对象的列表(称为“观察者”),并且当主题的状态发生变化时,它会自动通知所有观察者。仅在需要时使用观察者模式。它可能会引入一些开销和复杂性。心中明白清楚地定义观察者订阅和取消订阅的机制。考虑使用观察者模式的变体,例如发布/订阅模式或模型-视图-控制器 (MVC) 模式。在设计观察者模式时,牢记 SOLID 原则(单一职责、开放/封闭、里氏替换、接口隔离和依赖反转)。
2024-05-09 19:14:42
575
原创 22 内核开发-宏内核,微内核探秘
微内核与宏内核 PK 分析微内核和宏内核都是有效的操作系统架构,各有优缺点。微内核更安全、更具可扩展性和可移植性,而宏内核则提供更高的性能、更好的设备支持和更高的稳定性。在选择操作系统架构时,必须考虑特定系统的需求。对于需要高安全性、可扩展性和可移植性的系统,微内核是一个更好的选择。对于需要高性能、更好的设备支持和更高稳定性的系统,宏内核是一个更好的选择。值得注意的是,现代操作系统(如 Linux 和 Windows)实际上采用了混合架构,结合了微内核和宏内核元素。
2024-05-09 09:08:44
1093
原创 设计模式-06 设计模式-Facade Pattern门面模式
门面模式(Facade Pattern)定义门面模式为一个子系统提供了一个统一的接口,从而简化了对该子系统中多个组件的访问。它通过为客户端提供一个单一的入口点来隐藏子系统的复杂性,从而使客户端能够以更简单的方式与子系统交互。门面模式结构Facade(门面):这是一个包装类,提供了一个简化的接口来访问子系统。Subsystem(子系统):这是门面模式表示的实际子系统。它由多个组件组成,这些组件共同提供一些功能。门面模式工作原理客户端通过门面类与子系统进行交互。
2024-05-08 20:17:17
1043
1
原创 设计模式-05 设计模式-命令行设计模式 Command Pattern
命令模式是一种设计模式,它将请求封装成一个对象,从而使您可以用不同的方式参数化请求、队列请求以及支持可撤销的操作。命令模式将一个请求封装成一个对象,从而使您可以用不同的方式参数化请求、队列请求以及支持可撤销的操作。将请求封装成对象:命令模式将每个请求封装成一个独立的对象,称为“命令”对象。参数化请求:命令对象可以存储与请求相关的所有信息,包括接收者、动作和任何其他必要的参数。队列请求:命令对象可以存储在一个队列中,以便按顺序或并发执行。
2024-05-08 18:15:45
749
原创 21 内核开发-临界区及临界区代码段判断
临界区是计算机系统中的一段代码,在任何时刻只能被一个线程执行。临界区的目的是防止多个线程同时访问共享资源,从而避免数据损坏或其他问题。互斥:在任何时刻,只能有一个线程执行临界区中的代码。有限等待:一个线程不能无限期地等待进入临界区。如果临界区被其他线程占用,等待的线程必须在有限的时间内获得访问权。临界区代码指的是一段代码路径,代码或者系统中必须同时满足以下两个条件才能称得上是临界区代码条件一:代码路径可能是并发的,也就是说,存在它可以并行运行的可能性。并且。
2024-05-06 19:19:44
1766
原创 设计模式-04 设计模式-Proxy Pattern 代理模式
代理模式 为一个对象提供一个代理或占位符,以便控制对该对象的访问和操作。代理可以拦截并修改对目标对象的调用,从而实现以下目的:控制访问:限制对敏感或昂贵对象的访问,只允许经过身份验证或授权的用户访问。延迟实例化:推迟创建昂贵或耗时的对象,直到真正需要时才创建。提供额外的功能(日志记录,监控):在不修改目标对象的情况下,向目标对象添加额外的功能,例如日志记录、缓存或安全检查。缓存功能:对于昂贵的对象,可以减少重复创建,减少调用真实对象的次数| || |v。
2024-05-06 17:14:58
681
原创 20 内核开发-内核源码编译结果分析及安装
bzImage 是一个压缩的内核映像文件,它是 Linux 内核编译过程的输出。它包含了内核代码和数据,但尚未与引导加载程序合并。-rw-rw-r-- 1 peach peach 10560992 5月 5 12:40 bzImage。bzImage 文件用于将内核加载到内存中,以便在引导过程中启动 Linux 操作系统。它可以由引导加载程序(例如 GRUB)加载,引导加载程序负责引导内核并将其传递控制权。一旦加载到内存中,bzImage 将解压缩并执行,从而启动内核。(1) 生成文件作用。
2024-05-05 21:20:19
441
内核模块开发-字符设备课程代码
2024-04-21
字幕批量转换工具vtt-srt
2024-04-18
Deep Learing with python +Deep Learing with python Keras合集
2017-12-04
movie_preferences
2013-12-10
Reinforcement Learning an Introduction 第二版有正事封面版
2018-11-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人