IoC模式的类型及其实现

Linux驱动IO篇——ioctl设备操作 应用程序如果想要设置/获取驱动层的数据,一般是驱动提供一个`ioclt`接口,然后应用层调用。因此,学会在驱动中实现`ioctl`接口是必要的一项技能。## ioctl命令编码规则。 **想要定义一个自己的ioctl命令,必须要遵从ioctl的编码规则**。 一个ioctl命令由32比特位表示,每个比特位都有不同的含义,不同版本的内核定义可能有些差异,具体参考文档`“Documentation/ioctl/ioctl-deconding.txt”`. 阅读详情

1引言

    面向对象的思想已经深入人心,但是要利用面向对象的思想开发出优秀的应用程序却不是一件容易的事情。正是基于面向对象的思想,人们对各种应用程序进行了大量的分析、总结、归纳出了设计模式。Alexanders给出模式的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作[2]。设计模式技术在GoF的经典书籍面世以来,得到了广泛的关注、研究与应用。时下如雨后春笋般涌现的各种框架都是利用设计模式的典范。其中IoC模式更是广泛应用于各种框架中。

2 IoC模式

2.1 IoC模式简介

    IoC(Inversion of Control)模式并不是什么新的东西,它是一种很普遍的概念,GoF中的Template Method 就是IoC的结构。顾名思义,IoC即控制反转。著名的好莱坞原则:“Don’t Call us, We will call you”,以及Robert C. Martin在其敏捷软件开发中所描述的依赖倒置原则(Dependency Inversion Principle, DIP)都是这一思想的体现。依赖注入(Dependency Injection)是Martin Flower对IoC模式的一种扩展的解释[2]。IoC是一种用来解决组件(实际上也可以是简单的Java类)之间依赖关系、配置及生命周期的设计模式,其中对组件依赖关系的处理是IoC的精华部分。IoC的实际意义就是把组件之间的依赖关系提取(反转)出来,由容器来具体配置。这样,各个组件之间就不存在hard-code的关联,任何组件都可以最大程度的得到重用。运用了IoC模式后我们不再需要自己管理组件之间的依赖关系,只需要声明由容器去实现这种依赖关系。就好像把对组件之间依赖关系的控制进行了倒置,不再由组件自己来建立这种依赖关系而交给容器(例如我们后面会介绍的PicoContainer、Spring)去管理。

    我们从一个简单的例子看起,考虑一个Button控制Lamp的例子:

public class Button {

    private Lamp lamp;

    public void push() {

        lamp.turnOn();

    }

}

    但是马上发现这个设计的问题,Button类直接依赖于Lamp类,这个依赖关系意味着当Lamp类修改时,Button类会受到影响。此外,想重用Button类来控制类似与Lamp的(比如同样具有turnOn功能的Computer)另外一个对象则是不可能的。即Button控制Lamp,并且只能控制Lamp。显然违反了“高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于具体实现,细节应该依赖于抽象” 这一原则(DIP原则)。考虑到上述问题,自然的想到应该抽象出一个接口SwitchableDevice,来消除Button对Lamp的依赖,于是设计如下:

public class Button {

    private SwitchableDevice lamp;

    public Button(){

    lamp= new Lamp();

    }

}

    再深入考虑一下,虽然我们的Button现在可以控制实现了SwitchableDevice接口的Computer,但是Button和Lamp类之间还是存在create这样的依赖关系。为了解决这种依赖关心,经典的GoF模式就是采用Factory模式,将对象的创建交给Factory类来创建,但是这种创建仍是显示的,组件变化了仍然需要重新编译程序。而采用J2EE经典的service locator模式,如果你要把Button组件拿到另一个系统里面用,你就必须修改它的源码,让它使用另一个系统的serviceLocator。换句话说,这个组件不具备可移植性。这就是需要依赖注入的道理,让组件的创建、配置及生命周期总是由外部容器来管理。

 

2.2 IoC的类型

2.2.1 IoC的类型

    在介绍如何利用IoC模式实现彻底解耦之前,我们先看看IoC的类型:

2.2.1.1 Method-based (M) IoC

    在每个方法调用中传递其依赖的组件。如果方法需要某个组件,就把该组件作为参数传递给方法。

2.2.1.2 Interface-based (I) IoC (Type 1)

    使用接口如Serviceable, Configurable 等等,来声明依赖。EJB容器就是一个Type1的重量级容器,部署在它内部的EJB组件使用接口来声明依赖关系。

2.2.1.3 Setter-based (S) IoC (Type 2)

    使用setters 来设置依赖组件。把依赖的组件作为一个属性,通过setters方法来动态设置依赖组件。

2.2.1.4 Constructor-based (C) IoC (Type 3)

    使用构造函数来声明依赖。通过传递组件参数到构造函数中,来实现依赖关系。

 

2.2.2 IoC类型的比较

    这几种类型中,type 3侵入性较小。因为在面向对象的理论里,constructor并不是对象契约的一部分。按照Bertrand Meyer的说法,你永远不应该直接调用constructor,因为这就意味着client代码与实现(而非契约)绑定在一起。那么,既然constructor并不属于对象契约的一部分,在constructor里暴露元信息就不会影响对象契约。Type 2虽然也很好,但setter毕竟属于对象契约,把一个setter用于IoC多少有一点“破坏性”,而且通过setter方法过多的暴露了内部对象的内部细节,这就失去了对象的封装。

    Type 2很合适的作为应用程序的bean工厂。如果是更多的动态组装,可能type 3更好一点。从定义上来说,type 2是基于setter的,type 3是基于constructor的。为什么说type 2更适合于做bean工厂呢?因为setter是各个分离的,对于有定义的n个setter,bean工厂调用其中的0~n个都是合法的。而type 3则稍微有点麻烦,不能适应依赖较多的情况,组件的“元信息”在constructor的参数列表中体现,你必须一次性提供所有必要的参数。如果需要很多组件,就需要在构造函数中传递很多参数,这样会导致constructor的参数过多过长。

 

2.3 IoC容器

    根据容器对组件的侵入的程度,可以把IoC容器分为以下三类:

2.3.1 Interface Injection

    对应Type 1 IoC ,使用接口来声明依赖。这类IoC容器侵入性最强,需要通过上下文来获取组件.组件需要实现容器提供的特定接口,这样,组件的重用就被限定在该容器内。这类容器的代表有Apache Avalon。Avalon 不怎么流行,尽管它很强大而且有很长的历史。Avalon属于重量级容器,并且看起来比新的IoC解决方案更具侵入性。

 

2.3.2 Setter Injection

    对应Type 2 IoC ,使用setters来设置依赖组件。这类IoC容器需要组件提供accessor方法,依赖关系通过setter方法来注入。按照java组件模型,一般的javabean都会有accessor方法,因此组件的重用性没有任何限制。这类容器的代表有Spring,同时它也实现了第三类IoC容器。Spring是一个非常活跃的、优秀的开源项目。它是一个基于IoC和AOP(Aspect-Oriented Programming,面向方面编程)的构架多层J2EE系统的框架,它优雅的实现了MVC框架,支持使用可声明事务管理(declarative transaction management)。更重要的是Spring框架的无侵入性[3]。

 

2.3.3 Constructor Injection

    对应Type 3 IoC ,使用构造函数来声明依赖。这类IoC容器需要组件由构造方法来配置依赖关系。和第二种IoC类型类似,组件重用没有任何问题。并且Constructor Injection更加严格,完全按照契约(contract)来配置组件依赖。这类容器的代表有PicoContainer。

PicoContainer是一个轻量级而且更强调通过构造函数表达依赖性,而不是JavaBean 属性。 与Spring不同,它的设计允许每个类型一个对象的定义(可能是因为它拒绝任何Java代码外的元数据导致的局限性)。

 

2.4 利用IoC容器实现控制反转

    下面我们就来看看如何利用IoC容器PicoContainer实现本文开始处举的例子,主要代码如下:

private MutablePicoContainer configureContainer() {

    MutablePicoContainer pico = new DefaultPicoContainer();

    pico.registerComponentImplementation(SwitchableDevice.class, Lamp.class);

    pico.registerComponentImplementation(Button.class);

    return pico;

}

    然后就可以通过MutablePicoContainer的getComponentImplementation方法获得实现类,调用其push方法控制Lamp的开关,这样一来,两者之间的耦合通过PicoContainer提供的Assembler完全消除了。

    Spring则通过一个XML格式的配置文件,将两者联系起来。使用时,通过ApplicationContext获得Button bean,再调用其方法实现,同样也消除了耦合关系。

 

3总结

    IoC具有以下几个优点:

    1.因为组件不需要在运行时寻找合作者,所以他们可以更简单的编写和维护。由于同             样原因,便于编写测试代码,使类的测试更容易。

    2.不需要外部依赖。能在任何环境下开发和测试组件,而不需要特殊的部署环境,像   JNDI、EJB那样。并且在不同IoC容器中可方便的重用和改变。

    3.整个系统更容易组装和配置。大部分业务对象不依赖于IoC容器的APIs。这使得很  容易使用遗留下来的代码,且很容易的使用对象,无论在容器内或不在容器内。

    4.增加组件的复用程度,提供软件生成效率。

    当然,IoC与通常的方法相比,代码不便于理解,因为组件创建是隐含的。所以轻量级的、无侵入性的IoC容器仍然有待我们去研究开发。

deepin搭建samba服务器 一.为什么要用Samba? Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享。二.需要的软件? 我是在deepin上实现的,在终端中使用一下两句命令,就可以安装Samba的软件包 $sudo apt-get install samba //安装samba 三.Samba服务的组成 Samba的核心是两个守护进程smbd和nmbd。当然,它 阅读详情

相关推荐

深入解析SVPWM七段式与五段式调制的电压波形差异及优化策略

本文深入解析了SVPWM七段式与五段式调制在相电压和线电压波形上的核心差异。七段式波形对称、谐波含量低,适合追求静音与性能的场景;五段式开关次数少、损耗低,适用于对效率与散热要求高的应用。文章提供了基于谐波与损耗权衡的优化策略与选型指南。

weixin_29216957的博客 438

linux 内核中的 _IOC_TYPE 宏

/* Check type and command number */ if (_IOC_TYPE(cmd) != SPI_IOC_MAGIC) return -ENOTTY; _IOC_NR(), _IOC_TYPE(), _IOC_SIZE(), _IOC_DIR() 这几个宏用来取得 cmd 命令中的域,其作用如下: _IOC_NR( ) : 读取基数域值 (bit0~ bit7) _IOC_TYPE : 读取魔数域值 (bit8 ~ bit15) _IOC_SIZE : 读取

qq_40309341的博客 1226

在线考试系统源码+数据库+word+ppt(高分毕业设计)

本系统通过Spring Cloud实现微服务拆分,将授权、考试、监控等功能解耦,既保证了系统的扩展性,也便于后期维护。基于OAuth2.0的单点登录,解决多服务统一认证问题;考试与练习模式分离,满足不同场景需求;集成Druid与Hystrix,保障系统监控与稳定性。

weixin_44355158的博客 737

IOC模式理解

理解IOC inversion of control  控制反转  与  DI   Dependency Injection  依赖注入概念之前,我们需要知道在一个系统的设计过程中,降低各模块之间的相互依赖,达到高内聚低耦合,是判断设计好坏的标准; 所以Robert Martin大师提出了面向对象设计原则----依赖倒置原则:    A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽

编程小子的博客 1918

前沿数据解析 | 麻省理工-斯坦福-丰田研究中心电池数据集:AI驱动下的电池寿命早期预测

本文解析了麻省理工、斯坦福与丰田研究中心联合发布的电池数据集,展示了AI驱动下的电池寿命早期预测技术。通过分析124个商用锂离子电池的完整生命周期数据,研究团队仅用前100次循环数据即可准确预测电池报废时间,为电动汽车电池管理提供革命性解决方案。数据集包含LFP/石墨体系电池的详细测试记录,结合差分容量分析和梯度提升树模型,预测精度显著提升。

weixin_26950847的博客 529

三极管稳压电路仿真分析

Z1的负极连接到三极管的基极,三极管发射极E是输出,形成了一个射极跟随器,也就是说,E极的电压随着B电压变化而变化,但BE之间有一个压降,一般硅管0.7V左右,假设B极是6.7V,那E极就是6.7-0.7=6V,所以就有一个公式VOUT=Vz-Vbe,可以根据VOUT来选择合适的稳压管。从稳压管的SPEC中我们可以看到,Vz@Izt这个参数,指在Izt=20mA时,稳压管的稳压值Vz=5.1V,也就是说流过稳压管的电流在20mA以上,稳压效果最佳。三极管导通之后,E点电压会升高,当升高到Vbe。

U_YAO的博客 2321

IOC设计模式

简介:

路过 2382

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

IOC介绍及IOC模式的类型及其实现

 一、什么是IOCIoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。 下面我们以几个例子来说明什么是IoC 假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?

IT界の小丑的专栏 1388

Latex里面关于作者名字显示有灰色; 二级+三级标题斜体;

Latex里面关于 作者名字显示有灰色; 二级+三级标题斜体,与正文的距离; 邮箱字体;ORCID字体设置(整理不易,请先关注,Thanks)

m0_61015717的博客 746

YOLOv5改进策略|实战应用案例|YOLOv5苹果成熟度检测 ,准确率提升4.6%

苹果作为世界四⼤⽔果之⼀,富含多种维⽣素和矿物质,⼀直深受世界各地消费者的喜爱。据联 合国粮⻝及农业组织统计,全球⽔果产量中,苹果位列第⼆位,仅次于葡萄(贾等⼈,2020 )。然⽽,⼤多数苹果果实都是⼿⼯采摘的,这样的⽣产⽅法效率很低。此外,随着⼈⼝⽼龄化 和农村劳动⼒⼤量涌⼊城市,⽔果种植⾏业的劳动⼒成本也相应上升。所有这些因素都显着影响 着⽔果产品的市场竞争⼒。因此,实时⾼效采收苹果等⽔果,降低采收成本势在必⾏。基于机器 视觉的⽔果采摘机器⼈可以利⽤其信息感知来识别和采摘⽔果。

斌擎科技 2209

IoC模式的类型及其实现 选择自 WonderOne 的 Blog

 1引言    面向对象的思想已经深入人心,但是要利用面向对象的思想开发出优秀的应用程序却不是一件容易的事情。正是基于面向对象的思想,人们对各种应用程序进行了大量的分析、总结、归纳出了设计模式。Alexanders给出模式的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作

wzg1031的专栏 657

【AI大模型】核心基石:Transformer架构入门通俗完整解读

文章摘要: Transformer架构是AI大模型(如GPT、Llama等)的核心基石,彻底颠覆了传统RNN/LSTM的逐字计算模式,通过自注意力机制实现全局并行运算和长文本语义理解。本文用通俗语言拆解Transformer的核心模块:位置编码保留语序、多头注意力捕捉上下文关联、掩码机制确保生成逻辑、残差连接稳定训练,并搭配极简PyTorch代码演示Decoder架构的逐字生成过程。Transformer的并行性、可堆叠性和全局注意力优势,使其成为千亿参数大模型的基础。理解Transformer是掌握大模型

unber的博客 43

Spring-IoC 篇

在 Spring IoC 容器中,每个被管理的对象都由一个 Bean 定义来描述。Bean 定义包括对象的类型、依赖关系、生命周期等信息。

小周不想写代码的博客 2657

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IoC模式

 1引言    面向对象的思想已经深入人心,但是要利用面向对象的思想开发出优秀的应用程序却不是一件容易的事情。正是基于面向对象的思想,人们对各种应用程序进行了大量的分析、总结、归纳出了设计模式。Alexanders给出模式的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作

Shiring-Spring 2055

Statistics and Machine Learning Toolbox

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

Ioc模式

  分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。  从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和

leagle 742

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

Java工厂模式Ioc和AOP 框架设计

控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。 IoC(Inversion of

1212

[转] 工厂模式 IOC AOP

控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。         IoC(Inversion of Control)是近年来兴起的一种思想,不仅仅是编程思想。主要是协调各组件间相互的依赖关系,同时大大提高了组件的可...

qjbtj999的博客 416

IOC是什么

IoC是什么?Inversion of Control,即反转控制,或许说为依赖注入更为合适。IoC就是IoC,不是什么技术,与GoF一样,是一种设计模式。     Interface Driven Design接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执 行:AInterface a = new AInt

welcomejzh的专栏 8779

Ioc模式(Inversion of Control,即反转模式)的理解

分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。   从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design 接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健

leileiIT的博客 733

Ioc模式(又称DI:Dependency Injection 依赖注射)

http://www.jdon.com/AOPdesign/Ioc.htm 分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务Services。   从GoF设计模式中,我们已经习惯一种思维编程方式:Interface Driven Design...

weixin_30823683的博客 66
下一篇: IoC Introduction
WonderOne
博客等级 码龄23年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值