面向对象系统设计经验谈

第十章:面向对象分析(此章完结) 10.4.4建立活动图 活动具体表现为由一系列动作组成的执行过程,将各种活动及不同活动之间的转换,用图形进行表示就构成了活动图,作用是对系统的行为建模 1、活动图与流程图 活动图描述系统使用的活动,判定点和分支、活动图本质是一种流程图借鉴了工作流建模,Petri网等领域的相关概念,其表达能力比流程图更强、应用范围也更宽。 活动图与流程图的区别:不能将两个概念混淆,首先流程图着重描述处理过程,它的主要控制结构是顺序、选择和循环各个处理过程之间有严格的顺序和时间关系,活动图描述的是对象活动的顺序关系所遵 阅读详情
转载自卢彦的Blog  http://www.agilelabs.cn/
 
面向对象系统设计经验谈
 
就像我在应用架构设计总结这篇BLOG中提到的那样,面向对象的系统设计就好象一群人翻越一座陡峭的悬崖,只要任何一个人没有翻越过去,那么就无法设计出真正的面向对象系统。
 
归结一下,在你打算进行面向对象的系统之前,你一定要考虑是否已经解决或能解决以下的问题:
 
一、对象的持久化
对象的持久化是最容易被想到的问题,同时也是最难解决的问题。由于关系型数据库模型和面向对象模型存在一些比较大的差异,如何将你的对象保存和快速的查询出来很是头痛。虽然采用面向对象数据库虽然可以最方便的解决这个问题,但是你会面临更多其它的问题,比如备份,报表和实施维护人员的培训等等。虽然有像NHibernate这样的ORM框架来帮助你做这个工作,不过你需要去多学习一门资料不全的新技术。另外,这些开源产品中有不少的BUG,你必须有做好调试别人代码的准备,如果你无法完全掌握这些代码的话,你会死得很惨。
如果你采用了面向对象来设计领域模型,又没有找到将对象直接关系化到你的数据库中的办法的话,最好不要采用面向对象的设计。否则你会被手工的ORM折磨疯的。 比较好的选择是用强类型的DataSet,配合VS.NET的数据向导工具,非常快。(很有道理)
 
二、界面显示
由于界面无法直接的将复杂的对象显示出来,你在界面层又必须再做一次对象的平面化操作,将对象变成各种列表和文本框控件可以直接绑定的一维或二维数据结构。这方面目前还没有什么好的自动化方案,你必须手工做。所以我们的策略就是尽量减少这个转换步骤,就是在服务端就把面向对象转换成平面数据,然后在客户端直接绑定到控件上。在数据传输对象的选择上,可以用自定义对象,也可以用DataTable做传输对象,两者区别不是很大,各有各的好处。但是考虑到DataTable可以有一些绑定方面的优势和VS.Net的调试方面的支持,我们选择了DataTable。
如果你的对象是手工持久化的话,你做到这一步会感到很沮丧。因为平面的数据被你费了老大劲从数据库中转为对象,还没有怎么体会到面向对象的好处,又要再将对象还原成平面数据交给界面去显示,你可能会觉得非常的不值得。不如直接就把平面数据读出来交给界面去显示,既简单又方便。如果你已经产生了这个念头的话,恭喜你,你已经离全面放弃面向对象系统设计,完全退回到面向过程不远了 。(再次暴露了ORM存在的一些问题,从数据库取回的DataSet转成Object集合后,到UI又得进行转化后与控件绑定,特别是CS应用)
 
三、远程调用
如果前面你还能坚持下来,到了这一步,很少人再能坚持了。面向对象对远程访问的问题考虑不足,使用面向对象开发系统的一个最大的优点是建模能力强,业务模型很清晰。比如你要找某个用户的公司名称,你可以简单的用User.Company.Name来得到该用户所属公司的名称。假如你用了多层结构,那么问题来了,你的对象是建在n层上的,而你需要在n+1层里对对象进行操作。而且n层和n+1层是远程调用。那么,如果你传个User过去,很明显用User.Company.Name是获取不到公司信息的。所以,如果你打算在n+1层做业务逻辑的话,你必须把整个对象树传递过去,这样做明显代价又太高。很多面向对象专业人士就提出了什么VO,BO,DTO,PO等等五花八门的贫血对象来企图解决这个问题,这样做的结果不仅是把问题给搞复杂化,更糟糕的是,这样一来,你当初所憧憬的面向对象系统其实已经是一个变相的Action Script系统了。
所以最好的方式是你就在领域模型层把业务处理完,中间层不要采用什么分布式系统设计。Martin Fowler说过:“分布式系统设计的第一原则是,不要使用分布式系统”。不知道有多少人能理解这句话的含义。
AF在解决这个问题上也提供了很大的帮助,我们利用了AF创造的统一编程模型,将逻辑尽量都放到领域层里。从而可以让更多的操作直接利用到领域模型的完全面向对象的业务逻辑处理的好处。
 
四、开发人员的面向对象思维
这一点最重要,如果开发人员无法认识到面向对象的好处,并且在思维模式上有很顽固的面向过程套路的话。在面对上述问题的时候会抱怨连连,不会尽全力的配合。如果整个的意见无法达成一致,那什么东西都做不出来,因为团结才是最重要的。所以你要么尽力说服你的团员,让他们真正的明白并理解为什么要这么做,要么你就趁早放弃。
最后一条建议:
要么就完全用面向对象的概念去设计,要么就完全用面向过程。如果当初是决定要走面向对象的道路,后来又在关键性问题上向面向过程做妥协。那么就干脆完全用面向过程的思维去解决问题比较好。否则面对一个四不象的怪物,你会发现维护起来更加麻烦。
翻越面向对象这座大山非常艰辛,但是你如果真正能翻越过去,你会发现面向对象的世界真的是一个很美妙的境界。
 
系统分层经验谈
 
为了将业务规则从界面和数据库中剥离出来,通常的做法是抽象出一个业务逻辑层出来,专门负责对业务逻辑进行处理。一般多采用三层结构,既表现层,业务层和数据层。
 
当开发人员在以前的两层结构中痛苦煎熬了很长一段时间,突然看到了三层结构的解决方案的时候,一般会有终于找到了救世主的感觉。但是这种感觉往往会导致掉到另外一个同样恐怖的陷阱“过度设计”中。在我以前曾经供职的一家公司,以前都是把SQL语句直接写在ASPX页面的,后来在读到了一些关于多层结构方面的资料之后,一下子又把整个系统分成了:表现层(ASPX)、接口外观层(IF),业务外观层(BF),数据访问外观层(DAF),数据访问层(DA)和数据访问组件(SQLHelper)。但是我并没有吸取教训,导致后来也犯了同样的错误。
 
犯错误的原因有很多,不过主要是因为没有一个比较明确的如何分层的指导性原则。假如说我们分层的原则是为了抽象逻辑,分三层的原因是要让业务逻辑和界面及数据库解除耦合,那么如果按照这个分层原则,我把逻辑重新归类更加细的分为四层、五层、六层行不行呢?如果不行,那是什么原因不行呢?在没有正确的原则指导下,分层技巧很容易被滥用,导致分出许多没有必要的层出来。无端的增加了开发和维护成本,以及更重要的是增加了重构的代价,降低了团队的敏捷能力。
 
面向对象架构设计大师Martin Fowler在介绍如何设计分布式系统的时候曾说过:分布式系统的设计原则的第一条是,不要使用分布式。他的意思当然不是说要绝对禁止使用分布式设计,而是劝导人们尽量把问题简单化。能不分布式设计的,就不要分布式设计。
我套用他的这句话提出我对分层的感受就是:多层结构系统的设计原则第一条是,不要使用多层结构 。(增加相关分层一定要有明确的作用和存在的意义)
 
当然我的意思也并不是说层数越少就越好,而是希望你能清醒的认识到增加层数会增加结构的复杂性,不要轻易的作出分层的决定,一定要到感觉必须要增加一层才能解决问题的时候,再来决定增加一层。
 
过多的层次除了会给系统带来不必要的复杂性外,还会影响你的系统结构设计。如果你打算采用面向对象的领域模型来设计系统的话,在业务系统内的分层会给面向对象系统的设计带来很多麻烦,会很容易走回到事务脚本的老路上去。关于这一点,我在面向对象系统设计经验谈这篇BLOG里详细的谈到过,这里就不再赘述。
 
下图是我们最终定型的应用系统结构层次:
   
 
总结一下:
建立一个完全面向对象建模的领域模型层,让这个层尽量处理多的业务逻辑。其它层尽可能的薄一点,把业务逻辑都转移到领域模型层中。

UI尽可能和领域模型贴近一点,中间不要经过太多中转,物理边界也尽可能的少。
业务对象只能有一套,也就是领域模型。只要出了领域模型层,外面全部是零散数据,没有对象的概念。
只有在领域模型层才可以处理对象。
如果一定要分布式。全部用简单数据类型通过接口访问领域模型。
这个分层结构其实是经历了多次精简完成的,所有的感触都归结为一句话: 不要过度设计,简单就是美。
本文为人月神话博客原创文章,转载请务必注明出处。
OSAL与跨平台驱动框架设计:从原理到嵌入式系统实践 操作系统抽象层(OSAL)是嵌入式系统开发中的核心设计模式,旨在解决硬件驱动在不同操作系统间的移植难题。其原理在于将操作系统底层原语(如任务、内存、中断)抽象为统一接口,实现驱动业务逻辑与系统依赖的解耦。这种分离关注点的设计,在工程上极大提升了代码复用率和可维护性,是构建稳定、可移植嵌入式软件的关键技术。其技术价值在于通过一次编写、多处运行的框架,显著降低为VxWorks、Linux等多种RTOS和专有系统适配驱动的成本。应用场景广泛覆盖网络设备、工业控制等需要硬件抽象和跨平台支持的领域。本文以NXP网络处 阅读详情

相关推荐

MATLAB二十年生态演进:从基础操作到高级开发与部署实战指南

科学计算与工程仿真作为现代科研与工业研发的核心技术,其核心价值在于将复杂的数学模型转化为可执行的算法,并通过可视化与系统仿真验证设计可行性。MATLAB作为该领域的代表性平台,通过其强大的矩阵运算能力、丰富的专业工具箱(如信号处理、控制系统、图像处理)以及Simulink仿真环境,构建了一个覆盖算法开发、数据分析、系统建模到硬件部署的完整工作流。在工程实践中,用户常面临从基础安装、路径配置到高级的App Designer界面开发、MEX编译、MATLAB Engine API跨语言调用以及FPGA代码生成等

weixin_30475039的博客 368

面向对象设计和系统分层经验谈

转载自卢彦的Blog http://www.agilelabs.cn/面向对象系统设计经验谈 就像我在应用架构设计总结这篇BLOG中提到的那样,面向对象的系统设计就好象一群人翻越一座陡峭的悬崖,只要任何一个人没有翻越过去,那么就无法设计出真正的面向对象系统。 归结一下,在你打算进行面向对象的系统之前,你一定要考虑是否已经解决或能解决以下的问题: 一、对象的持久化对象

懒羊的技术窝[anchor] 1661

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 563

【面向对象】初步接触三层架构

三层架构 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer) 、业务逻辑层(Business Logic Layer) 、数据访问层(Data access layer) 。区分层次的目的即为了“高内聚低耦合”的思想。 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。

哈士奇 2396

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8024

全球最大光伏电池缺陷异常检测数据集PVELAD【发布】

下载地址 1:GitHub - binyisu/PVEL-AD 下载地址 2:http://aihebut.com/col.jsp?id=118 下载地址 3:NAVEDownload 竞赛测试系统:Photovoltaic cell anomaly detection | Kaggle 一、简介 PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集,重点是光伏电池工业检测。PVEL-AD包含 36,543 张具有各种内部缺陷和异构背...

苏打水的杯子的博客 2万+

面向对象设计中的多种分层方法

面向对象设计中的多种分层方法

在路上... 1033

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决)

本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。

weixin_28366475的博客 271

驱动设计思想_面向对象_分层_分离

驱动程序思想_面向对象_分层_分离

holdtao的博客 242

基于 Node.js + MongoDB 技术栈的小众开源短链接程序 —— Lynx

开源的短链接程序有很多,像 YOURLS、Shlink 等大多采用 PHP + MySQL 技术栈。但我之前的服务器配置一般,再加上自己写的小玩具使用的是 Node.js + MongoDB,这些环境已经装在服务器上了,因此更倾向于寻找一款同样基于这套技术栈的短链接程序。搜索了很久才找到这么一款基于的短链接程序——Lynx。这个开源项目非常小众,Star 数只有两百多。

zc_mk的博客 827

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1276

结构分层的经验谈

结构分层的经验谈-转贴自卢彦Blog为了将业务规则从界面和数据库中剥离出来,通常的做法是抽象出一个业务逻辑层出来,专门负责对业务逻辑进行处理。一般多采用三层结构,既表现层,业务层和数据层。当开发人员在以前的两层结构中痛苦煎熬了很长一段时间,突然看到了三层结构的解决方案的时候,一般会有终于找到了救世主的感觉。但是这种感觉往往会导致掉到另外一个同样恐怖的陷阱“过度设计”中。在我以前曾经供职

二毛他弟的程序人生 1266

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1902

软件项目管理(CMM)经验谈(2)

软件项目管理(CMM)经验谈(2)2.2.9 项目验收 2.2.10 项目版本化发布 2.3 项目组织 3 开发工作规范 3.1 总体规划阶段 3.1.1 项目需求报告 3.1.1.1 工作定义 3.1.1.2 前序工作及输入成果 3.1.1.3 具体工作内容 3.1.1.3.1 资料收集(可选) 3.1.1.3.2 资料研究(可选) 3.1.1.3.3 项目需求报告编制 3.

zou5655的专栏 1363

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 206

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

软件项目管理(CMM)经验谈(2) (转)

软件项目管理(CMM)经验谈(2) (转)[@more@]软件项目管理(CMM)经验谈(2) 2.2.9 项目验收 2.2.10 项目版本化发布 2.3 项目组织 3 开发工作规范 3.1 总体规划阶段 3.1.1 项目需求报...

ciya3282的博客 98

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

经验谈:系统架构师的修炼[转]

经验谈:系统架构师的修炼[转] 最近应聘系统架构师,面试回答一些问题,加上之前做的一些功课,搜索到一些文章,感觉有必要总结一下,到底如何做一个成功的系统架构师呢? 首先,何谓系统架构师? IBM工程师的说明是: 架构师的主要责任是提供开发人员和项目经理之间的共用沟通媒体。他们负责让业务规则及需求与工程实践及限制相适应,以确保成功 中文Wiki上的说明是: 系统架构师...

java开发指南博客 【转载】 125

android 蓝牙通讯demo

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

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

经验谈:系统架构师的修炼

最近应聘系统架构师,面试回答一些问题,加上之前做的一些功课,搜索到一些文章,感觉有必要总结一下,到底如何做一个成功的系统架构师呢?首先,何谓系统架构师?IBM工程师的说明是:  架构师的主要责任是提供开发人员和项目经理之间的共用沟通媒体。他们负责让业务规则及需求与工程实践及限制相适应,以确保成功中文Wiki上的说明是:  系统架构师负责设计系统整体架构,从需求到设计的每个细节都要考虑到,把握整个项

清水雨潭 669

2018最新高端IT培训机构最牛课程体系c++高级工程师全套

适用人群: 高校计算机专业在读学生,C++开发者等...课程简介:最系统系统的C++开发工程师培训极客班由硅谷技术大牛神级人物演讲,浓缩各位老师多年研授心得。学完后可具备一线公司C++技术岗位的开发能力,可胜任游戏开发、服务器端、系统软件等热门(高薪)职位。课程目录:一、【C++面向对象高级编程(上)(5.3-5.23)】本课程涵盖C++对象模型、关键机制、优良编程风格、内存管理,让学员从一无所...

weixin_44217055的博客 1830

价值1648元硅谷技术大牛带你深入C/C++高级工程师/架构师完整版

适用人群: 高校计算机专业在读学生,C++开发者等... 课程简介: 最系统系统的C++开发工程师培训极客班由硅谷技术大牛神级人物演讲,浓缩各位老师多年研授心得。学完后可具备一线公司C++技术岗位的开发能力,可胜任游戏开发、服务器端、系统软件等热门(高薪)职位。 课程目录: 一、【C++面向对象高级编程(上)(5.3-5.23)】 本课程涵盖C++对象模型、关键机制、优良编程风格、内存管理,让...

weixin_44216302的博客 1132

MPC8610嵌入式处理器:图形与多媒体处理的集成架构与硬件设计实战

在嵌入式系统设计中,高性能处理器选型是决定项目成败的关键。其核心原理在于通过高度集成的SoC架构,将CPU、GPU/DSP、内存控制器及丰富外设融合于单一芯片,以内部高速互连替代复杂的外部PCB走线,从而在提升带宽、降低延迟的同时,显著简化硬件设计、降低系统功耗与成本。这种集成化方案的技术价值在于为工业HMI、车载信息娱乐、自助终端及机器视觉等应用场景提供了稳定可靠的算力基础。MPC8610处理器正是这一理念的杰出代表,它深度融合了Power Architecture e600核心、PowerQUICC通信

weixin_33910460的博客 389

C++与OpenCV实战:构建鲁棒运动检测系统的核心技术与调优

运动检测是计算机视觉的基础技术,其核心原理是通过分析视频序列中像素的变化来识别运动目标。传统方法如帧间差分法和背景减除法,通过比较连续帧或建立背景模型来提取前景区域,在安防监控、智能交通等领域具有重要技术价值。本文聚焦于使用C++和OpenCV实现一个高效、稳定的运动检测系统,深入探讨了背景减除法(MOG2)的参数调优、后处理流程优化以及工程实践中的常见问题解决方案。通过模块化设计和性能优化技巧,该系统能够有效处理高清视频流,并自然融入多目标跟踪与深度学习扩展思路,为实际应用场景提供可靠基础。

weixin_30755393的博客 405

系统架构师考点--面向对象开发

大家好。今天再来总结一下面向对象的相关考点。面向对象技术。这部分在上午场客观题一般占3-5分左右。下午的案例题和论文题也可能有所涉及。

qq_41534540的博客 1029

面向对象程序设计、结构化程序设计、分层结构、模式

学校专业实践,写个银行定期一本通的小程序,程序解决方案如图。起初我觉得我对面向对象、分层结构还是蛮清楚的了,可我同学对我说了句:你这只能算是面向结构化的设计,小程序还行,等到了程序大了,问题就多了。我说这是面向对象设计啊。他说那你的实体类里面为什么没有方法,只有属性了?我一想还真那么回事。想想在公司写模块的时候,实体层里面的实体也是没有方法的,也就是对象只有属性,没有行为。被他这么一问,我还真...

weixin_30408739的博客 211
上一篇: 成为软件架构师
下一篇: 建立分析模型和设计模型
binjuny
博客等级 码龄24年 112粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值