探秘 Neat 公司的自动测试架构:如何高效创造与价值保持

GitHub Actions 自动化:5 个真实运维提效案例 本文以5个真实运维场景为例,系统阐述GitHub Actions在自动化部署、巡检、故障响应、合规审计与多环境发布中的落地实践。从“手动登录服务器”到“提交即自动执行”,通过事件驱动、流水线化设计,实现流程标准化、可追溯与可回滚。建议优先落地定时巡检与故障响应,再推进自动部署与合规审计,最后统一发布审批与一键回滚,逐步构建低成本、高可靠的运维自动化体系。 阅读详情

如果你有自动的端到端测试,那么你就已经拥有了测试架构,但你该如何确保测试架构实现自动测试工作的目标呢?

本文中,我们将跟随作者以一家视频会议解决方案公司——Neat公司为视角,探讨在测试架构构建中的选择。Neat 公司的测试架构涵盖从代码到企业架构等多方面,虽其细节(如嵌入式软件和Python 端到端测试)可能与大家有所不同,但他们思考的问题对所有自动测试团队都有一定的参考价值。Neat采取措施来捕获回归、减少误报、编写易维护测试、理解结果,来帮助开发团队高效工作,从而为公司、客户和开发团队创造更高的价值。

一、测试架构:不仅仅是测试代码

测试架构,简单来说,是构建工件(包含测试代码、框架、工具等)与人工元素(像团队组织、流程和实践)相互融合的综合体,它处于软件架构和企业架构的交汇点上。在我看来,其根本目标就是稳固地创造价值并持续保持。

图片

我发现许多团队都未能将测试与价值创造建立起有效的联系。他们未能针对测试工作进行精准化的定制,没有为开发团队打造出一张能主动且即时用于验证更改的安全网,从而使开发团队难以满怀信心地快速果断地推进工作。

从公司的角度来看,测试架构直接关乎公司的声誉。测试的不眠夜来自于你漏掉了什么,经过深思熟虑而精心构建的测试架构,可以减少未捕获的缺陷数量。这一点很重要,因为那些没有抓住的缺陷会逐步削弱公司的声誉,最终对业绩造成损害。

▏核心原则:权衡与目的导向

1.权衡:寻找最佳平衡点

测试架构中的每一项决策都要求在不同优先级之间达成平衡。以某团队为例(可类比实际情况),其使用的工具使团队能够聚焦于测试趋势。当报告工具显示单个未通过的端到端测试之前存在显著的通过趋势时,该团队通常会降低对这一单个失败测试的调查优先级。

如此一来,开发人员可能会在数天内才收到有关其在夜间构建中引入缺陷的反馈,而非立即获取。然而,这种权衡背后的逻辑在于,通过选择不针对每个测试失败进行深度剖析,转而关注整体趋势,团队所面临的干扰得以减少,上下文切换频率降低,从而能够将精力集中于更为重要的事务上。最终,这种方式能够更有效地捕获缺陷,减少流向客户的缺陷数量。

2.“为什么”而非 “如何”:明确决策背后的目的

在测试架构领域,理解并清晰传达决策选择背后的目的至关重要,特别是在偏离常规既定做法时。例如,测试架构师在倡导使用特定代码结构时,必须始终明确自身期望达成的目标。假设某种代码结构能够带来类型安全保障,在类型安全问题不太可能凸显的特定情境下,架构师应秉持开放态度,避免过度使用该结构而徒增复杂性。

在实际操作中,当架构师在代码审查环节提出与团队惯常做法不符的解决方案,进而给出看似矛盾的建议时,团队成员往往会产生困惑或不安情绪。此时,明确阐释 “为什么”,即解释倡导该做法的原因,就显得尤为关键。这有助于团队成员理解其意图,确保整个团队朝着共同的目标前进,避免因误解而产生的不必要的抵触情绪,从而保障测试架构的有效构建与优化。

二、Neat公司的测试架构

▏组织结构:专业团队与协作模式

Neat 公司设立了专门的测试自动化团队,专注于测试自动化相关领域的工作。作为一家专注于视频会议解决方案的成熟初创公司,Neat 约在三年前启动了测试自动化进程。

起初,团队致力于扩大产品现有功能的测试覆盖范围,同时着力打造一系列框架、工具及流程。在这一过程中,公司内部的各学科开发团队(涵盖音频、视频、平台等多个领域)在开发新功能时,逐渐认识到这些框架、工具和流程所带来的附加价值,并开始积极采用。这使得学科团队成员能够凭借自身的领域知识,运用测试自动化团队提供的工具编写新的测试,而测试自动化团队则主要通过对其他团队编写的测试代码进行代码审查的方式提供专业指导,双方紧密协作,共同推动测试工作的高效开展。

▏测试自动化的演变:从基础到协作

Neat的测试自动化经历了一个有趣的演变过程。最初,他们从基本覆盖率起步,就像盖房子先打好地基一样。随着时间的推移,逐渐过渡到协作框架。在这个框架下,功能团队能够更加自主地参与到测试编写中来。他们利用测试自动化团队提供的丰富工具,结合自身对业务功能的深入理解,编写针对性强、高效的测试。这种演变不仅提高了测试的效率,还增强了整个团队的协作能力,使得测试工作不再是测试团队的单打独斗,而是全员参与的一场战斗。

▏框架和 CI 基础设施:强大的技术支撑

  • 测试框架:

    Neat 公司选用 Python Behave 作为主要的测试框架。在测试自动化团队成立初期,便精心构建了大量可复用的测试步骤实现,这些步骤涵盖了在视频会议设备上执行测试时所需的大部分基础操作。因此,当功能团队中的开发人员着手为新功能编写测试时,往往发现所需的大部分测试代码已然就绪。他们只需在 Gherkin(given - when - then)测试用例中引入现有步骤,然后集中精力开发与新功能特定内容相关的少量剩余步骤即可。这种方式极大地提升了开发人员创建新测试的效率,使其在测试编写过程中事半功倍。

  • CI 基础设施:

    Neat构建了一套简洁易用的持续集成(CI)基础设施,用于执行测试、生成报告并跟踪结果。公司始终将重点置于创建易于使用且可复用的组件之上,这些组件通过便捷快速地开发新测试任务,为整个测试流程创造了显著价值。在实际操作中,Neat借助 Gitlab CI 来运行测试,当创建新作业时,用户可继承预设的配置,这些配置能够自动处理诸如使用新固件刷新设备、执行测试以及生成报告等关键任务,这仅仅是可复用基本配置所实现的部分核心功能。

  • 报告机制:

    在报告环节,采用 Elasticsearch 作为数据存储工具,团队成员可以方便地复制公司定制的 Kibana 仪表板,并通过添加筛选器,使其仅跟踪团队关注的特定测试结果和趋势,从而实现个性化的测试结果分析与监控。

三、测试的战略方法:精准出击

尽管我们将主要精力聚焦于夜间构建工作,但在测试策略上,我们选取了一组数量最少的门控测试,我们将其命名为 “基本” 子集。

随后,我们还会执行数百个功能测试,这些测试并不属于门控类型,因此不会阻断持续集成(CI)流程中的软件构建进程。这是因为,尽管我们已经竭尽全力,但端到端测试不可避免地会受到众多变量的干扰。

基于此,我们着重于在每晚尽可能多地运行测试。一旦测试过程中发生故障,我们能够迅速恢复设备状态,并即刻开展下一次测试,确保不会因之前的测试失败而阻碍后续测试的正常进行。

与此同时,我们配备了专门用于分析限定趋势的工具,以此精准过滤干扰信息,有效识别实际存在的问题。为此,我们构建了一套专门的框架,用于对每个测试用例的趋势进行精准限定,并将该测试用例在 30 天内的趋势存储为存储于 Elasticsearch 文档数据库中的每个测试结果的一项属性。这种趋势限定以两种形式呈现:一种是带有红色(代表失败)和绿色(代表通过)趋势带的直观图形,另一种是文本分类形式,如 “间歇性失败”“持续通过” 或 “片状” 等类别。其中,后一种文本分类是通过一个基于 Python 编写且受函数式编程启发的框架来实现的,在该框架中,每个类别均由一个特定函数负责识别判定。当其中某个函数返回匹配结果时,相应的测试结果便会被赋予对应的类别标识。结果在我们的控制面板上如下图所示:

图片

四、为开发团队创造价值:全方位支持

如前文所述,我们为特性团队构建了一个框架,此框架极大地方便了新测试的编写工作,并且能够使这些新测试在持续集成(CI)环境中迅速启动并运行起来。这仅仅是作为测试自动化团队为功能开发团队创造价值的一个方面。

另一个极具代表性的例子是我们开发的聊天代理工具。该工具赋予了 QA 团队成员(特别是开发人员)一项强大的能力,即可以订购仅针对特定域或功能集的定制化测试运行。这些定制测试运行具有高度的灵活性,能够针对任何构建版本执行,其中包括功能团队开发人员的个人构建版本。

在完成测试运行后,我们会提供全面且详细的报告,这些报告具备一项重要功能,即能够自动对已知问题进行分类整理。如此一来,开发人员或测试人员便可以快速且准确地区分预期失败(例如某些特定场景下正常会出现的错误情况)和那些与即将合并到主分支的更改相关的问题,从而更加高效地定位和解决问题,提升开发效率。

五、测试自动化中的机器学习:智能助力

在测试自动化流程中,机器学习发挥着重要作用。当开发人员订购自定义测试运行,以对其考虑集成的更改进行验证时,他们会获取一份详尽的报告。该报告能够清晰地区分预期的失败情况以及其更改可能引发的问题。不仅如此,开发人员甚至可以对背后的机器学习模型进行指示,使其在下次因正在验证的代码更改而出现新发现的问题时,自动执行分类操作。值得一提的是,这一操作可以直接在开发人员用于查看自定义测试运行结果的同一报告工具中完成。

如此一来,作为测试自动化团队,我们得以避免采用极为不理想的解决方案,即无需关闭那些预计会失败的测试。与此同时,我们依旧能够为开发人员提供清晰可读且具有实际操作指导意义的测试结果。由于我们持续跟踪测试趋势,因此当定期失败的测试和回归问题得到修复时,开发人员能够自动收到相关警报。

图片

倘若我们在 6 个月后才启动与机器学习相关的计划,或许可以选择借助大语言模型(LLM)来承担繁重的工作任务。然而,在项目开始,尽管我们使用的是成熟且易于操作的库,我们仍不得不自行构建模型。我们的首个计划聚焦于对测试失败的类型进行分类,虽然取得了一定程度的成功,但并未对我们的工作模式产生根本性的改变。不过,那次经历为我们深入理解如何运用机器学习实现测试失败的自动分类奠定了坚实的基础。

而这一理解上的突破,改变了我们的工作方式。现在我们能够允许预期失败的测试继续进行,不会浪费过多时间,并且在区分预期失败和新出现的失败情况时,依然能够保持清晰的判断。可以想象,如果我们仅仅是被动地使用黑盒式的 LLM 来解决分类问题,没有真正洞悉这些模型的工作原理,那么我们很难实现这次飞跃。而这一飞跃对于探索该技术在未来可能的进一步应用具有至关重要的意义。

对于我们团队而言,实现与已知问题相关故障的自动分类无疑是一项无可比拟的成功。我们的机器学习模型不存在人类所具有的偏见,也不会轻易得出错误结论。在实际工作中,我们常常会遇到这样的情形:当某个经常失败的测试突然以不同的方式出现失败时,我们的机器学习模型会停止对其进行自动分类。这一现象看似不利,实则为我们团队带来了宝贵的价值。因为收到测试失败方式变化的警报,有助于我们团队增强对正在测试的软件的态势感知能力。在执行分类任务时,机器学习模型拥有比人类大得多的内存缓存。因此,利用这些模型,实际上是让机器充分发挥其优势,弥补我们人类先天存在的弱点,进而完善我们作为质量保证(QA)团队的专业技能。

六、跨团队信任和指导:携手共进

相较于其他公司的测试团队,我们团队团队处于独特的位置,我们为软件开发人员提供代码审查和指导,以在我们的视频会议解决方案中构建新功能。这一工作与功能团队正在开展的新的端到端测试有关,其目的在于全面测试他们在产品中所实现的新功能。

我们功能团队的开发人员深刻认识到,作为一个专门的测试自动化团队,我们在提升测试的可读性、可维护性,尤其是可靠性方面具备独特的专长。不仅如此,我们还积极协助他们探寻并有效运用我们所创建的测试工具。这种信任和协作是双向的。我们测试自动化团队依赖功能团队并与之协作,以确保将必要的测试插桩内置到我们的产品中,从而使我们需要涵盖的许多测试自动化场景首先实现自动化。

七、检测策略与公司价值观一致:追求卓越用户体验

Neat特别关注我们的测试自动化策略,以消除称为“微故障”的东西。微故障可被描述为系统中存在的摩擦情况,其表现形式为最终用户在使用过程中遭遇困难,比如需要多次重复相同操作才能达成目的。由此可见,“微故障” 与完全故障(即 “宏故障”,此时系统某些功能完全失效)截然不同。

微故障具备危害性,原因在于其发生时客户往往觉得不值得为此专门报告。但如果客户频繁遭遇此类微故障,可能会非常让人烦躁,甚至可能在我们不明就里的情况下更换供应商。

为缓解这一问题,我们采取的方法是随着时间推移对微故障进行识别与跟踪。具体而言,持续处理问题直至发现其已减少或被消除。这就要求我们创建的测试工具在遇到首个困难时不应直接判定测试失败,而是进行再次尝试,并记录尝试次数以及最终测试是否成功完成。为此,我们专门构建了一个框架,用于收集所跟踪的每个微故障的数据,从而能够追踪每个微故障随时间推移的变化趋势。如此一来,我们便能清晰判断问题是在改善还是恶化,并据此持续评估针对每个微故障所做缓解努力是否取得成效。

对于neat而言,消除微故障至关重要,因为我们努力为使用我们的视频会议解决方案的客户提供无摩擦的体验。这一举措正是我们的测试架构与公司努力追求的目标保持高度一致的有力体现。

八、测试创造价值:不可忽视的重要环节

测试自动化工作充满挑战,对于那些未能将其视为 “真正的” 编程领域的人而言,它或许并不被当作一门学科。若缺乏良好的测试自动化资源,公司极有可能完全舍弃端到端测试,转而片面地专注于单元测试,或者过度依赖手动测试。

然而,这样做会造成严重损失。因为测试自动化能够持续捕捉那些虽通过单元测试却可能在后续环节出现的回归问题,从而为客户提供价值保障。相比之下,基于人工的测试缺乏足够的规律性,难以确保每次都能精准捕获所有回归问题。

持续稳定地交付价值的核心在于精心设计测试架构。合理的测试架构能够释放手动测试资源,使其投入到人类独具优势的探索性测试领域。通过这样的方式,我们既能充分发挥测试自动化的高效性和准确性,又能借助人类的智慧和创造力,在测试过程中发现那些潜在的、不易被机器察觉的问题,从而实现更全面、更可靠的软件质量保障,推动软件开发与交付过程朝着更加优化、高效的方向发展。

- end -

MCP+Skills 赋能APP渗透逆向,六阶段 Agent 流水线,打通 MCP 工具链实现 APP 安全自动化分析 本文的实现与思路,是对前辈经验和行业方法的一次学习与实践,若其中存在疏漏或不足之处,欢迎批评指正。目前也在继续尝试将这一体系进一步推向真正可落地的自动化方向,供更多安全研究与测试实践参考! 阅读详情

相关推荐

ReportStudio入门教程(四十一) - 固定报表列宽

我们继续上一篇博客,让他看起来

什么是江湖? 3518

NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)

NEAT(NeuroEvolution of Augmenting Topologies, 增强拓扑的神经进化)属于神经进化算法家族,能够对神经网络的拓扑结构和连接权重进行进化。其用于进化复杂人工神经网络(Artificial neural networks, ANN),旨在通过在进化过程中逐步完善ANN的结构来减少参数搜索空间的维数。进化过程始于一群简单的基因组,并随着世代的发展逐渐增加其复杂性。本文详细介绍了NEAT算法的基本原理,并基于NEAT-python完成XOR实验来验证NEAT算法的有效性。

盼小辉丶的博客 1万+

SAP MM自动化进阶:STO交货单自动创建的配置与优化

本文深入解析了SAP MM模块中实现公司间库存调拨订单(STO)交货单自动创建的完整配置流程与优化策略。通过激活自动交货与绑定发货点两大核心配置,打通自动化链路。重点探讨了如何集成ATP可用性检查以智能处理库存不足等异常场景,确保自动化流程的可靠性与业务贴合度,并提供了进阶监控与问题排查方法,助力企业显著提升供应链效率。

weixin_29206669的博客 125

neat算法——本质就是遗传算法用于神经网络的自动构建

基于NEAT算法的马里奥AI实现 所谓NEAT算法即通过增强拓扑的进化神经网络(Evolving Neural Networks through Augmenting Topologies),算法不同于我们之前讨论的传统神经网络,它不仅会训练和修改网络的权值,同时会修改网络的拓扑结构,包括新增节点和删除节点等操作。NEAT算法几个核心的概念是: 基因:网络中的连接 基因组:基因...

djph26741的博客 1203

芯片低功耗设计实战:CPF与UPF流程选择指南(附工具对比)

本文深入探讨了芯片低功耗设计实战中CPF与UPF流程的选择策略。文章从两者本质差异与演进脉络出发,结合Cadence与Synopsys工具链的深度支持实况,为工程师提供了基于项目场景的决策框架。重点分析了在混合工具链环境下如何实施流程与验证,并强调了利用Spyglass等工具确保功耗意图无损传递的关键技巧,旨在帮助团队做出明智的流程抉择,提升设计效率与可靠性。

weixin_29197051的博客 408

保姆级教程:用MS建完分子模型,如何一键转成LAMMPS能用的data文件?

本文详细介绍了如何将Materials Studio(MS)构建的分子模型转换为LAMMPS可用的data文件的全流程。重点讲解了力场选择、环境配置、转换命令参数解析及常见问题排查,帮助初学者快速掌握MS与LAMMPS之间的数据转换技巧,特别适合计算材料学领域的研究人员。

weixin_42665255的博客 471

Agent流程自动化适合哪些重复性业务场景?

Agent流程自动化适合处理的业务。它并不是把所有工作交给一个机器人,而是将任务拆解、信息获取、判断、调用系统和结果反馈连接起来。对于涉及复杂授权、重大经营决策或高度依赖人工经验的事项,通常更适合采用“Agent辅助+人工审核”。

yunshangxiantu的博客 197

SAP CBC 集成质量系统初始化接入实战指南

摘要 本文探讨了SAP S/4HANA Cloud Public Edition项目中质量系统的初始接入过程。质量系统并非开箱即用,而是需要经过SAP Central Business Configuration(CBC)的Scope and Organizational Structure阶段部署后才能具备完整功能。文章重点分析了几个关键环节:CBC里程碑确认的时机选择、Identity Authentication的初始管理员设置、Business Role Template的创建规范等。实施过程中需特

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1410

零信任架构实战:基于天远单人婚姻查询构建自动化智慧住房资格核验网关

破解公租房资格核查痛点:从传统纸质婚姻凭证抽检到权威民政数据穿透直连 在智慧城市公共租赁住房(公租房)、保障性租赁住房以及共有产权房等民生保障工程中,保障房资源的公平精准分配是住房保障管理中台的核心职责。按照现行住房保障准入政策,申请主体的家庭结构直接决定了配租资格准入与面积配给标准:单身家庭申请人通常享有特定的单人保障配额与独立的财产评估标准,要求申请人具

2501_94042197的博客 207

【BUG已解决】pip install 出现 error: Microsoft Visual C++ 14.0 or greater is required 解决方案

方案磁盘占用适用场景推荐指数安装Build Tools3-6GB长期Windows Python开发⭐⭐⭐⭐⭐寻找预编译wheel无额外占用只是想快速装上某个包⭐⭐⭐⭐⭐用conda安装视包而定已经在用conda环境⭐⭐⭐⭐⭐升级到新版本无额外占用库本身有更新的预编译版本⭐⭐⭐⭐使用WSL2需要额外配置Linux子系统频繁遇到Windows编译问题⭐⭐⭐⭐的核心是Windows 缺少本地 C/C++ 编译器,而目标包需要在本机编译。先看是否有捷径。

博客 1万+

EMB电子机械制动执行器五大核心部件选型解析

本文介绍了EMB电子机械制动执行器五大核心部件的选型方案:采用无刷直流电机作为驱动源,兼具高扭矩和快速响应特性;选用滚珠丝杠传动机构,实现高效旋转-直线转换;行星齿轮减速器满足紧凑空间内的增扭需求;QT450-QT550材质的钳体确保刚度要求;应变片式压力传感器实现夹紧力精确测量。各部件选型综合考虑了性能、可靠性和空间限制,为EMB系统设计提供了完整解决方案。

m0_59012156的博客 1743

官网最差内容压力测试:长标题、缺图、空状态与溢出的自动化核查

用真实最差内容、固定视口和浏览器脚本检查官网长标题、缺图、空状态、横向溢出、表单错误与多语言布局。

sweetofmine1的博客 242

Python爬虫实战:采集菜谱网站数据——以“下厨房”为例

随着互联网的发展,海量优质数据为各类应用提供了坚实基础。菜谱作为用户日常生活中需求极高的内容,丰富多样的菜谱数据不仅方便用户烹饪,也为美食推荐、营养分析等研究提供了数据支持。本文将围绕国内知名菜谱网站“下厨房”(https://www.xiachufang.com)展开,结合最新Python爬虫技术,详细讲解如何高效、规范地采集菜谱数据,包括菜谱名称、食材、步骤、评分、评论等丰富信息。全篇覆盖爬虫原理、框架选型、反爬应对、数据存储和简单分析,是学习爬虫实战的绝佳案例。菜谱标题作者信息菜谱图片。

2201_76125261的博客 1900

当通用大模型进入神经科学实验室,科研自动化正在发生什么变化?

10月28日,Gabriel Ocana-Santero 分享了一组小鼠实验现场照片:粉色支架、显微镜、电机,以及一个醒目的红色急停按钮。这很容易被概括成“AI 给小鼠做脑手术”。**但目前能够核对的材料,主要是作者的社交媒体自述、线程转录与现场图片,尚不足以独立验证实验结果。**读懂这次展示,首先要把三个问题分开:谁提出方案,谁批准动作,什么证据能证明治疗有效。团队展示的电动实验装置全景;照片不构成疗效证据(图源:Gabriel Ocana-Santero 社交媒体图片,用户提供)

weixin_71777199的博客 165

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 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")

AI 编程 自动化执行指令

AI 编程 自动化执行指令

ZQ200720的博客 217

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Try-Except怎么用,3个追问解答在自动化下的应用

异常处理(Try-Except)——给程序穿上防弹衣。在真实环境里,你经常会遇到:某个子文件夹没权限访问()、某个文件刚好被同事删了()、或者网络突然断了。如果不加异常处理,只要有一个文件报错,整个扫描程序就会瞬间崩溃,直接闪退。try。

2303_76755697的博客 443

假人有限元模型

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

企业 BPM 平台如何选?炎黄盈动解析流程自动化与智能化选型要点

数字化建设持续推进,不少企业已完成基础流程线上化。但在企业全域业务协同过程中,仍面临异构业务系统互通难、流程规则调整依赖技术交付、流程资产缺乏统一沉淀、运营改善缺少常态化机制等深层挑战。炎黄盈动bpmPaaS智能BPM平台,以流程全生命周期管理为核心,融合低代码应用、智能集成与AI Agent能力,帮助企业统一管理流程资产、打通跨系统业务协同、推动AI融入流程,为企业从流程自动化走向智能化运营提供支撑。围绕企业BPM平台选型,可从以下四个维度考察其能力。

yanhuangyingdong的博客 194

零信任架构实战:基于天远新能源改表电池报告构建自动化汽车金融抵押放款核验网关

破解新能源车抵贷资产评估痛点:从传统线下验车到新能源改表电池报告数据穿透直连 在深化绿色金融创新、推动新能源汽车消费与资产证券化的大背景下,各大商业银行汽车金融事业部、持牌消费金融公司以及汽车融资租赁机构,正加速重构线上新能源车辆抵押贷款、售后回租与实时授信审批微服务架构。在新能源车抵押借款业务流转中,借款人在线提交车辆识别代号(VIN)与借款申请后,信审与

2501_94042197的博客 203

全新AI挑战赛正式启动,推动网络自动化发展与标准知识普及

这两项赛事——TelcoRetrieve挑战赛与AI Agents for RAN挑战赛,由GSMA、ETSI(欧洲电信标准化协会)、IEEE(电气电子工程师学会)、ITU(国际电信联盟)及华为联合打造,旨在应对行业两大关键需求:赋能AI智能体解决复杂的网络工程问题,以及提高AI系统在处理技术标准时的准确性。凭借高影响力的学术出版物、行业会议、技术标准,以及专业与教育类活动,IEEE 在航空航天系统、计算机、电信、生物医学工程、电力、消费电子等众多领域都是值得信赖的行业声音。

AIpress的博客 206

现代制造业转型下的自动化人才市场需求与职业教育法的影响

现代制造业正面临转型,其对自动化人才的市场需求持续增长,尤其是PLC工程师的培训显得尤为重要。随着国产PLC逐步替代进口设备,智能制造的人才缺口亟待填补。职业教育法的实施将对培养符合市场需求的自动化工程师起到积极作用,推动行业健康发展。

Learn_PLC的博客 103

锂电池化成分容设备产能规划:中试线、量产线与自动化节拍分析

锂电池化成分容设备产能规划需综合考虑测试周期、上下料、静置、换型及异常停机等因素,避免仅依据通道数估算。中试线侧重工艺验证与灵活性,量产线则强调连续运行与整线节拍匹配。规划应基于实际流程,统一利用率统计口径,协调设备与物流节拍,并明确数据接口与验收标准。朗天新能源建议结合电芯规格、测试流程与现场需求,提前准备关键参数,确保方案贴合真实生产任务。

GZlangtian的博客 517

零信任架构实战:基于天远新能源改表电池报告构建自动化智慧出行换电资产入库建档网关

破解换电电池资产入库痛点:从传统线下拆检到电池全生命周期数据穿透 在智慧出行生态与城市新能源换电网络(如换电重卡、网约出租车换电车队、同城绿色物流车以及两轮轻型换电基础设施)高速发展背景下,动力电池作为核心高价值资产正全面迈向“车电分离”与“电池银行”(Battery as a Service, BaaS)资产证券化运营模式。在换电资产集中采购、车队退役电池

2501_93124989的博客 256

AI生成长视频时,隐私敏感信息的检测与遮蔽怎么自动化

核心思路是用不同模型覆盖不同的目标类型:人脸用 YOLO 检测加 BoT-SORT 追踪,车牌用微调过的 YOLO 检测器,二维码用 qrdet 输出多边形轮廓并依次回退到 WeChatQRCode、cv2 或 pyzbar,证件和电话号码在 macOS 上走系统级 Apple Vision API,其他平台回退到 EasyOCR。单帧检测会出现漏检或抖动,我们用了 OpenCV 的 CSRT/KCF 跟踪器在帧间延续目标位置,只在定位置信度低于阈值时才重新调用检测模型。检测结果的可视化需要独立于主线程。

Mysssone的博客 193

零信任架构实战:基于天远查行政处罚构建自动化大宗商票贴现资信核验网关

破解大宗商票贴现审核痛点:从传统线下纸质行政公文排查到企业处罚底账秒级穿透直连 在全国统一大市场建设持续深化与产业互联网现代供应链金融纵深发展的宏观格局下,B2B 大宗现货贸易撮合平台、产业数字仓单流转中心以及供应链商业承兑汇票(商票)即时贴现服务,已成为连接大宗工业原材料(如阴极铜、热轧卷板、建筑钢材、煤炭及合成树脂)上下游生产制造与贸易流通的核心产融基础

2501_94041864的博客 130

中科院自动化所联合首都医等团队发表亚专科基础模型,基于近3万例数据训练,大幅降低中枢神经系统术中冰冻病理的判别难度

在数据与模型开发阶段,研究团队构建了一个规模达27,930张全切片图像(WSIs)的预训练数据集。这批数据主要来源于TCGA和Ivy-GAP等公共数据库,其中脑与中枢神经系统(CNS)标本占比高达49%,这种高度聚焦的分布为模型注入了深厚的亚专科先验知识。在数据预处理环节,系统不仅对全切片进行了224、448和896三种尺度的图块提取,还引入了严格的质量控制以剔除背景、伪影和模糊区域。

罗小罗同学的博客 99
上一篇: 优维HAO案例:央企SDIC控股全牌照综合类券商CMDB配置管理平台
下一篇: 鸭先知 | 优维2025年运维趋势简报
优维科技EasyOps
博客等级 码龄5年 1483粉丝 395原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值