团结引擎小游戏平台 Burst 编译器支持 —— 提升小游戏运行性能与控制包体大小

Unity项目导出微信小游戏全流程:从方案选型到性能优化实战 WebAssembly(Wasm)作为一种可移植、高性能的二进制指令格式,其核心原理在于将C/C++等高级语言代码编译为接近机器码的字节码,在安全的沙箱环境中高效执行。这项技术为在Web端运行复杂应用提供了可能,其技术价值在于打破了Web性能瓶颈,使得游戏、CAD等重型应用得以在浏览器中流畅运行。在游戏开发领域,结合AssetBundle资源动态加载技术,它使得开发者能够将庞大的Unity项目高效地适配到微信小游戏等轻量化平台。本文聚焦于Unity项目导出微信小游戏的完整工程实践,深入解析如何利用官方转换插 阅读详情

在小游戏开发中,CPU 性能瓶颈和包体大小是开发者面临的两大核心挑战。Burst是一个基于 LLVM 的深度优化后端编译器,能够将 C# 高性能计算子集(HPC#)编译为高度优化的机器码,显著提升 CPU 密集型计算的运行帧率。同时,针对小游戏的包体敏感性,我们为 Burst 引入了独有的 Managed回退分支裁剪 功能,在保证性能的前提下有效控制 wasm 包体大小。

Burst 的 HPC# 代码不经过 IL2CPP 转换,而是直接通过 Burst 优化器生成 LLVM IR,经由 LLVM 优化器产出高效的 wasm 代码,绕过了 IL2CPP 对 .NET垃圾回收机制的模拟,并能够基于 HPC# 的严格假设执行更激进的内联、循环展开和向量化优化。值得关注的是,Burst 可以独立于 Job/ECS 使用,开发者不必依赖完整的 DOTS 框架。

Burst 编译器(com.unity.burst)现已支持团结引擎小游戏平台。其中,Burst Package 1.8.21 及以上支持小游戏平台的基本编译优化功能,Managed 回退分支裁剪功能要求 Burst Package 1.8.27 及以上(引擎版本 Tuanjie 1.9.0 及以上)。

Burst 带来的收益

丨性能收益

在小游戏场景中,诸如物理碰撞、大量实体的裁剪计算、避障算法、粒子模拟等 CPU 密集型任务往往是性能瓶颈。Burst 编译器通过 LLVM 的编译层级优化,能够显著加速这些计算过程,无需修改业务逻辑即可获得可观的帧率提升。

以下性能数据基于 oppo A5 测试机、微信小游戏平台测得,裁剪等级为 Medium。

丨Infinity 粒子系统场景

Infinity 粒子系统(团结引擎粒子系统)是大规模使用 HPC# 编写并用 Burst 编译的典型项目。其核心计算逻辑(粒子模拟、采样、裁剪等)全部采用 HPC# 实现,充分利用了 Native 容器、Unity.Mathematics 等特性,并通过 SOA 数据组织方式进一步优化计算性能。因此,Infinity 的测试场景(Main、Test200、TestSingle)能够充分验证 Burst 编译优化和包体裁剪的实际效果。该测试场景来自开源项目 Infinity Benchmark Suite,开发者可自行下载运行。

丨Main 场景

指标

Burst+裁剪

不开启Burst

Burst无裁剪

优化效果

FPS(帧率)

36.1

2.3

34.6

+1469%

wasm包体(KB)

24,223

24,050

25,646

-5.5%

丨TestSingle 场景

指标

Burst+裁剪

不开启Burst

Burst无裁剪

优化效果

FPS(帧率)

56.9

1.2

57.7

+4642%

wasm 包体(KB)

23,923

23,783

25,609

-6.6%

注:Infinity 场景中不开启 Burst 时帧率极低,是因为粒子系统在帧率不足时会触发多步模拟(Multi-Step)机制——即在一帧内执行多次物理模拟以追赶落后的时间步,进一步加重 CPU 负担,导致帧率持续恶化。开启 Burst 后帧率回归正常水平,多步模拟不再触发,性能得以充分发挥。因此,Infinity 场景的 FPS 提升幅度包含了多步模拟机制消除后的叠加效果。

第三方插件场景(Asset Store 插件及算法测试)

丨Congi 场景

指标

Burst+裁剪

不开启Burst

Burst无裁剪

优化效果

FPS(帧率)

20

8.1

20.2

+147%

wasm 包体(KB)

18,896

18,694

18,972

-0.4%

丨Duck 场景(软光栅化)

指标

Burst+裁剪

不开启Burst

Burst无裁剪

优化效果

FPS(帧率)

34.1

14.6

33.8

+134%

wasm 包体(KB)

18,355

18,301

18,433

-0.4%

丨Noise 场景(噪声算法)

指标

Burst+裁剪

不开启Burst

Burst无裁剪

优化效果

FPS(帧率)

3.9

2.2

3.9

+77%

wasm 包体(KB)

18,154

18,132

18,202

-0.3%

包体收益

Burst 编译器的激进内联优化在提升性能的同时,可能会导致 wasm 包体膨胀。为此,团结引擎小游戏平台针对 Burst 引入了 Managed 回退分支裁剪功能。开启裁剪后,在帧率无明显降低的前提下,wasm 包体大小得到有效控制:

- 开启 Burst + 包体裁剪后,包体相比不裁剪可减少 0.3% 至 6.6%,帧率几乎不变

- 开启 Burst 后的包体与不开启 Burst 的包体大小相当,引入 Burst 不会导致包体明显增大

包体裁剪功能

通过引入 Managed 回退分支裁剪功能,Burst 在小游戏平台上实现了提升帧率的同时包体不会明显膨胀。下面介绍其原理和使用方式。

丨为什么需要裁剪

Burst 编译器在处理标记了 [BurstCompile] 的 HPC# 函数和 Job 函数时,除了生成经过 Burst 优化器深度优化的 Native Code(最终编译为 wasm)之外,还会保留一份内容与原函数完全相同的 Managed 回退函数。这份 Managed 回退函数并非由 Burst 编译,而是会经过 IL2CPP 编译出现在最终的 wasm 包体中。

Managed 回退分支的设计初衷是:当 Burst 运行时未启用时,系统可以经由 Managed 回退函数回到 C# 原始实现。但在小游戏平台上,Burst 始终以 AOT 方式编译,不存在回退场景,因此经过 IL2CPP 编进包体的 Managed 回退函数成为纯粹的冗余代码,会导致 wasm 包体膨胀。

丨裁剪实现原理

包体裁剪的核心思路是:在 IL2CPP 编译链路中裁剪掉 Managed 回退函数,这样 Managed 回退函数就不会出现在最终的 wasm 包体中。

具体实现上,团结引擎在编译流程中新增了 Managed 回退分支裁剪步骤,检测到 Managed 回退函数时将其函数体替换为抛异常的代码。经过这样处理后的代码作为 IL2CPP 的输入,IL2CPP 生成的 wasm 中便不再包含这些冗余的 Managed 回退函数实现,从而有效降低了包体大小。由于小游戏运行时 Burst 始终启用,优化后的 Native Code 会优先执行,替换后的异常代码永远不会被触发,不影响实际运行。

丨使用方式

1. 在 Player Settings 中,将 "Managed Stripping Level" 设为 "Medium" 或以上

图片

2. 在 Burst AOT Settings 中,勾选 "Enable Burst Compilation"

3. 在 Burst AOT Settings 中,勾选 "Strip Burst Managed Method"(该选项仅在 Enable Burst Compilation 开启时可见)

图片

注:当 "Managed Stripping Level" 为 "Medium" 及以上,且同时勾选了 "Strip Burst Managed Method" 时,裁剪编译流程才会生效。

丨验证裁剪效果

打包完成后,可在打包输出目录下找到 webgl/Build/webgl.wasm 文件,对比开启和不开启 "Strip Burst Managed Method" 时该文件的大小差异,即可确认裁剪效果。以含 Infinity 粒子系统的项目为例,开启裁剪后 wasm 包体可减少约 1,918 KB(约 6%)。裁剪比例与 HPC# 代码在整个项目代码中的占比呈正相关——项目中使用 HPC# 编写的代码越多,裁剪效果越明显。

Burst 如何使用

丨快速使用

开发者可以通过以下方式在项目中使用 Burst。

1. 确认使用方式

Burst 支持两种使用方式,开发者可根据项目场景选择:

- Job.Run 方式:适合已有 Job 系统的项目。在小游戏单线程环境下,只需将 Job.Schedule 改为 Job.Run 即可执行

[BurstCompile]public struct MyJob : IJobFor{    public NativeArray<float> data;
    public void Execute(int index)    {        data[index] = data[index] * 2.0f;    }}
// 在小游戏平台上使用 Run 执行var job = new MyJob { data = dataArray };job.Run(dataArray.Length); 

- 静态函数调用方式:适合将计算逻辑封装为独立函数的场景。将计算逻辑封装在静态函数中,加上

[BurstCompile]public struct ComputeLibrary{    [BurstCompile]    public static void ProcessData(ref NativeArray<float> data, int count)    {        for (int i = 0; i < count; i++)        {            data[i] = math.sqrt(data[i]);        }    }}

注意:函数外围的 class/struct 也需要加上 [BurstCompile] 标签。Burst 会先查找类型上的标签,再去编译内部标记的函数。

2. 确认 Build 设置

打包时需确认以下设置:

1. Burst AOT Settings 中勾选 "Enable Burst Compilation"

2. 如需包体裁剪,勾选 "Strip Burst Managed Method",并将 "Managed Stripping Level" 设为 "Medium" 或以上

最佳实践

业务逻辑与算法分离:Burst 更适合计算密集的算法,而非多态/继承较多的业务逻辑。建议将核心计算逻辑改写为 HPC# 并用 Burst 编译,封装成独立接口供上层业务逻辑调用。

HPC# 替换步骤:在完成业务逻辑与算法的分离后,将算法部分的 C# 代码转换为 HPC# 的通用步骤如下:

1. 替换托管内存为非托管内存:class → struct

2. 替换容器类型:

Array → NativeArray,

List → NativeList,

Dictionary → NativeHashMap

3. 提炼计算过程为 static 方法:在方法和所属类型上标注 [BurstCompile]

4. 替换数学库:System.Math → Unity.Mathematics

其他注意事项:

- 使用 in/ref 传递 struct:HPC# 主要使用 struct,Native 容器中的 struct 元素必须以 in 或 ref 方式传递,否则会导致 BC1064 编译错误

- 手动内存管理:Native 容器使用完毕后需要显式调用 Dispose 释放内存

总结

团结引擎小游戏平台 Burst 编译器支持为开发者带来了两大核心价值:

1. 显著的性能提升:测试表明,开启 Burst 后,第三方插件和算法场景的帧率可获得 77% 至 147% 的提升;Infinity 粒子系统等大规模使用 HPC# 的项目,性能收益更为显著。效果因代码中计算密集程度而异,计算越密集提升越明显

2. 可控的包体大小:通过独有的 Managed 回退分支裁剪技术,开启 Burst + 裁剪后,wasm 包体相比不裁剪可减少 0.3% 至 6.6%,同时帧率几乎不受影响。裁剪比例与 HPC# 代码在整个项目代码中的占比呈正相关——项目中使用 HPC# 编写的代码越多,裁剪效果越明显。且引入 Burst 后的包体与不开启 Burst 的包体大小相当,不会给小游戏带来额外的包体压力

Burst 作为 DOTS 技术栈中独立的一环,可以脱离 Job/ECS 单独使用。开发者只需将计算密集的算法逻辑改写为 HPC#,加上 [BurstCompile] 标签,即可在小游戏平台上享受 LLVM 带来的深度编译优化。展望未来,随着 AI 辅助开发逐渐成为趋势,我们计划将 HPC# + Burst 的最佳实践蒸馏为可复用的开发 Skill,帮助开发者更便捷地将业务中的计算密集模块改写为 HPC# 并应用 Burst 编译优化,降低使用门槛,让更多小游戏项目享受到高性能计算带来的体验提升。

深度学习之Encoder-Only原理与实战 【代码】深度学习之Encoder-Only原理与实战。 阅读详情

相关推荐

深度学习之Seq2Seq原理与实战

【代码】深度学习之Seq2Seq原理与实战。

yumiwangzi30的博客 110

Unity Burst 用户指南

Burst用户指南 Burst User Guide 概观 Burst是一个编译器,它使用LLVM将IL / .NET字节码转换为高度优化的本机代码。它作为Unity包发布,并使用Unity Package Manager集成到Unity中。 快速开始 使用burst编译器编译Job Burst主要用于与Job系统高效协作。 您可以通过使用属性[BurstCompile]装饰Job结构,从而在代码...

alph258的博客 2万+

深度学习之TF-IDF原理与实战

【代码】深度学习之TF_IDF原理与实战。

yumiwangzi30的博客 171

【unity细节】Default constructor not found for type Player(找不到默认构造函数)

本文由原创。

秩沅 1974

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 218

【Unity学习】 ECS、Job System、 Burst 之第二章:做一个非常简单的demo,生成大量的Entity球体

详情请看我的博客:https://blog.csdn.net/chang_1134/article/details/86065825

Unity Burst详解

Burst是Unity的编译优化技术,优化了从C#代码编译成Native代码的过程,经过编译优化后代码有更高的运行效率。在Unity中使用Burst很简单,在方法或类前加上[BurstCompile]特性即可。在构建时编译代码的步骤,Burst编译器会识别该特性对方法或类做编译优化。其适用于高性能计算的场景,逻辑复杂的场景不适用。Burst编译的实现得益于已有的SIMD和LLVM技术。

enternalstar的博客 2851

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 323

unity打包APK报错: BuildFailedException: Burst compiler (1.8.2) failed runnin

在项目文件夹中找到编辑bcl.exe.config文件,4.2.0.0改为4.0.0.0,然后再次Build就好了,目录…\Library\PackageCache\com.unity.burst@1.8.2.Runtime\bcl.exe.config。附上另外的常规解决方法。

weixin_42327333的博客 1929

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1221

Unity Burst学习2

和JobSystem配合使用 导入命名空间 using Unity.Burst; using Unity.Jobs; using Unity.Collections; 注意里面用到的都是值类型,如果是Vector3之类的,需要转换成Unity.Mathematics中的float3。支持readonly静态数组 [BurstCompile] struct ST : IJob { [ReadOnly] public float a; [ReadOnly] publi

bingheliefeng的专栏 613

TPS5430/54302调试血泪史:从‘烫手山芋’到冒烟烧板,我的5V电源到底怎么了?

本文深入剖析了TPS5430/TPS54302 DCDC电源芯片调试中的常见问题,包括异常发热、电压漂移等,并提供了从热设计到PCB布局的全面解决方案。通过实战案例,揭示了数据手册中未明确的‘潜规则’,帮助工程师避免烧板风险,提升电源系统稳定性。

weixin_28744423的博客 498

Unity的Package了解(2020.3)

已验证包 ---------------------------------------------------------- 2D Animation:com.unity.2d.animation 为使用精灵实现骨骼动画提供了所有必要的工具和运行时组件。 2D Pixel Perfect:com.unity.2d.pixel-perfect 2D Pixel Perfect 包中包含 Pixel Perfect Camera 组件,可确保像素图像在不同分辨率下始终保持锐利清晰,并在运动中保持

NRatel的博客 6149

【文章阅读+代码复现】Point-GNN

Brief 在3D点云语义分割方法中,GNN已经做了很多可用的方案,但是在目标检测上依旧是采用比较传统的CNN和稀疏卷积的组合,这一篇文章是研究了图卷积在3D检测的中的用法。来自卡内基梅隆大学。已经被CVPR2020接收. 这里是 paper 这里是 code Abstruct 一个采用GNN设计的3D目标检测框架 过程是先将点云场景编码成图结构,随后设计了一个叫point-GNN的网络结构,在...

有所为,有所成长 1万+

NC65增加自定义参照并且参照数据要根据选择的财务组织过滤

1、首先定义一个参照类 package nc.pub.jzcm.ref; import nc.ui.bd.ref.AbstractRefModel; import nc.ui.bd.ref.IRefDocEdit; import nc.ui.bd.ref.IRefMaintenanceHandler; public class PMPrPayDefaultRefModel extends AbstractRefModel { public PMPrPayDefaultRefModel(){ ...

xyl的博客 3494

Unity DOTS 学习笔记1 - ECS 0.50介绍和安装

Unity DOTS 学习笔记1 - ECS 0.50介绍和安装 为什么学习这个技术 ECS的全称为Entity Component System,是最早由暴雪在GDC2017上提出的一个新的游戏设计框架,数据和处理上都和目前主流的面向对象OOP有很大的差距。他是面向数据编程(DOD),他的优点也就是缺点,不用繁杂的对象和继承关系,只处理符合条件的数据,他的最大优点就是快。 看下图说明:来源https://learn.unity.com/tutorial/part-1-understand-data-ori

thinbug的专栏 6589

【YOLOv13[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文将进行添加YOLOv13版本的升级版热力图可视化功能的实践,支持图像热力图可视化、优化可视化效果、 可以选择使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一个参数即可设置是否显示检测框等。

静谧、淡雅 642

【Unity学习】 ECS、Job System、 Burst 之第一章:环境搭建

1、创建自己的项目,进入PlayerSetting,将.Net从3.5修改至 4.x 2、在项目的根目录 找到 Package文件夹,打开里面的manifest.json,在最后面补上以下文字 PS:别忘了补上上面的逗号 注意Entity的版本可以设置最新的 "com.unity.entities": "0.0.12-preview.21" }, "registry": "https://s...

个人博客 4867

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 336

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

关于Unity 2018的实体组件系统(ECS)二

孙广东  2018.5.20关于Unity 2018的实体组件系统(通用名称ECS)二 将介绍如何在Unity上使用实体组件系统(通常称为ECS)。 这次的内容是Unity提供的ECS API的基本用法,一个小应用程序和并行化。 它不包括与Unity的GameObject / Component的合作,以及实际使用。 获取可以使用ECS的编辑器U...

游戏路上的小学生 1万+

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

【Unity学习】ECS、Job System、 Burst 之一:介绍

什么是ECS? ECS,中文:实体-组件系统。并不是什么新鲜玩意,它是在游戏架构中广泛采用的一种架构。在游戏中,每个物体是一个Entity(实体),比如,敌人、子弹、车辆等。每个实体具有一个或多个组件,赋予这个实体不同的行为或功能。所以,一个实体的行为可以在游戏运行时通过加减组件进行改变。ECS经常和数据驱动模式一起使用。 wiki链接 从上面介绍可以看到,Unity中的GameObject好...

白夜的博客 5004

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

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

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 178

AlexNet技术剖析:2012年那场ImageNet比赛如何引爆深度学习

2012年,AlexNet在ImageNet竞赛中将图像识别错误率从26.2%降至15.3%,开启深度学习革命。其成功源于三大创新:ReLU激活函数缓解梯度消失、Dropout防止过拟合、GPU并行加速训练。结合大规模标注数据(ImageNet)与数据增强策略,AlexNet突破传统特征工程瓶颈,推动计算机视觉进入“

大雾的小屋的博客 339

计算机毕设:基于深度学习的狗狗品种图像分类

本课题研究基于深度学习的狗狗品种图像分类方法,面向 120 个犬种、20580 张图像构建细粒度分类模型。数据处理采用分层划分并固化清单,模型以 ImageNet 预训练网络做迁移学习,配合标签平滑与数据增强应对标注噪声,评估以 Macro-F1 为主指标并分析易混品种。系统使用 Python 与 Django 实现上传识别、批量识别、资料浏览与记录查询,验证了方法在实际使用场景中的可行性。

WEIXIN_JSJBSZDS的博客 268
上一篇: 团结引擎动画系统|Event Graph CodeGen:一键编译图逻辑,提升运行时性能
下一篇: 团结引擎 Shader Graph Template |为 Shader 创作提供更高效的起点
Unity官方开发者社区
博客等级 码龄3年 597粉丝 752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值