免费的午餐已经结束,你准备好了吗?

Trae Work免费Ubuntu云电脑体验:零成本Linux学习与轻量测试指南 在云计算和远程开发日益普及的背景下,SaaS化服务为开发者提供了更灵活的环境部署方案。其核心原理是通过虚拟化技术在云端分配计算资源,并通过浏览器实现远程访问,从而将本地环境与云端隔离。这种模式的技术价值在于大幅降低了环境配置的复杂度和硬件依赖,使得快速验证和跨平台测试成为可能。典型的应用场景包括编程学习、轻量级应用测试和临时开发环境搭建。本文聚焦于Trae Work平台,它提供了一个基于浏览器的免费Ubuntu云桌面实例,让用户能够快速体验Linux操作和基础开发。针对中文用户常见的需求,文中详细介绍了在U 阅读详情
免费的午餐已经结束,你准备好了吗?
作者:杨小华
引子
2005 年3月,C++大师Herb Sutter在Dr.Dobb’s Journal上发表了一篇名为《免费的午餐已经结束》的文章,一石激起千层浪,该文引起了社区广大程序员的热烈讨论。文章指出:现在的程序员对效率、伸缩性、吞吐量等一系列性能指标相当忽视,很多性能问题都依仗越来越快的CPU来解决。但CPU的速度很快将偏离摩尔定律的轨迹,并达到一定的极限。所以,越来越多的应用程序将不得不直面性能问题。而解决这些问题的办法就是采用并发编程技术。当你读到这里的时候,第一感觉可能就是“不敢苟同”,觉得作者在危言耸听,妖言惑众 ,过分渲染并发编程的重要性。
其实不然,正如Herb Sutter所说,由于串行处理速度的限制已经把“并发编程”推到了聚光灯下,串行化技术在程序设计中的砥柱地位在未来必将被取代,一个多核与并发编程的时代必将到来。由于当今大多数程序员对并发编程还是一片空白,因此深入了解和学习并发编程已经刻不容缓。甚至,还有人提出了“不懂并发编程的程序员,不是一个合格的程序员”的观点。不管愿意接受与否,“免费的午餐”的确已经结束。
何为并发
大家也许还记得那个懵懂的中学时代吧,手捧课本,端坐教室,听华罗庚大师讲“烧水沏茶”的故事。他将统筹学原理运用到日常生活中,竟然产生事半功倍的效果,给了我们很大的启示。手敲键盘之际,调试程序之余,与同事神侃之时,我们是否应该坐下来静静地思考一下,能否将“烧水沏茶”的道理运用到程序设计与开发的过程中呢?能否在编写程序的时候把类似于劈材、打水、烧水、拿茶叶、泡茶等一系列的程序行为并发执行?答案是:完全可以。这正是“并发编程”的绝妙之处,也是本文将要给大家介绍的内容。
首先,我们来看一看“何为并发”。如果两个事件在同一时间间隔内发生就称之为并发(concurrency)。两个或多个任务在同一时间间隔内执行叫做并发执行。
我们再通过一个现实生活中的例子来阐述并发的机理。现在满大街都是减肥广告,减肥成了众多人乐此不疲的话题。但是正确的减肥方法并不能单纯地依靠节食或药物,一个好的减肥方案往往需要同时考虑“适当的节食”和“一定强度的锻炼”。我们可以把“节食”和“锻炼”看作是并发执行的任务,也就是说改进饮食结构和正规的身体训练必须要在同一时间间隔内发生,这样才可以达到减肥的目的。通过这个例子,我们可以得出这样一个结论:任何一个逻辑控制流和另外的逻辑控制流在某一时间段内相互重叠,这就是并发。并发技术使得应用程序在同一时间段内能够做更多的工作,极大地提高了效率,同时也增强了程序的可伸缩性。
软件并发的基本层次
并发总体上可分为三个层次:软件级的并发、操作系统级的并发和硬件级的并发。一般来讲,硬件级的并发和操作系统级的并发都会支持软件级的并发,由于操作系统级并发和硬件级的并发不是我们普通程序员所能支配的,所以我们着重关注软件级的并发。
并行和分布式编程是达到软件级并发的两种基本途径。它们是两种不同的,但有时又相互交叉的编程方法。并行编程技术是将程序分配给单个或多个处理器运行,这些处理器通常在某一个物理或虚拟的计算机内;而分布式编程技术是将程序分配给两个或多个处理器运行,这些处理器可能在也可能不在同一个计算机中。在纯粹的并行程序中,并发执行的部分往往都是同一个程序中的某些部分,而在分布式程序中,这些并发执行的部分通常往往被实现成分离的程序 。这两者之间的区别及程序的典型结构如图1和图2所示:

图1 并行程序的典型系统结构
图2分布式程序的典型系统结构
一般而言,软件级的并发可分为如下几个层次:
1.         指令级的并发
当一条单指令中的多个部分被同时执行时,便产生了指令级的并发。这种并发执行对象的划分粒度是最小的,以指令或指令中的某一部分为单位。下面我们来看一个简单的指令级并发实例,如图3所示。
图3 指令级并发实例
例如代码中的(a+b)和(c-d)部分,就能够同时执行。这种并发通常由编译器指令所支持,而不受程序员的直接控制。关于指令级的并发,可以参看《Intel C++9.0 迈向多核CPU时代的终极优化利器》(2005年第7期《程序员》)一文中的“编译器自动并行化”部分。
2.         例程(函数/ 程序)级的并发
如果应用程序中的某一逻辑可以分解成若干互不相干的函数,那么就可以将这些函数分配给不同的进程或线程,让这些函数并发执行来提高工作效率。这种并发执行对象的划分粒度较小,以函数为单位,次之于指令级并发。在实际的程序开发过程中,这种级别的并发是最常见的一种。笔者曾经参与过一个项目,所负责的部分里有一个模块要求将各种图像格式转换成JPG格式,同时获取相关图像数据(长、宽、高、角版/切版、DPI值等),并写入数据库中。这个模块最终就是用函数级的并发技术完成的。设置一个函数完成图像转换,另一个函数完成图像数据的获取,同时写入数据库。将这两个函数分别分配给不同的线程来执行,并在一个合适的点进行同步,如果任何一个函数失败,那么都将删除另外一个已经生成的记录。
3.         对象级的并发
这种并发执行对象的划分粒度较大,通常以对象为单位。当然,这些对象要满足一定的条件,不违背流程执行的先后顺序。如果满足以上条件,我们就可以把每个对象分配给不同的进程或线程,根据一些中间件标准,比如CORBA、ICE等,每个对象甚至可以被分配给同一网络上的不同计算机或不同网络上的不同的计算机上执行,这样就实现了对象级的并发执行。
4.         应用级的并发
这一级别的并发,相信大家并不陌生。现代操作系统都能同时并行运行数个应用程序,比如,笔者在键盘上敲下上面这些文字的同时,耳朵上还带着耳机,欣赏着美妙的音乐,这不就是典型的应用级的并发吗?这种级别的并发性可以看作是一种将单个内核用来运行多个应用程序的策略。
构建并发程序的几种机制
从上文可以看出,并发性不仅仅局限于内核,它也可以在应用程序中扮演重要角色。如例程级的并发,基于例程级并发的应用程序称为并发程序(concurrent program)。例程级的并发在很多方面都有其优势,如在多处理器上并行计算、访问慢速设备、人机交互和为多个网络客户端提供服务等等。
现代操作系统提供了三种基本的构造并发程序的机制,以下所讲述的原理不仅仅局限于windows操作系统。
1.         进程
这种并发性是指通过将程序分解成多个进程来完成,即每个逻辑控制流都是一个进程,由内核负责调度和维护。因为进程有独立的虚拟地址空间,想要和其他进程进行通信,则需要使用某种显式的进程间通讯(IPC)机制,这是基于进程设计方法的一个缺点。基于进程设计的另外一个缺点就是往往速度比较慢,因为进程控制和IPC的开销都很高。
2.         I/O 多路复用
在这种形式的并发编程中,应用程序在一个进程的上下文中显式地调度它们自己的逻辑流。逻辑流被模型化为状态机,作为数据到达文件描述符的结果,主程序显式地从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享同一地址空间。
对Unix /Linux熟悉的读者对这一机制并不陌生。在Linux下提供了select/poll/epoll等各种方法,在BSD一类系统中,还提供了Kqueue方法。
I/O多路复用技术可以用作并发事件驱动程序的基础。在事件驱动中,流是作为某种事件的结果前进的。服务器使用I/O多路复用,借助select之类的函数,检测事件的发生。很明显,采用这类方法设计程序,将使程序变得很复杂。
3.         线程
除了将程序分解成多个进程来执行外,还可以分解成多个线程来执行。线程是运行在一个单一进程上下文中的逻辑流,由内核负责调度。一个线程就是运行在一个进程上下文中的一个逻辑流。如典型的windows完成端口IOCP,就是利用线程池来提供服务。
并发程序设计的难点
在软件开发和设计过程中,串行化编程的思想已经根深蒂固,以至于很多程序员都发觉难以适应,仍然固守着串行编程的习惯。然而在并行编程世界中所有的一切都已经发生了变化。在并行编程世界中,程序可以被分解成多个任务,并且每个任务都可以在相同的时间点执行,每个任务又可以被分配给多个线程来执行。程序执行的顺序和位置通常是不可预知的,多个任务能够在任意处理器上同时开始执行,但是不确定首先完成哪个任务,按照什么次序来完成这些任务,以及由什么处理器来执行这些任务。除了多个任务能够并行执行外,单个任务也可能具有能同时执行的部分和子任务。此时就不得不对并行执行的任务加以协调,让这些任务之间进行彼此通信,以便在它们所完成的作业之间实现同步。
编写并发程序,主要存在着以下三大基本的挑战:
1.         确认问题领域的环境中存在的固有并行性;
2.         将软件适当地分解成两个或多个任务,这些任务可以在同一时刻执行,即这些任务可以被并发执行;
3.         协调上述过程中所分配的任务,使软件正确而高效地运行,从而达到预期的目的。
用一句话概括这三点就是:发现并确认、分解、通信和同步。
无论使用哪种并发机制,都会存在着如下几种障碍:对共享数据的并发访问,目前提出的解决方案是通过对信号量的P/V原语操作来进行同步,当然也存在着其他同步技术,比如JAVA的多线程就是用一种叫做JAVA监控器的机制来进行同步。
并发同时也引入了一些其他问题,比如:被调用的函数必须具有一种称为线程安全的属性。一个函数被称为线程安全的,当且仅当该函数被多个并发线程反复地调用时,它会一直产生正确的结果。有一类重要的线程安全函数,叫做可重入函数,其特点就是:当这类函数被多个线程调用时,不会引用任何共享数据。可重入性函数是线程安全函数的一个真子集,他们之间的关系如下图所示:

图4 可重入函数、线程安全和线程不安全函数之间的集合关系
竞争和死锁也是并发编程中出现的一类典型问题。当程序员错误的假设逻辑流该如何调度时,就会发生竞争,若调度产生错误,就有可能发生一个流等待一个永远不会发生的事件或流,就会产生死锁。
总结
本文只起一个抛砖引玉的作用,并发编程博大精深,非一两篇文章所能阐述透彻。由于现行的大多数编程语言都没有支持并行性的关键字(是否所有的语言都不支持,笔者不敢枉下结论),所以需要我们自己在实际的编程过程中摸索前进。但也不需要我们白手起家,业界提供了不少支持并发编程的标准和库,例如比较流行的有MPICH/PVM/MICO等。最普遍的并行和分布式编程环境是集群、MPP和SMP计算机。笔者希望和所有的并发编程爱好者结交朋友,可以通过 normalnotebook@126.com联系。并在此非常感谢我MM为我修改这篇文章,功劳属于你。
参考文献
[1] Cameron Hughes ,Tracey Hughes.Parallel and Distributed Programming Using C++
[2] Herb Sutter.The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
[3] Randal E.Bryant,David O’Hallaron.深入理解计算机系统
 
 
AI辅助开发与免费云服务器:零成本搭建微信小程序全栈Demo 在软件开发领域,AI代码生成技术正成为提升开发效率的重要工具,它通过理解自然语言描述,自动生成代码片段、解释逻辑或搭建项目框架,其核心原理基于大规模预训练语言模型对编程语言和开发模式的学习。这项技术的工程价值在于显著降低特定编码环节的门槛,尤其适合快速原型验证、辅助学习及自动化重复性编码任务。在应用场景上,AI编程助手常与云原生开发相结合,例如在微信小程序等轻量级应用开发中,开发者可利用AI快速生成前端界面与业务逻辑,同时结合云服务器资源进行后端部署。本文聚焦于如何将AI编码辅助能力与低成本云服务器资源整合 阅读详情

相关推荐

甲骨文免费实例硬盘满了?别慌!手把手教你如何免费解决(如何给甲骨文免费实例添加并挂载免费块存储进行扩容)

😭 刚用甲骨文免费实例建站就空间告急?别急着升级!其实甲骨文还藏了 200GB 的免费存储等你拿。这篇保姆级教程,带你一步步将免费块存储挂载到现有实例,彻底解决空间焦虑,让你的小服务器也能拥有海量空间!

XiaoqiangClub的博客 1081

Free Lunch is Over (免费午餐已经结束)

原文链接:The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software 免费的午餐结束了 软件并行计算的基本转折点 继OO之后软件发展的又一重大变革——并行计算 你的免费午餐即将即将结束。我们能做什么?我们又将做什么? 主要的处理器设计生产商,从Intel和AMD到SPARC和PowerPC,已经几乎穷尽了所有的传统方法来提高CPU性能。 他们专注于多线程和多...

weixin_62862113的博客 498

免费午餐已经结束——软件历史性地向并发靠拢

关于并发开发的经典读物,免费的午餐已经结束,阐述了在当今程序设计向并发靠拢的重要思想

免费午餐已经结束

本文是2005年最重要的技术文章之一,虽然我现在才读到。该文章的译作发表在2006年11月的程序员杂志上。这是本人翻译的第一篇技术文章,跟大牛的译作比起来还有很长的路要走,但毕竟是一个好的开始,下学期就要开翻译课了,先拿这篇练练手。此译文可读性极差,错误理解当然到处都是,贴出来只是为了鼓励自己,要读的话下面是别人的译作和文章原文的链接。原文:http://gotw.ca/publicati

linuxyuking的专栏 1414

TI C2000 DSP CLA实战:用F28069的协处理器实现ADC采样与PWM相位实时联动控制

本文详细介绍了如何利用TI C2000系列DSP的CLA协处理器在TMS320F28069上实现ADC采样与PWM相位的实时联动控制。通过CLA的零周期上下文切换和硬件级任务触发特性,显著提升了电机控制和数字电源应用的实时性能,特别适用于需要亚微秒级响应的场景。

weixin_30932215的博客 3968

windows10家庭版输入loadrunner注册码时报“License security violation. Operation isnot allowed”的解决办法

有可能出现2个错误第一个可能是第二个可能是“License security violation. Operation isnot allowed”ok,在此我在百度找了很多方法,大部分的方法都是删除注册表,但我根本就找不到这个注册表,而后又是管理中心找本地用户和组,但我依旧找不到这个玩意,然后可能是windows10家庭版本来就没有这个。再然后又以管理员身份去运行填写,好的,依旧报错,依旧未解决...

qq_30990097的博客 2560

MapReduce-免费午餐还没有结束?

Map Reduce - the Free Lunch is not over? 微软著名的C++大师Herb Sutter 在2005年初的时候曾经写过一篇重量级的文章:”The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software “,预言OO之后软件开发将要面临的又一次重大变革-并行计算。 摩...

匪夷所思的人 160

Dify与钉钉轻量级集成:打造企业内部AI助手

企业级聊天机器人开发已成为提升内部协同效率的关键技术。其核心原理在于通过API集成,将AI模型能力与即时通讯平台无缝连接,实现智能问答与自动化流程。从技术价值看,这种集成方案能够显著降低AI应用落地门槛,将前沿的AI能力快速转化为实际生产力。在应用场景上,它尤其适用于HR答疑、IT技术支持、产品知识库等高频内部服务场景。本文聚焦于Dify与钉钉的轻量级集成方案,通过Stream模式实现高效消息处理,并利用AI卡片支持流式输出,为企业构建体验自然的智能机器人提供了完整实践路径。该方案特别强调配置简化与部署便捷

weixin_27155667的博客 698

广州PMP考生速看!才聚考点免费供应麦当劳早午餐,安心赴考!

而在考场上,除了扎实的知识储备,一份暖心的能量补给,往往能成为从容应考的关键助力。这意味着,选择才聚培训,学员的培训、报名、考试全流程都能一站式完成,无需在机构与考点之间奔波,真正实现“主场作战”。全程标准化品牌餐食,干净卫生、口味大众适配,不吃生冷、不踩饮食雷区,杜绝因肠胃不适影响考试发挥,一站式解决考生 “吃什么、去哪吃、赶不赶得上” 三大难题。广州准备参加PMP考试的项目经理,认准才聚广州自有考点,麦当劳早午餐暖心加持,权威教学 + 贴心服务双向护航,轻松拿下PMP证书,解锁职场晋升新台阶!

才聚PMP的博客 265

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 262

YOLOv11改进 - C3k2融合 | C3k2融合CBSA 收缩 - 广播自注意力:轻量级设计实现高效特征压缩,优化处理效率 | NeurIPS 2025

本文介绍收缩 - 广播自注意力(CBSA)((Contract-and-Broadcast Self-Attention))机制,并将其集成到YOLOv11中。传统注意力机制存在黑盒难理解、计算复杂度高的问题,CBSA通过算法展开推导出本质上可解释且高效的注意力机制。它先从输入数据中选出少量代表性tokens,接着对代表进行收缩计算,再将结果广播给所有原始数据。该机制计算量线性增长,具有明确数学解释,还能统一多种注意力机制。我们将CBSA代码集成到YOLOv11的C3k2模块中。实验证明,改进后的YOLOv

魔改工程师的博客 854

免费的午餐之后的选择 —— 体验Visual Studio 2010中的并行开发

若干年前我在学校里进行图形图像处理方面的实验项目。当时我们面临的一大挑战,是项目的实时性要求。同学们聚集在一起讨论可行的解决办法,其中最简单直接的,则是向导师申请经费,购买更高端的硬件系统。的确,对于若干年前的程序员来说,即使程序的运行速度不够快,那也是暂时的,随着客户使用的计算机更新换代,性能方面的问题就自行解决了,这不啻为免费的午餐。 免费的午餐已经结束 C...

weixin_30414635的博客 93

ISO13849功能安全从入门到精通(3):安全功能及其对降低风险的贡献4

例如,如果机器必须在有限速度下运行时进行设置,那么在低加速度值下进行设置时,参数P1将是正确的选择:随着危险缓慢出现并给予足够的运动自由,操作员将能够移出危险区域。例如,在无故障的条件下,在操作者的手的方向移动的滚子不能陷住它。在所有其他情况下,F1是正确的选择,前提是危险暴露的持续时间不超过机器总操作时间的1/20。需求来源于必要的风险降低。由于这些考虑而降低的PLr在任何情况下都不得低于通过比较方式考虑的机器的PLr,因为并不能从事故发生率低和严重程度低得出实施的安全功能提供的安全水平高于要求。

wdconan001的博客 837

广州PMP考生专属福利!才聚考场免费送麦当劳早午餐!

才聚更偏向服务后者。毕竟,考试当天能吃到一口热乎的麦当劳汉堡、喝上一杯牛奶再进考场,还能享受27年专业沉淀带来的全流程保障——这种幸福感,只有体验过的人才懂。才聚作为常年承接PMP考试的考点,座位间距、灯光、空调、噪音控制都经过大量考生检验,比临时租用的场地更规范、更安静。在广州才聚考点,考试当天一早,工作人员就已经在考场门口就位,手边备着满满当当的物资——饮用水、牛奶,以及提前准备好的麦当劳汉堡。目前才聚在广州、深圳、珠海、东莞、保定、南宁设有六地官方考试中心,是覆盖范围最广的PMP考试中心之一。

才聚PMP的博客 204

比NTP还牛逼的时间同步协议:1588v2,亚微秒级!

1588v2,又称为Precision Time Protocol Version 2,即精密时间协议的第二版本,或称为PTPv2,是一种精密时间同步协议标准,旨在实现网络中设备之间的高精度时间同步。该协议由IEEE标准组织发布,并在网络测量和控制系统中得到广泛应用。1588v2的主要目的是在计算机网络中提供高度准确的时间同步。它可用于确保不同设备之间的时钟同步,从而协调它们的操作。这对于需要协同工作的系统、无线通信基站等具有关键性的应用非常重要。

网络技术联盟站 4282

新鲜出炉,ECCV2024.9.25 首次提出基于 YOLO 目标检测的无源域自适应

本文提出了首次使用YOLO系列单发探测器的SFDA方法。本文方法采用了一个带有学习的、目标领域特定的增强和一种新的通信机制的师生框架来稳定训练,减少了对模型选择中带注释的目标数据的依赖,这对现实世界的应用至关重要。SF-YOLO 优于所有基于Faster R-CNN的SFDA方法,甚至一些使用源数据的基于UDA yolo的方法。

m0_63294504的博客 2676

谷歌赋:开启收割韭菜的新时代

loonggg读完需要4分钟速读仅需 2 分钟天下没有免费的午餐,当然,也没有免费的早餐和晚餐。这或许也是你最后的一顿晚餐。大前天看到这么条新闻:谷歌发布通知,用户超过两年没有使用其 G...

非著名程序员 260

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

html一个页面中切换多个页面_“开发一个静态 HTML 页面,我要价 18000 美元,有错吗?”...

在信息加速发展的互联网时代,越来越多的科技公司为了专注核心竞争力业务以及降低软件项目成本,开始将项目中的部分业务模块分发给第三方外包公司来完成。而这样是否就意味着大幅度地降低成本了?事实告诉我们,并没有。本文作者作为一名外包商,以自身的经历告诉我们本可以在3天之内完成了的一个报价仅为 1500 美元的静态 HTML 页面,是如何被大型企业硬是拖成了一个为期 7 周且需要耗费 18000 ...

weixin_39962199的博客 127

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

五分钟理解Rust的核心概念:所有权Rust

欢迎来到Rust的世界。你可能听说过Rust以其惊人的运行速度、强大的内存安全保证而闻名,甚至连续多年被评为“最受开发者喜爱的编程语言”。而支撑起这一切荣耀的基石,正是我们今天要深入探讨的核心概念——所有权(Ownership)。 对于许多刚从Java、Python、C++等语言转来的开发者来说,“所有权”就像一个神秘的守门人,它严格、挑剔,甚至有点不近人情,常常用编译错误将你拒之门外。但请相信我,一旦你理解了它的工作原理和设计哲学,这位守门人就会变成你最忠诚、最强大的守护骑士。

专注于 C/C++ 后端开发,涵盖基础语法、Linux系统与网络、MySQL数据库、常见算法及项目经验。 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

微信读书调整“时长兑书币”规则

喜欢用“微信读书”的重要原因之一就是它的“时长兑书币”功能。按用户每周读书时长兑换书币,书币可在微信读书里购书。每30分钟兑换1书币(价值1元),每周最多可兑换10书币(也就是读5小时)。只要你肯花时间读书,就有源源不断的书供你读。(相关文章:《碎片时间,用电纸书取代你的手机》)最近,“微信读书”调整了兑换规则,采用阶梯计价:0-1小时区间内,每30分钟可兑换1书币;1-5小时区间内,每2...

lizonglei的博客 1590

大语言模型生产环境指南(二)

设置训练环境和常见库应用各种训练技术,包括使用高级方法提高训练效率的技巧和窍门你准备好享受乐趣了吗?!你为什么说前四章没有乐趣?好吧,我保证这一章绝对会有。我们已经提升了很多,并且获得了大量的背景知识,这将证明在开始动手时非常有价值。通过训练 LLM,我们可以创建能够做奇妙事情并具有独特个性的机器人。确实,我们可以创造新的朋友并与他们玩耍。在上一个章节中,我们向您展示了如何根据您的 Slack 消息创建一个训练数据集。现在,我们将向您展示如何使用这个数据集创建一个代表您自己的角色。最后,您将不再需要与那个令

龙哥盟 940

在 CSS 动画中使用硬件加速

近些年,我们总是听到硬件加速,以及它如何帮助我们提升网页的动画性能,让网页动画变得更好,在移动端更流畅。但是我想一大部分经验少的工程师是不知道硬件加速是如何工作的以及我们如何使用它来帮助我们让动画变得更流畅。 在GPU渲染元素 并不是所有的CSS属性变化都会直接在GPU处理。只有下面的属性会这样处理: transform opacity filter 因此为了页面更加流畅,高性能的动画,我们需...

qq_37653449的博客 1271

Pomatez安装配置指南:Windows、macOS、Linux全平台支持

想要提升工作效率,摆脱拖延症困扰吗?Pomatez是一款基于番茄工作法的开源桌面应用,支持Windows、macOS和Linux三大主流操作系统,帮助你科学安排工作与休息时间,实现高效专注。本指南将为你详细介绍Pomatez的安装配置方法,让你快速上手这款强大的生产力工具。 ## 🚀 快速开始:下载与安装 Pomatez提供多种安装方式,满足不同用户的需求: ### Windows用户安装

gitblog_00307的博客 494
上一篇: 大学四年(转载)
下一篇: GCC内嵌汇编语言
normalnotebook
博客等级 码龄24年 647粉丝 38原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值