论文解读 | 自动编译框架AMOS

AMOS—一文帮你快速了解Amos界面 一文帮你快速了解Amos界面,包括工具栏、菜单栏等。 阅读详情

软件到硬件资源的自动映射是编译器的一项重要技术,也是业界研究的一个热门方向。本文主要观点来自发表在计算机体系结构领域顶级会议ISCA2022上的一篇论文——AMOS: Enabling Automatic Mapping for Tensor Computations On Spatial Accelerators with Hardware Abstraction,希望可以给读者一些启发。

1. 摘要

如今计算设备逐渐向专用化方向发展,加速器设备(Spatial hardware accelerators)中有多层级专用的计算和存储资源,已经在深度学习、科学计算、数据挖掘等领域显示出较高的性能优势。软件开发者需要使用硬件专用的指令集才能发挥出加速器的计算性能。然而,开发者普遍缺少对这类加速器设备和对应的专用指令集的理解,比如其硬件抽象表示、性能优化空间及自动化探索优化空间等。现有的编译器通常使用手工方式和基于模板方式进行代码性能优化,其中手工方式开发成本较高,基于模板方式可能会导致得到次优解。

本文提出一个用于计算加速器的自动编译框架AMOS。框架的核心是硬件抽象,不仅可以准确描述硬件指令行为,而且可以统一定义计算任务到硬件的映射。基于硬件抽象,作者使用性能代价模型在所有可能的映射空间中自动探索最优映射。总体来看,该编译框架使用硬件抽象作为编译器IR,探索计算映射和存储映射,最终可为多种硬件后端生成高性能代码。实验表明AMOS在TensorCore上比手工优化性能提升2.5倍,在Intel CPU AVX-512指令集支持的芯片上比TVM性能提升1.37倍,在移动端的Mali GPU上比AutoTVM性能提升25.04倍。

1. 简介

作者将计算加速器的软件到硬件的映射方式划分为两类:硬件可感知和指令集可感知。

  • 硬件可感知:编译器知晓硬件架构细节信息,比如PE(processing element)数量、PE间互联方式,这样软硬件映射过程可以转化为一个在给定硬件约束下的优化问题。这种映射方式具有较高的能效比,但是牺牲了一定的灵活性(当搜索空间发生变化后,映射过程需要重新生成)。代表性编译器有Triton、CoSA、SRAR、HASCO。

  • 指令集可感知:映射过程对硬件架构无感知,只根据对外暴露的指令集进行软硬件映射。XLA、TVM、Ansor、AKG、Tiramisu等均归为指令集可感知。本文聚焦于指令集可感知的映射。

指令集可感知方式通过提供张量计算的若干内置函数(Intrinsics)提高了可编程性,但仍面临两方面挑战:

  • 给定算法下,如何生成最优指令。比如,二维卷积的7层循环映射到Tensor Core上,映射方式有35种。现有的编译器如TVM、ISA Mapper等主要依赖基于模板或手工编写方式,这样可能会得到次优解。

  • 理想的映射方法对不同加速器是统一的,然而不同加速器提供的指令集相差较大,在给定算法下,无法统一开发。比如,Tensor Core使用不同的内置函数来描述矩阵加载/存储/相乘操作,在Mali GPU中只需使用一条内置函数arm_dot就可以完成数据加载和执行。

本文设计了一个在指令集之上的抽象层来解决如上两方面挑战。抽象层包括计算抽象和存储抽象两部分,可以统一描述不同加速器的指令集,实现了统一的自动映射流程。另外,作者设计了一个性能评估模型来评价所有可能解。最终,AMOS将映射问题抽象后转化为一个迭代优化问题。

2. 背景和动机

2.1 专用计算加速器

专用计算加速器通常分为多个层级,最内层是有多个PE组成的计算阵列,中间层是由多个计算阵列组成的subcore,最外层是由多个subcore组成的core以及core间共享的全局存储器,如图1(a)所示。专用计算加速器通常嵌入在通用计算架构类芯片中,如在CPU或GPU中嵌入专用计算加速器。Nvidia GPU中的Tensor Core,Mali GPU中的dot计算模块,华为Ascend NPU中的cube模块都被看做专用计算架构。

0dbc7739679afcdda5c5c13f4ace7b4b.png图 1

硬件厂商一般都会为加速器设计专门的指令,这类指令主要分计算型指令和访存型指令两种。图1(b)中AVX-512指令集中__mm512_add_pd是一个向量加指令,__mm512_loadu_ph是一个向量数据加载指令。Tensor Core中mma_sync是一个矩阵乘指令,load_maxtrix_sync是一个矩阵数据加载指令。

2.2 现有的映射流程

表1中列出来业界领先的编译器,可以分为两类:

  • 硬件可感知映射:编译器知晓PE互联和存储配置等信息,因此编译器可以将软件层面上的计算任务lower到每个PE和存储单元,这一过程主要应用软硬协同设计,即在特定硬件资源约束下最大化资源利用率。由于映射搜索空间巨大,这类编译器通常使用线性规划来实现软件到硬件资源的映射。

  • 指令集可感知映射:空间加速器都对外提供专用指令集,为了生成高性能代码,软件开发者一般需要编写调度模板,并且在给定的调度空间内搜索出最佳调度。例如TVM提供了一个tensorize接口原语,开发者需要手动实现该接口函数;作为多面体优化编译器的代表,AKG依赖多面体模型和模板来进行软硬件映射。

4bdfdeb920105cc0a13bd0b4e22a46af.png表 1

2.3 动机

表2对比了深度学习编译器XLA在典型模型上的映射效果,虽然XLA中使用了大量复杂模板,但是运行典型模型时也只有少量算子可以映射到NVIDIA V100 Tensor Core上。例如,ShuffleNet中的深度可分离卷积和分组卷积是普通二维卷积的两个变种,内部同样是大量乘加操作,原理上讲是适合在Tensor Core上运行的,但是XLA却无法将这两类算子映射到Tensor Core上。原因是因为XLA中手工编写的模板无法成功匹配到这两类算子。

c8d9f521d7eeeb8e245a50f0c8f391f1.png表 2

手工编写模板有两个限制:第一,手工编写的模板依赖于显式地基于指令集实现代码,这种方式人力成本高、开发周期长,因此只能支持少量部分算子的映射。第二,手工编写的模板适用性受限,例如对算子稍加改动(例如改变数据排布方式)后,就可能导致模板匹配失败。为解决如上问题,本文设计了一个无模板不依赖设备厂商第三方加速库(如cuDNN/cuTLASS)的自动映射编译流程。

3. 原理

图2展示了AMOS的编译流程,输入是由Python编写的高层次代码和基于计算和访存抽象出的硬件指令组成,然后生成不同的映射组合。一个映射组合由计算映射和访存映射组成:

  • 计算映射是将算子转为计算指令映射到空间加速器上;

  • 访存映射通过访存指令描述数据的访问和存储行为。

6b430d601c36c2e8d2ee11377af1c797.png

图 2

5c41addab8052ec00cbdda8a9409d900.png

公式 1

整个映射生成过程分为2个阶段,第一阶段是将循环迭代映射到一个虚拟加速器上,第二阶段是加入硬件资源和指令集限制,调整以前的映射过程最终映射到物理加速器上。

以Conv2D为例进行说明,首先将循环迭代空间映射为指令集迭代空间。在下图中循环迭代维度n,p,q映射至指令集的i1维度,循环迭代维度k映射至指令集的i2维度,循环迭代维度c,r,s映射至指令集的r1维度。然后,将卷积操作转化为矩阵乘操作,完成计算和访存代码到指令集的映射。第一阶段映射完成,在该阶段不考虑硬件资源和指令集约束。

第二阶段中,实际的硬件加速器只能计算特定shape的数据,文中称之为问题大小限制。针对存储容量限制,每种存储器只有有限的存储空间,因此文中将张量数据切分为片,然后多次执行load/store来完成访存操作。这样基地址和地址偏移量会存在多次更新。

a7f4a5d5c60e57ecad37b81de9fb5dba.png

图 3

如上操作可能会生成一些非法的映射,因此文中也提出一种映射结果验证方法用来过滤掉非法映射。映射结果验证方法描述如下,核心思想是通过分析生成的0、1构成的矩阵得出合法映射。

在探索最优映射方面,文中构建了一个代价模型的数学描述(只考虑时延指标)。由于空间加速器都是分层次设计,系统的整体时延等于最上层硬件抽象层的时延,每层的时延是计算、读取、写入操作时延的最大值。

2ea00e27a04609dbbc6c75eacf7dac57.png

公式 2

4. 实现

实现上,硬件抽象层通过IR抽象描述,文中基于TVM的tensorize接口新增了2个IR节点(计算节点和访存节点):计算节点IR中的第一个属性是张量数据,第二个属性是计算表达式Expr,第三个属性是指令迭代空间;访存节点IR中的第一个属性是目的地址数据,第二个属性是描述数据驻留的存储器类型(global、shared、register),第三个属性是源地址数据和加载索引。在代码生成时将新增的IR节点插入到AST中。

5aadfb9b64fb042a2815cdb85412821b.png

表 3

5. 效果

AMOS在绝大部分测试项中均超过PyTorch,加速比0.91到10.42。Bert模型中有大量矩阵乘操作,矩阵乘操作已经在多个第三方库中充分优化了多年,即便如此,在batchsize为16时AMOS仍然可以达到第三方库90%的性能。在ShuffleNet中可达到10.42的性能加速比,原因是该模型中存在大量深度可分离卷积和分组卷积,第三方库没有充分将这两类卷积支持到Tensor Core中。同时,AMOS与TVM相比也有明显的性能优势。

bbb9e79e12d72049c6e5ff72798e483d.png

图 4

同时,AMOS具有良好的泛化性,可支持多种加速器设备,如Tensor Core、Intel CPU的AVX-512矢量单元、Mali GPU的点乘单元,作者在这些加速器设备上也做了大量实验,在这些加速器设备上与TVM相比均有一定的性能提升。

最后给我们团队的开源项目打个广告,Adlik 是中兴通讯贡献的深度学习推理工具,已获得 Linux AI 基金会支持,目前仍在持续完善中,期待大家的支持和关注:Github Adlik;另外,我们也在做深度学习编译器方向的前沿技术研发工作,欢迎感兴趣的小伙伴加入我们~~

b65b36afb5d7d1597c4f6c2b5c8897c2.png


MyBatis源码解析之基础模块—DataSource MyBatis源码解析之基础模块—DataSource 前文回顾 上一章节我们一起学习了Mapper接口绑定的源码逻辑。本次我们学习MyBatis的DataSource数据源模块。 为解决这种操作方式的弊端,在mybatis版本中提供了binding模块。从而能够在编译期就能够发现问题。同时通过采用jdk动态代理模式,开发者只需要要编写对应的接口即可完成持久层的开发工作。即降低工作量,有大大降低出错概率。 接下来,我们将通过源码详细介绍binding的执行逻辑。 背景知识 因为常见的数据源都会基于java. 阅读详情

相关推荐

实战分享:在盘古100Pro+上快速上手紫光同创FIFO IP core的5个关键步骤

本文详细介绍了在盘古100Pro+开发板上快速集成紫光同创FIFO IP core的五个关键步骤。从环境准备、IP手册解读、图形化配置,到生成例化与工程集成,最后进行功能验证与调试,为FPGA开发者提供了一套高效、可靠的IP核应用实战指南,助力提升项目开发效率与可靠性。

sony5的博客 120

AMOS从零到基本操作入门(转载)

AMOS软件究竟用来干什么?一般的研究论文的数据分析部分少不了对样本的描述,对变量进行探索式因素分析,然后再利用多变量分析技术或SEM来进行数据分析,最后提出研究结论(验证假说),提出建议。什么是SEM?结构方程模型,英文名Structural equation modeling, 简称SEM,是一种融合了因子分析和路径分析的多元统计技术。它的强势在于对多变量间交互关系的定量研究。我们常见的因子分析法,一般用SPSS软件就可以分析。但其实因子分析法是两种分析形式的统一体,即验证性分析和纯粹的探索性分析。探索

Laoacai的博客 2万+

AMOS软件简介及编程实践

通过本文的介绍,我们了解了AMOS软件的基本情况以及它提供的编程功能。通过示例代码的演示,我们也能够感受到AMOS编程的简洁与强大。AMOS(Advanced Mortal Online Scripting)是一款支持高级编程的软件,它提供了一套强大的工具和语言,用于创建复杂的计算机程序。强大的图形处理能力:AMOS内置了丰富的图形库和图形处理功能,使得开发者可以轻松地创建各种图形效果、动画和交互式界面。高度可扩展性:AMOS支持插件和模块化设计,开发者可以根据自己的需求自定义功能和扩展软件的功能。

CoderExtra的博客 1541

AMOS学习笔记

AMOS(Analysis of Moment Structures)是一种统计分析方法,用于探究测量模型和结构方程模型的原理。AMOS通常用于心理学、社会学、教育学等领域中,来测试和验证理论模型,并通过数据进行模型拟合和检验。

m0_72410588的博客 1940

SPSS 16/17一键安装PLS回归插件(含演示数据与自动配置脚本)

专为SPSS Statistics 16.0和17.0版本定制的偏最小二乘回归(PLS)功能扩展工具,以原生插件形式集成进SPSS菜单栏,无需额外安装R或Python环境。安装过程全自动执行,通过内置Python脚本(Extras.install.py)完成模块注册、路径识别与界面项添加,支持Windows系统即装即用。安装后可在SPSS图形界面中直接调用PLS建模功能,涵盖潜变量路径分析、主成分提取、交叉验证(如Venetian盲法)、R²、Q²等模型拟合指标输出。配套提供Demo目录下的实操示例数据集,

loss4bartender的博客 256

AMOS步步教程

超详细的AMOS使用教程,撇开繁复的结构方程原理,从软件使用角度着手,十分适合初学时快速上手AMOS分析

Amos简介及安装步骤

想要学习更多SPSS、AMOS、R等软件操作,请关注“数据分析成长记”微信公众号,更多精彩文章等你来读! Amos AMOS.TIME IBM® SPSS® Amos 是一款强大的结构方程建模 (SEM) 软件,支持通过扩展标准多变量分析方法(包括回归、因子分析、相关分析以及方差分析)来支持研究和理论。使用直观的图形或程序化用户界面构建态度和行为模型,与标准多变量统计方法相比,这些模型可以更准确地反映复杂关系。Amos 包含在 SPSS Statistics 的高级版中(校园版除外,这里单独销售)。您

Data King的博客 5万+

AMOS数据分析

数据分析

《UNIX环境高级编程》第二版源码在Ubuntu下的编译

1.在http://www.apuebook.com下载源代码 2. 查看READ root@ubuntu:/home/wl/mywork/apue.2e# cat -n README 1 Read the file called DISCLAIMER. 2 3 Some source changes needed to be made after the

xlsernt_sina_com的专栏 699

实体对齐(Entity Alignment)相关论文与数据集整理

实体对齐(Entity Alignment)、知识图谱融合方法总结整理 年份 模型 主要思想 博文推荐 论文 代码 2019 Entity Alignment between Knowledge Graphs Using Attribute Embeddings 实体对齐数据集整理 名称 — DBpe-dia(DBP) LinkedGeoData(LGD) Geonames(GEO) YAGO ...

bjxxkjdxcdd的博客 1万+

MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录MOOS-ivp 实验三 MOOS简介(3)六、A Simple Example with pXRelay1.pXRelay基本使用2.pXRelay简单例子3.pXRelay实验七、First Experiments in Modifying MOOS App Code1.下载一个MOOS模板文件2.打开MOOS模板文件总结 六、A Simple E

weixin_44151170的博客 2534

OpenAI Codex 史诗级更新!Computer Use 解锁全场景桌面 Agent,实测 95% 跨应用自动化完成率

OpenAI最新发布的Codex全场景更新将AI编程助手升级为桌面级AIAgent,核心亮点包括ComputerUse插件实现跨应用95%自动化完成率、内置浏览器DOM元素精准识别、多模态图像批量生成等六大功能。实测显示,Codex可后台静默完成12分钟跨应用任务链,具备异常处理与断点续跑能力。技术层面采用Rust编写的沙箱隔离架构,支持MCP协议跨应用协同,token消耗仅为竞品1/3。该更新标志着开发者将从编码者转型为架构设计者,办公自动化进入自然语言驱动新阶段,同时将加剧大模型生态竞争。目前主要限制为

爱人爱己,风生水起 2910

华为BEM战略解码体系完整版(85页PPT)(文末有下载方式)

在部门层面,战略解码的核心是将公司战略逐层分解到部门,确保部门目标能够有效支撑公司战略。战略解码的关键原则包括:对公司战略和业务目标的支撑、指标选取考虑部门责任特色、对公司业务流程的支撑、战略解码,华为公司实现了从战略制定到执行的闭环管理,确保了战略目标能够通过可衡量的。战略解码,华为公司实现了从战略制定到执行的闭环管理,确保了战略目标能够通过可衡量的。战略解码体系的核心目标是将公司战略逐层分解,确保战略目标能够通过可衡量的。在公司层面,战略解码的第一步是战略澄清,明确公司的使命、愿景、战略目标及。

AI_data_cloud的博客 2400

整体认识mybatis与源码分析

第一节课:整体认识mybatis与源码分析 第二节课:Mybatis源码分析二 第三节课:Mybatis源码分析三 第四节课:Mybatis与Spring整合与徒手实现 学完之后可以get到: Mybatis在开发中作用与工作原理 Mybatis源码的精髓与设计模式 Orm框架的核心思想与设计能力 一、传统JDBC弊端 总结: 1、jdbc底层没有用连接池、操作数据库需要频繁的创建和关联链接。消耗很大的资源 2、写原生的jdbc代码在java中,一旦我们要修改sql的话,j..

1 350

大话西游2单机版V8一键架设教程:从下载到GM权限全流程(附仙玉修改技巧)

本文详细讲解了大话西游2单机版V8的一键架设全流程,包括环境准备、服务端配置、客户端安装及GM权限获取等关键步骤。特别提供了仙玉修改技巧和高级资源管理方法,帮助玩家快速搭建个性化游戏环境并掌握核心控制功能。教程涵盖Windows系统兼容性设置、常见问题解决方案以及数据备份策略,适合各类怀旧玩家和技术爱好者。

weixin_29254673的博客 1036

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3297

oracle locking and latching,LoopJump

读了Architecture of a Database System这篇经典论文,挑了些不太熟悉的内容做了笔记。论文内容基本上谈不上是在讲架构吧,基本上就是罗列了下有哪些组件,而且内容基本上针对原来传统数据库的。主要包括几个组件:Client Communication ManagerProcess ManagerRelational Query ProcessorTransaction Sto...

weixin_39608134的博客 154

基于STM32的频率计(采用外部中断的方式)

前言 最近在了解电赛相关的东西,和指导老师交流一下,我决定先从最简单的频率计做起。 频率计是来检测信号的频率的,在做频率计的时候可以用信号发生器发出的信号来进行测试。 原理 这是最基础的方波,我们可以通过检测上升沿的方式来测量其频率。从周期的角度出发连续两个上升沿的时间就是这个方波的周期,那这个周期分之一就是这个方波的频率了。 在思考了一段时间~~(我是萌新。。)~~ 我觉得有两个方法可以实现,第一个是采用stm32定时器的输入捕获功能,第二个就是用外部中断来实现这个功能。正如标题,我这次采用外部中断的方

qq_45784922的博客 6171

Velvet1.2.10的安装和使用

1. Velvet的安装 Velvet用于基因组的de novo组装,支持各种原始数据,包括Illumina的short reads和454的long reads。 首先下载velvet的安装包,直接使用make命令来编译,即可获得可执行主程序velveth和velvetg。安装如下: $ wget http://www.ebi.ac.uk/~zerbino/velvet/velv...

a12141986的博客 1217

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1827

DirectX function “GetDeviceRemovedReason“ failed with DXGI_ERROR_DEVICE_HUNG (“The GPU will not resp

游戏报错"DXGI_ERROR_DEVICE_HUNG"的解决方案 在使用RTX 40系显卡运行FIFA 23等游戏时,可能出现DirectX报错导致游戏崩溃。这主要由于最新显卡驱动与DirectX 12的兼容性问题。解决方法包括: 降级显卡驱动版本 修改游戏配置文件,将DIRECTX_SELECT设为1 在显卡控制面板中关闭垂直同步、抗锯齿、DLSS 3等功能 调整电源模式为性能优先 这些操作可以有效解决因驱动兼容性导致的游戏崩溃问题。

猿小白的博客 3888

下一个SWE-bench?解读Meta最新软件工程基准ProgramBench

arXiv:2605.03546v1 (预印本标识)John Yang, Kilian Lieret, Jeffrey Ma, Parth Thakkar 等总结1: 评估范式由SWE-bench的修bug改为直接重建整个项目。现有的代码大模型评估(如SWE-bench)陷入了“填空题”和“局部修补”的瓶颈。ProgramBench首创了“黑盒逆向工程+从零构建”的范式,强迫AI承担真正的“软件架构师”角色,是极具前瞻性的基准测试。总结2: 评测与实现方式无关,只关注项目最终表现是否一致。

hxshine的博客 654

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java学习笔记-多态机制的意义及实现

在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP。这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事。 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism, almost universally called just po...

JustDI0209的博客 320

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RawTherapee与dcraw对比分析:为什么选择这款开源照片处理神器

RawTherapee是一款功能强大的跨平台开源原始照片处理程序,它在dcraw的基础上进行了深度优化与扩展,为摄影爱好者和专业人士提供了更全面、更灵活的照片编辑体验。本文将深入对比RawTherapee与dcraw的核心差异,帮助您理解为何这款开源神器能成为RAW处理的理想选择。 ## 📌 核心差异:从命令行工具到专业工作站 dcraw作为经典的RAW解码工具,主要专注于原始数据的读取与转

gitblog_00445的博客 443

假人有限元模型

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

QEMU 8-早期项目

以下是 Fabrice Bellard(QEMU、FFmpeg 等知名项目的创始人)在。(通过将 Java 代码转换为 C 实现)。改进 Linux 图形帧缓冲驱动的架构设计。,与 Sylvain Delas 合作完成。实现高效渲染(大部分用汇编编写)。:2024 年 12 月 26 日。完成的一系列技术项目,涵盖。计算并输出当时已知的最大素数。的实时缩放演示,并提供源码。,程序可实时旋转查看,用于。实习期间完成的首个版本。等重大项目奠定了基础。,小巧、免费且高效。(检测其他机器人)。

hxsln11的博客 1019

《Monkey Android》第5课之剖析第一个App

通过本节课可以学习到的内容: 第一个App最重要的三个文件 MainAcivity.java代码分析 activity_main.xml代码分析 AndroidManifest.xml代码分析

安卓猴的专栏 805
上一篇: LLVM MC 简介
下一篇: Adlik如何实现与燧原芯片的对接?
Linux基金会AI&Data基金会
博客等级 码龄6年 100粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值