- 博客(1902)
- 资源 (70)
- 收藏
- 关注
原创 C++类技术深度总结:从运算符重载到队列模拟实战
如何重载<<实现自定义输出;转换函数的定义与使用;使用new的类必须遵循的五大法则(析构、匹配、深拷贝、赋值、禁止复制);并用一个完整的银行排队模拟案例,将队列类的设计、动态内存管理、随机模拟等知识点串联起来。这些技术在实际项目开发中非常实用,尤其对于资源管理、数据结构和仿真模拟等场景。希望你能亲自动手敲一遍代码,加深理解。我们下期再见。
2026-03-20 08:34:12
353
原创 类和动态内存分配(复习各种技术)
至此,介绍了多种用于处理各种与类相关的问题的编程技术。可能难以掌握这些技术,下面对它们进行总结,并介绍何时使用它们。
2026-03-20 08:33:37
368
原创 手写反向传播太麻烦?让Python自动帮你搞定!
至此,我们已经实现了DeZero中最核心的自动微分机制。通过动态建立变量与函数之间的连接,我们成功让反向传播自动进行。这为后续处理更复杂的计算图(如分支、循环、共享变量等)打下了坚实的基础。在下一篇文章中,我们将继续完善这个框架,让它能够处理更复杂的计算图,并实现真正的自动梯度计算。敬请期待!思考与互动:你是否曾在手写反向传播时被复杂的链式法则搞晕?Define-by-Run的思想是否让你眼前一亮?欢迎在评论区分享你的想法!
2026-03-19 13:08:03
302
原创 手动进行反向传播(反向传播的自动化)
在上一个步骤中,我们实现的反向传播成功运行。但是,我们不得不于动编写进行反向传播计算的代码。这就意味着每次进行新的计算时,都得编写这部分代码。比如在图7- 1 所示的情况下,我们必须为每个计算图编写反向传播的代码。这样不但容易出错,还浪费时间,所以我们让Python 来做这些无聊的事情吧。接下来要做的就是让反向传播自动化。准确来说,就是要建立这样一个机制:无论普通的计算流程(正向传播)中是什么样的计算,反向传播都能自动进行。我们马上要接触到Define-by-Run 的核心了。
2026-03-19 13:05:42
350
原创 反向传播的核心秘密:链式法则与计算图的可视化解读
今天我们来聊一个几乎所有初学者都会遇到,却又常常觉得“道理我都懂,但代码一写就懵”的概念——。反向传播是神经网络训练的基石,而它的数学本质,其实就是我们高中就学过的今天,我就带大家用最直观的方式,把反向传播的来龙去脉彻底理清楚。相信我,看完这篇文章,你一定会对反向传播有一个全新的、通透的理解。
2026-03-19 08:43:59
342
原创 手动进行反向传播(Variable 类的功能扩展)
下面实现支持反向传播的Variable 类。为此,我们要扩展Variable 类,除普通值( data ) 之外,增加与之对应的导数值( g 日d )。阴影部分危新增加的代码。上面的代码在类1’1’增加了一个新的实例变iAI vad o 实例变量data 和grad都被设宣为NumPy 的多维数组( ndarray )。另外, grad 被初始化为None ,我们要在通过反向传播实际计算导数时将其设宦为求出的值。
2026-03-19 08:43:27
348
原创 反向传播的核心秘密:链式法则与计算图的可视化解读
今天我们来聊一个几乎所有初学者都会遇到,却又常常觉得“道理我都懂,但代码一写就懵”的概念——。反向传播是神经网络训练的基石,而它的数学本质,其实就是我们高中就学过的今天,我就带大家用最直观的方式,把反向传播的来龙去脉彻底理清楚。相信我,看完这篇文章,你一定会对反向传播有一个全新的、通透的理解。
2026-03-18 08:34:27
236
原创 反向传播的理论知识(链式法则)
理解反向传播的关键是链式法则(连锁律)。链(chai n) 可以理解为链条、锁链等,在这里表示多个函数连接在一起使用。链式法则意为连接起来的多个函数(复合函数)的导数可以分解为各组成的数的导数的乘积。下面看一个链式法则的具体例子。假设有一个雨数yFx,这个函数F由3 个函数组成:αAxbBα和yCb(的。该函数的计算图如图5-1所示。这时,y对z的导数可以用式子5.1 表示。
2026-03-18 08:33:50
202
原创 函数的连续调用(Exp 函数的实现)
什么是导数?简单地说,导数是变化率的一种表示方式比如某个物体的位置相对于时间的变化率就是位置的导数,即速度。速度相对于时间的变化率就是速度的导数,即加速度。像这样, 导数表示的是变化率,它被定义为在极短时间内的变化量。函数fxf(x)fx在zzz处的导数可用下面的式子表示。f′xlimh→0fxh−fxhf′xh→0limhfxh−fx式子4.1中limh→0h→0lim。
2026-03-16 08:34:01
372
原创 从零实现深度学习框架——DeZero教程:变量与函数
翻开任何一本编程入门书,你大概率会看到类似下面这张图来解释变量:图中用箱子来比喻变量,这个比喻非常形象。箱子和数据是不同的东西:箱子本身是容器,数据是放在里面的东西。箱子里可以存放数据:这就是赋值操作。打开箱子就能看到数据:这就是引用操作。接下来,我们就让DeZero的变量具备这些“箱子”的特点。NumPy的多维数组(ndarray)是深度学习中最基础的数据结构。它可以是标量(0维)、向量(1维)、矩阵(2维)甚至更高维的张量。通过ndimx0 = np.array(1) # 标量。
2026-03-13 09:13:09
409
原创 C++指针与对象:深入理解指向对象的指针和new的用法
String类的定义在头文件string1.h中(对应书中的程序清单12.4和12.5)。一个char*指针str,指向动态分配的字符数组。一个int len记录字符串长度。静态成员统计对象个数。构造函数、析构函数、复制构造函数、重载的赋值运算符、比较运算符等。每个String对象都在堆上为自己的字符串数据分配内存,并在析构时释放。这是理解后续内存管理的关键。指向对象的指针:可以指向已有对象,也可以指向new创建的动态对象。用指针跟踪对象。
2026-03-12 08:47:52
174
原创 类和动态内存分配(使用指向对象的指针)
C++程序经常使用指向对象的指针,因此,这里来练习一下。程序清单12.6 使用数组索引值来跟踪最短的字符串和按字母顺序排在最前面的字符串。另一种方法是使用指针指向这些类别的开始位置,程序清单12.7 使用两个指向String 的指针实现了这种方法。最初,shortest 指针指向数组中的第一个对象。每当程序找到比指向的字符串更短的对象时,就把shortest 重新设置为指向该对象。同样,first 指针跟踪按字母顺序排在最前面的字符串。这两个指针并不创建新的对象,而只是指向已有的对象。
2026-03-12 08:47:20
161
原创 类和动态内存分配(在构造函数中使用new 时应注意的事项)
至此,您知道使用new 初始化对象的指针成员时必须特别小心。具体地说,应当这样做。NULL、0 还是nullptr:以前,空指针可以用0 或NULL(在很多头文件中,NULL 是一个被定义为0的符号常量)来表示。C 程序员通常使用NULL 而不是0,以指出这是一个指针,就像使用‘\0’而不是0 来表示空字符,以指出这是一个字符一样。然而,C++传统上更喜欢用简单的0,而不是等价的NULL。但正如前面指出的,C++11 提供了关键字nullptr,这是一种更好的选择。
2026-03-11 08:49:34
360
原创 类和动态内存分配(在构造函数中使用new 时应注意的事项)
至此,您知道使用new 初始化对象的指针成员时必须特别小心。具体地说,应当这样做。NULL、0 还是nullptr:以前,空指针可以用0 或NULL(在很多头文件中,NULL 是一个被定义为0的符号常量)来表示。C 程序员通常使用NULL 而不是0,以指出这是一个指针,就像使用‘\0’而不是0 来表示空字符,以指出这是一个字符一样。然而,C++传统上更喜欢用简单的0,而不是等价的NULL。但正如前面指出的,C++11 提供了关键字nullptr,这是一种更好的选择。
2026-03-11 08:49:01
230
原创 手写一个String类:C++内存管理、运算符重载与静态成员实战
接下来是各成员函数的实现,注意静态成员// 初始化静态成员// 静态方法// 构造函数:从 C 字符串构造// 默认构造函数len = 0;// 拷贝构造函数// 析构函数// 赋值运算符(String 对象)if (this == &st) // 防止自赋值// 赋值运算符(C 字符串)// 下标运算符(非常量)// 下标运算符(常量)// 比较运算符重载// 输出运算符return os;
2026-03-10 08:38:00
150
原创 类和动态内存分配(改进后的新String 类)
有了更丰富的知识后,可以对StringBad 类进行修订,将它重命名为String 了。首先,添加前面介绍过的复制构造函数和赋值运算符,使类能够正确管理类对象使用的内存。其次,由于您已经知道对象何时被创建和释放,因此可以让类构造函数和析构函数保持沉默,不再在每次被调用时都显示消息。另外,也不用再监视构造函数的工作情况,因此可以简化默认构造函数,使之创建一个空字符串,而不是“C++”。接下来,可以在类中添加一些新功能。String 类应该包含标准字符串函数库cstring 的所有功能,才会。
2026-03-10 08:37:28
247
原创 深度学习的未来:从风格迁移到自动驾驶,再到反向传播的奥秘
从风格迁移到自动驾驶,从图像生成到游戏博弈,深度学习的未来充满无限可能。而这一切的根基,是像反向传播这样优雅的数学算法。作为开发者,理解这些底层原理,能让我们更好地驾驭上层应用。希望今天的分享能让你对深度学习既有宏观视野,又有微观洞察。如果你对某个方向特别感兴趣,欢迎留言,我们后续深入探讨!
2026-03-09 08:52:34
375
原创 深入浅出C++动态内存与类:从StringBad到String的进化之路
/ 增加计数// 复制长度// 分配新内存// 复制字符串内容先递增计数。根据原对象的长度分配新内存。复制字符串内容(深复制),而不是指针。通过StringBad如果一个类在构造函数中动态分配内存(即使用new),则必须显式提供:析构函数(释放内存)复制构造函数(深复制)赋值运算符(深复制)否则,默认的浅复制会导致共享内存、重复释放、计数错误等问题。这条规则通常被称为**“三法则”(Rule of Three),在C++11之后由于移动语义的引入,扩展为。
2026-03-09 08:50:54
377
原创 类和动态内存分配(动态内存和类)
解决类设计中这种问题的方法是进行深度复制(deep copy)。也就是说,复制构造函数应当复制字符串并将副本的地址赋给str 成员,而不仅仅是复制字符串地址。这样每个对象都有自己的字符串,而不是引用另一个对象的字符串。调用析构函数时都将释放不同的字符串,而不会试图去释放已经被释放的字符串。必须定义复制构造函数的原因在于,一些类成员是使用new 初始化的、指向数据的指针,而不是数据本身。图12.3 说明了深度复制。
2026-03-09 08:50:24
363
原创 深度学习(深度学习的应用案例)
前面,作为使用深度学习的例子,我们主要讨论了手写数字识别的图像类别分类问题(称为“物体识别”)。不过,深度学习并不局限于物体识别,还可以应用于各种各样的问题。此外,在图像、语音、自然语言等各个不同的领域,深度学习都展现了优异的性能。本节将以计算机视觉这个领域为中心,介绍几个深度学习能做的事情(应用)。
2026-03-06 08:37:05
190
原创 C++类的自动转换和强制类型转换详解
转换构造函数(单参数构造函数)允许从其他类型隐式转换为类类型。转换函数)允许从类类型隐式转换为其他类型。两者都可能引起二义性,需要谨慎设计。可以使用explicit修饰构造函数(C++98/03中不能用于转换函数,C++11起也可用于转换函数)来禁止隐式转换,只允许显式强制转换。在设计类时,应根据实际需求决定提供哪些转换,避免滥用导致代码难以理解。掌握类的类型转换,能让我们编写的类更加自然、易用,就像内置类型一样。希望本文能帮助你更好地理解和应用C++的这一重要特性。
2026-03-06 08:36:09
220
原创 使用类(类的自动转换和强制类型转换)
下面介绍类的另一个主题——类型转换。本节讨论C++如何处理用户定义类型的转换。在讨论这个问题之前,我们先来复习一下C++是如何处理内置类型转换的。将一个标准类型变量的值赋给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型。例如,下面的语句都将上述赋值语句都是可行的,因为在C++看来,各种数值类型都表示相同的东西——一个数字,同时C++包含用于进行转换的内置规则。然而,第3 章介绍过,这些转换将降低精度。例如,将3.33 赋给int 变量。
2026-03-06 08:35:30
364
原创 深度学习加速秘籍:从GPU到分布式,让训练快如闪电!
从上面的介绍可以看出,深度学习的高速化并非单一技术,而是算法、硬件、系统协同优化算法层面,我们聚焦卷积层优化,设计更高效的网络结构;硬件层面,GPU 提供了强大的并行计算能力,且持续演进;系统层面,分布式框架让大规模集群的训练成为可能;数值层面,精度缩减降低了存储和带宽压力,使模型更适合部署。未来,随着模型规模继续扩大,对计算速度的要求只会越来越高。但好消息是,无论是 GPU 硬件,还是分布式框架,都在飞速发展。
2026-03-05 08:43:18
318
原创 深度学习(深度学习的高速化)
随着大数据和网络的大规模化,深度学习需要进行大量的运算。虽然到目前为止,我们都是使用CPU进行计算的,但现实是只用CPU来应对深度学习无法令人放心。实际上,环视一下周围,大多数深度学习的框架都支持GPU(Graphics Processing Unit),可以高速地处理大量的运算。另外,最近的框架也开始支持多个GPU或多台机器上的分布式学习。本节我们将焦点放在深度学习的计算的高速化上,然后逐步展开。深度学习的实现在8.1节就结束了,本节要讨论的高速化(支持GPU等)并不进行实现。
2026-03-05 08:42:10
336
原创 C++重载运算符:成员函数还是非成员函数?深度解析与实战案例
运算符重载是C++赋予程序员的强大工具,它让自定义类型的行为更自然、更直观。选择成员函数还是非成员函数,需要根据运算符的特性、类的封装需求以及期望的灵活性来决定。通过本文的Vector类案例,我们不仅掌握了运算符重载的具体写法,更体会了如何通过状态成员和友元函数设计出健壮、易用的类。希望这篇文章能帮助你深入理解C++运算符重载的精髓。如果你有任何疑问或想法,欢迎在评论区留言讨论!
2026-03-05 08:41:34
383
原创 使用类(重载运算符:作为成员函数还是非成员函数)
对于很多运算符来说,可以选择使用成员函数或非成员函数来实现运算符重载。一般来说,非成员函数应是友元函数,这样它才能直接访问类的私有数据。例如,Time 类的加法运算符在Time 类声明中的原加法运算符需要两个操作数。对于成员函数版本来说,一个操作数通过this 指针隐式地传递,另一个操作数作为函数参数显式地传递;对于友元版本来说,两个操作数都作为参数来传递。:非成员版本的重载运算符函数所需的形参数目与运算符使用的操作数数目相同;而成员版本所。
2026-03-05 08:41:01
407
原创 深度学习简史:从AlexNet到ResNet,ImageNet如何引爆AI革命
从AlexNet到ResNet,短短几年间,图像识别错误率从25%以上降到3.5%,深度学习彻底改变了计算机视觉。这些经典网络不仅推动了学术研究,也催生了无数应用:人脸识别、自动驾驶、医学影像分析……如今,Transformer架构(ViT、Swin等)又开始挑战CNN的地位,但无论如何,这段“小历史”中的智慧——更深的层、更巧的连接、更高效的结构——将永远启发着后来的研究者。
2026-03-03 09:15:23
356
原创 深度学习(深度学习的小历史)
一般认为,现在深度学习之所以受到大量关注,其契机是2012 年举办的大规模图像识别大赛ILSVRC(ImageNet Large Scale Visual RecognitionChallenge)。在那年的比赛中,基于深度学习的方法(通称AlexNet)以压倒性的优势胜出,彻底颠覆了以往的图像识别方法。2012年深度学习的这场逆袭成为一个转折点,在之后的比赛中,深度学习一直活跃在舞台中央。本节我们以ILSVRC这个大规模图像识别比赛为轴,看一下深度学习最近的发展趋势。
2026-03-03 09:14:45
589
原创 C++友元详解:友元函数与重载__运算符
friend友元函数提供了成员函数与外部函数之间的桥梁,使得非成员函数也能访问类的私有成员。常用于重载运算符,特别是当左侧操作数不是本类对象时(如)或需要与标准输出流配合时(如重载<<友元函数不是成员函数,但在类中声明时需加friend关键字,定义时则不加。重载<<时应返回ostream&以支持链式输出,这是C++中非常实用的惯用法。掌握友元,让你的C++类接口更加灵活、自然!
2026-03-03 09:14:11
551
原创 使用类(友元)
您知道,C++控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以致于不适合特定的编程问题。在这种情况下,C++提供了另外一种形式的访问权限:友元。通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。下面介绍友元函数,其他两种友元将在第15 章介绍。介绍如何成为友元前,先介绍为何需要友元。在为类重载二元运算符时(带两个参数的运算符)常常需要友元。将Time 对象乘以实数就属于这种情况,下面来看看。
2026-03-03 09:13:37
240
原创 深度学习进阶:手写数字识别99.38%准确率的网络是怎样炼成的?
简单说,就是人为地“制造”更多训练数据。比如对原始图像施加微小的变化(旋转、平移、翻转、缩放、亮度调整等),生成新的图像(图4)。这样一来,训练集就变大了,模型能学到更多不变性特征,泛化能力自然更强。对于MNIST,你可以随机平移几个像素、稍微旋转一下,甚至添加噪声。这些操作都不会改变数字的本质,但能极大地丰富训练样本。实现起来也不难,有兴趣的读者可以自己尝试,效果立竿见影。用3×3小卷积核堆叠,减少参数,增加非线性;配合He初始化、Adam、Dropout。
2026-03-02 08:42:52
279
原创 深度学习(加深网络)
关于神经网络,我们已经学了很多东西,比如构成神经网络的各种层、学习时的有效技巧、对图像特别有效的CNN、参数的最优化方法等,这些都是深度学习中的重要技术。本节我们将这些已经学过的技术汇总起来,创建一个深度网络,挑战MNIST数据集的手写数字识别。
2026-03-02 08:42:19
292
原创 C++运算符重载详解:让对象操作更自然
运算符重载是函数重载的扩展。函数重载允许我们定义多个同名但参数列表不同的函数;而运算符重载则将这一概念扩展到运算符上,使同一个运算符可以针对不同的操作数类型执行不同的操作。实际上,C++本身已经对许多内置运算符进行了重载。例如,运算符既可以用于指针解引用,也可以用于两个数字的乘法;<<运算符既可以作为位左移,也可以与cout配合用于输出。编译器根据操作数的数目和类型来决定采用哪种操作。让用户定义类型的操作与内置类型的操作一样自然。例如,如果我们有一个表示时间的Time// 2小时35分钟。
2026-03-02 08:41:44
239
原创 使用类(运算符重载)
下面介绍一种使对象操作更美观的技术。运算符重载是一种形式的C++多态。第8 章介绍了C++是如何使用户能够定义多个名称相同但特征标(参数列表)不同的函数的。这被称为函数重载或函数多态,旨在让您能够用同名的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型(想象一下,如果必须对不同的物体使用不同的动词,如抬起左脚(lift_lft),拿起汤匙(lift_sp),英语将会多么笨拙)。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++(也包括C 语。
2026-03-02 08:41:13
367
原创 经典CNN大对决:从LeNet到AlexNet,深度学习的进化之路
LeNet和AlexNet,一个是奠基者,一个是引爆者。LeNet:发明了“轮子”,证明了这个方向可行AlexNet:给“轮子”装上了发动机,让它真正跑起来从LeNet到AlexNet,我们看到的不仅是网络结构的演进,更是整个技术生态的成熟。今天,当我们使用各种花哨的CNN变体时,别忘了致敬这两个开创性的工作!思考题:你觉得下一个像AlexNet这样的里程碑式网络会是什么?欢迎在评论区留言讨论!参考文献。
2026-02-28 08:54:39
602
原创 卷积神经网络(具有代表性的CNN)
关于CNN,迄今为止已经提出了各种网络结构。这里,我们介绍其中特别重要的两个网络,一个是在1998 年首次被提出的CNN元祖LeNet[20],另一个是在深度学习受到关注的2012 年被提出的AlexNet[21]。
2026-02-28 08:53:59
392
原创 C++中的抽象数据类型(ADT)与栈的实现
在编程中,我们常常需要处理一些通用的概念,而不局限于具体的语言或实现细节。例如,“栈”是一种数据结构,它只允许在一端(称为栈顶)添加或删除元素。这种描述不涉及具体是用数组还是链表,也不关心存储的元素是什么类型。这种用通用方式描述数据类型的方式,就是抽象数据类型(ADT)。ADT关注的是“做什么”,而不是“怎么做”。它定义了数据的逻辑结构和允许的操作,将实现细节隐藏起来。公有接口描述操作,私有成员隐藏实现。用接口描述行为,用实现隐藏细节。C++类天然支持这种封装,使得我们可以构建出可靠、易维护的代码。
2026-02-28 08:53:19
646
TossDisplayForm.rar
2021-01-26
FilePathCopy.rar
2021-01-27
DynamicallyDisplayMenusWithTreeLists.rar
2021-01-22
FocusChangeColor.rar
2021-01-22
C# 指定时间可具体到某个时间对日志文件进行删除
2023-11-22
C# WinForm 读取多张图片、缩放、平移,缩放后可恢复原图
2022-11-05
C# textbox输入数字,也可以软键盘输入
2022-10-12
C# button textbox 控件实现功能输入数字
2022-10-07
ImageThumbnail.rar
2021-02-03
ChineseValidateCode.rar
2021-01-30
FileSizeProgress.rar
2021-01-29
APopoverShowsProgress.rar
2021-01-29
CopyDataGridDataByImitatingExcel.rar
2021-01-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅