第四章 Controller接口控制器详解(2)

跟着开涛学SpringMVC 跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本 立即下载

4.5、ServletForwardingController

将接收到的请求转发到一个命名的servlet,具体示例如下:

 

java代码:
Java代码   收藏代码
  1. package cn.javass.chapter4.web.servlet;  
  2. public class ForwardingServlet extends HttpServlet {      
  3.     @Override  
  4.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  5.     throws ServletException, IOException {  
  6.   
  7.         resp.getWriter().write("Controller forward to Servlet");  
  8.           
  9.     }  
  10. }  

 

java代码:
Java代码   收藏代码
  1. <servlet>  
  2.     <servlet-name>forwarding</servlet-name>  
  3.     <servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class>  
  4. </servlet>  

 

java代码:
Java代码   收藏代码
  1. <!— 在chapter4-servlet.xml配置处理器 -->     
  2. <bean name="/forwardToServlet"   
  3. class="org.springframework.web.servlet.mvc.ServletForwardingController">  
  4.         <property name="servletName" value="forwarding"></property>  
  5. </bean>  

 

当我们请求/forwardToServlet时,会被转发到名字为“forwarding”的servlet处理,该sevlet的servlet-mapping标签配置是可选的。

 

4.6、BaseCommandController

命令控制器通用基类,提供了以下功能支持:

1、数据绑定:请求参数绑定到一个command object(命令对象,非GoF里的命令设计模式),这里的命令对象是指绑定请求参数的任何POJO对象;

   commandClass:表示命令对象实现类,如UserModel;

   commandName:表示放入请求的命令对象名字(默认command),request.setAttribute(commandName, commandObject);

 

2、验证功能:提供Validator注册功能,注册的验证器会验证命令对象属性数据是否合法;

   validators:通过该属性注入验证器,验证器用来验证命令对象属性是否合法;

 

该抽象类没有没有提供流程功能,只是提供了一些公共的功能,实际使用时需要使用它的子类。

4.7、AbstractCommandController

命令控制器之一,可以实现该控制器来创建命令控制器,该控制器能把自动封装请求参数到一个命令对象,而且提供了验证功能。

 

1、创建命令类(就是普通的JavaBean类/POJO)

 

java代码:
Java代码   收藏代码
  1. package cn.javass.chapter4.model;  
  2. public class UserModel {  
  3.     private String username;  
  4.     private String password;  
  5.         //省略setter/getter  
  6. }  

 

2、实现控制器

 

java代码:
Java代码   收藏代码
  1. package cn.javass.chapter4.web.controller;  
  2. //省略import  
  3. public class MyAbstractCommandController extends AbstractCommandController {  
  4.     public MyAbstractCommandController() {  
  5.         //设置命令对象实现类  
  6.         setCommandClass(UserModel.class);  
  7.     }  
  8.     @Override  
  9.     protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {  
  10.         //将命令对象转换为实际类型  
  11.         UserModel user = (UserModel) command;  
  12.         ModelAndView mv = new ModelAndView();  
  13.         mv.setViewName("abstractCommand");  
  14.         mv.addObject("user", user);  
  15.         return mv;  
  16.     }  
  17. }   

 

java代码:
Java代码   收藏代码
  1. <!— 在chapter4-servlet.xml配置处理器 -->     
  2. <bean name="/abstractCommand"   
  3. class="cn.javass.chapter4.web.controller.MyAbstractCommandController">  
  4.         <!-- 也可以通过依赖注入 注入命令实现类 -->  
  5.         <!-- property name="commandClass" value="cn.javass.chapter4.model.UserModel"/-->  
  6. </bean>  

 

java代码:
Java代码   收藏代码
  1. <!— WEB-INF/jsp/abstractCommand.jsp视图下的主要内容 -->     
  2.   
  3. ${user.username }-${user.password }  

当我们在浏览器中输入“http://localhost:9080/springmvc-chapter4/abstractCommand?username=123&password=123”,会自动将请求参数username和password绑定到命令对象;绑定时按照JavaBean命名规范绑定;

4.8、AbstractFormController

用于支持带步骤的表单提交的命令控制器基类,使用该控制器可以完成:

1、定义表单处理(表单的渲染),并从控制器获取命令对象构建表单;

2、提交表单处理,当用户提交表单内容后,AbstractFormController可以将用户请求的数据绑定到命令对象,并可以验证表单内容、对命令对象进行处理。

 

java代码:
Java代码   收藏代码
  1.       @Override  
  2. rotected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  
  3.     throws Exception {  
  4.      //1、是否是表单提交? 该方法实现为("POST".equals(request.getMethod())),即POST表示表单提交  
  5. if (isFormSubmission(request)) {  
  6.     try {  
  7.         Object command = getCommand(request);  
  8.         ServletRequestDataBinder binder = bindAndValidate(request, command);  
  9.         BindException errors = new BindException(binder.getBindingResult());  
  10.               //表单提交应该放到该方法实现  
  11.         return processFormSubmission(request, response, command, errors);  
  12.     }  
  13.     catch (HttpSessionRequiredException ex) {  
  14.               //省略部分代码  
  15.         return handleInvalidSubmit(request, response);  
  16.     }  
  17. }  
  18. else {  
  19.     //2、表示是表单展示,该方法又转调showForm方法,因此我们需要覆盖showForm来完成表单展示  
  20.     return showNewForm(request, response);  
  21. }  

 

    bindOnNewForm:是否在进行表单展示时绑定请求参数到表单对象,默认false,不绑定;

    sessionForm:session表单模式,如果开启(true)则会将表单对象放置到session中,从而可以跨越多次请求保证数据不丢失(多步骤表单常使用该方式,详解AbstractWizardFormController),默认false;

 

    Object formBackingObject(HttpServletRequest request) :提供给表单展示时使用的表单对象(form object表单要展示的默认数据),默认通过commandName暴露到请求给展示表单;

    Map referenceData(HttpServletRequest request, Object command, Errors errors):展示表单时需要的一些引用数据(比如用户注册,可能需要选择工作地点,这些数据可以通过该方法提供),如:

 

java代码:
Java代码   收藏代码
  1. protected Map referenceData(HttpServletRequest request) throws Exception {  
  2.              Map model = new HashMap();  
  3.              model.put("cityList", cityList);  
  4.              return model;  
  5. }  

    这样就可以在表单展示页面获取cityList数据。

 

SimpleFormController继承该类,而且提供了更简单的表单流程控制。

4.9、SimpleFormController

提供了更好的两步表单支持:

1、准备要展示的数据,并到表单展示页面;

2、提交数据数据进行处理。

 

第一步,展示:

 

第二步,提交表单:

接下来咱们写一个用户注册的例子学习一下:

(1、控制器

 

java代码:
Java代码   收藏代码
  1. package cn.javass.chapter4.web.controller;  
  2. //省略import  
  3. public class RegisterSimpleFormController extends SimpleFormController {      
  4.     public RegisterSimpleFormController() {  
  5.         setCommandClass(UserModel.class); //设置命令对象实现类  
  6.         setCommandName("user");//设置命令对象的名字  
  7.     }  
  8.     //form object 表单对象,提供展示表单时的表单数据(使用commandName放入请求)  
  9.     protected Object formBackingObject(HttpServletRequest request) throws Exception {  
  10.         UserModel user = new UserModel();  
  11.         user.setUsername("请输入用户名");  
  12.         return user;  
  13.     }  
  14.     //提供展示表单时需要的一些其他数据    
  15.     protected Map referenceData(HttpServletRequest request) throws Exception {  
  16.         Map map = new HashMap();  
  17.         map.put("cityList", Arrays.asList("山东", "北京", "上海"));  
  18.         return map;  
  19.     }  
  20.     protected void doSubmitAction(Object command) throws Exception {  
  21.         UserModel user = (UserModel) command;  
  22.         //TODO 调用业务对象处理  
  23.         System.out.println(user);  
  24.     }  
  25. }  

 

setCommandClass和setCommandName:分别设置了命令对象的实现类和名字;

formBackingObject和referenceData:提供了表单展示需要的视图;

doSubmitAction:用于执行表单提交动作,由onSubmit方法调用,如果不需要请求/响应对象或进行数据验证,可以直接使用doSubmitAction方法进行功能处理。

(2、spring配置(chapter4-servlet.xml)


java代码:
Java代码   收藏代码
  1. <bean name="/simpleForm"   
  2. class="cn.javass.chapter4.web.controller.RegisterSimpleFormController">  
  3.         <property name="formView" value="register"/>  
  4.         <property name="successView" value="redirect:/success"/>  
  5. </bean>  
  6. <bean name="/success" class="cn.javass.chapter4.web.controller.SuccessController"/>  

formView:表示展示表单时显示的页面;

successView:表示处理成功时显示的页面;“redirect:/success”表示成功处理后重定向到/success控制器;防止表单重复提交;

“/success” bean的作用是显示成功页面,此处就不列举了。

 

(3、视图页面

 

java代码:
Java代码   收藏代码
  1. <!-- register.jsp 注册展示页面-->  
  2. <form method="post">  
  3. username:<input type="text" name="username" value="${user.username}"><br/>  
  4. password:<input type="password" name="username"><br/>  
  5. city:<select>  
  6.   <c:forEach items="${cityList }" var="city">  
  7.    <option>${city}</option>  
  8.   </c:forEach>  
  9. </select><br/>  
  10. <input type="submit" value="注册"/>  
  11. </form>  

此处可以使用${user.username}获取到formBackingObject设置的表单对象、使用${cityList}获取referenceData设置的表单支持数据;

 

到此一个简单的两步表单到此结束,但这个表单有重复提交表单的问题,而且表单对象到页面的绑定是通过手工绑定的,后边我们会学习spring标签库(提供自动绑定表单对象到页面)。

4.10、CancellableFormController

一个可取消的表单控制器,继承SimpleFormController,额外提供取消表单功能。

 

1、表单展示:和SimpleFormController一样;

2、表单取消:和SimpleFormController一样;

3、表单成功提交:取消功能处理方法为:onCancel(Object command),而且默认返回cancelView属性指定的逻辑视图名。

   那如何判断是取消呢?如果请求中有参数名为“_cancel”的参数,则表示表单取消。也可以通过cancelParamKey来修改参数名(如“_cancel.x”等)。

示例:

 

(1、控制器

复制RegisterSimpleFormController一份命名为CanCancelRegisterSimpleFormController,添加取消功能处理方法实现:

 

java代码:
Java代码   收藏代码
  1. @Override  
  2. protected ModelAndView onCancel(Object command) throws Exception {  
  3.     UserModel user = (UserModel) command;  
  4.     //TODO 调用业务对象处理  
  5.     System.out.println(user);  
  6.     return super.onCancel(command);  
  7. }  

onCancel:在该功能方法内实现取消逻辑,父类的onCancel方法默认返回cancelView属性指定的逻辑视图名。

 

(2、spring配置(chapter4-servlet.xml)

 

java代码:
Java代码   收藏代码
  1. <bean name="/canCancelForm"   
  2. class="cn.javass.chapter4.web.controller.CanCancelRegisterSimpleFormController">  
  3.         <property name="formView" value="register"/>  
  4.         <property name="successView" value="redirect:/success"/>  
  5.         <property name="cancelView" value="redirect:/cancel"/>  
  6. </bean>  
  7. <bean name="/cancel" class="cn.javass.chapter4.web.controller.CancelController"/>  

cancelParamKey:用于判断是否是取消的请求参数名,默认是_cancel,即如果请求参数数据中含有名字_cancel则表示是取消,将调用onCancel功能处理方法;

cancelView:表示取消时时显示的页面;“redirect:/cancel”表示成功处理后重定向到/cancel控制器;防止表单重复提交;

“/cancel” bean的作用是显示取消页面,此处就不列举了(详见代码)。

(3、视图页面(修改register.jsp)


java代码:
Java代码   收藏代码
  1. <input type="submit" name="_cancel" value="取消"/>  


该提交按钮的作用是取消,因为name="_cancel",即请求后会有一个名字为_cancel的参数,因此会执行onCancel功能处理方法。

(4、测试:

在浏览器输入“http://localhost:9080/springmvc-chapter4/canCancelForm”,则首先到展示视图页面,点击“取消按钮”将重定向到“http://localhost:9080/springmvc-chapter4/cancel”,说明取消成功了。

 

 

实际项目可能会出现比如一些网站的完善个人资料都是多个页面(即多步),那应该怎么实现呢?接下来让我们看一下spring Web MVC提供的对多步表单的支持类AbstractWizardFormController。

如何理解界面陷阱电荷呢(interface trapped charge)和费米钉扎效应? 如何理解界面陷阱电荷呢?(interface trapped charge) 我们在学半导体物理的时候经常对各种界面态和陷阱分不清楚,然而这却是半导体中最为关键的知识点之一。我这路主要介绍一下如何比较直观地理解界面陷阱电荷,应该也有叫界面态,快态之类的。 在介绍界面陷阱电荷之前,我们可以回顾一下施主(donor)和受主(acceptor)的概念。在si中如果掺杂了n型杂质P,那么P由于最外层电子有5个,有一个电子比较容易跑走,成为自由移动的导电电子,在能带中可以表现为电子从禁带中的能级跃迁到导带,这种情况我 阅读详情

相关推荐

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 426

Controller控制器

Controllor组件是LoadRunner的控制中心,主要包括场景设计和场景执行两部分。   在VuGen中编辑完脚本并将脚本加载到Controller组件中,即开始对脚本运行时的场景进行设计,当场景设计完成后,即可执行该场景。   场景设计主要是依据需求说明书制定脚本如何执行的策略,使脚本的运行更接近真实用户使用。   场景执行是指当场景设计完成后手动运行场景,在场景执行过程中可以实时对

ai30001的博客 1万+

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors教程

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors

m0_69133594的博客 2824

第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC

4.5、ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下:   java代码: package cn.javass.chapter4.web.servlet; public class ForwardingServlet extends HttpServlet { @Override protected...

jinnianshilongnian的专栏 331

Keil MDK-ARM v5.43a 部署 STM32F103 开发环境全流程

嵌入式开发环境是 Cortex-M 微控制器工程落地的基础支撑,其核心在于编译器链、设备支持包(DFP)与调试驱动的协同一致性。Keil MDK-ARM 作为工业级 ARM Cortex-M 开发套件,依托 Arm Compiler 和 CMSIS 标准,提供从代码编译、外设抽象到实时调试的全栈能力。其技术价值体现在对 STM32 等主流 MCU 的深度适配、高可靠性 SWD 调试支持,以及与 HAL 库、CubeMX 工程的无缝集成。典型应用场景涵盖温湿度传感终端、工业 PLC 子模块及低功耗边缘节点开发

weixin_33750664的博客 888

MATLAB多项式计算

MATLAB多项式计算 在MATLAB中,n次多项式用一个长度为n+1的行向量表示(因为是n个幂次项系数加上一个常数项),缺少的幂次项系数为0。 例如 n次多项式: P(x)=anxn+an-1xn-1+an-2xn-2+…+a1x+a0 表示为: [an,an-1,an-2,…,a1,a0] 目录MATLAB多项式计算1.多项式的加减运算2.多项式的乘法运算3.多项式的除法运算4.多项式的导函数5.代数多项式求值6.矩阵多项式求值7.多项式求根 1.多项式的加减运算 事实上,多项式的加减运算就是其所对应的

路遥芝麻的博客 1万+

第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC

4.1、Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1、收集、验证请求参数并绑定到命令对象; 2、将命令对象交给业务对象,由业务对象处理并返回模型数据; 3、返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名)。   还记得DispatcherServl...

jinnianshilongnian的专栏 1158

YOLOv11改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附创新修改后的C3k2DWRSeg)

本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv11中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPsYOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备。

Snu77的博客 4185

手把手带你分析一个基于SSM的商城项目 | 万字 · 巨详细

文章目录零、SSM项目配置文件与项目启动的一些需知1. 项目启动读取配置文件过程2. 配置文件详解一、项目结构介绍二、DTO三、DAO四、Service层1. AdminService(1) adminLogin(2)selectAll(3)deleteGoodsInfo(4)searchGoodsWithName2.GoodsShippingServiceImpl3.GoodsTypeServiceImpl(1) findTopLevel4.UserServiceImpl(1)insetorder(2)u

ReganYue's Blog 3014

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4239

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

视觉人机器视觉的博客 1741

控制器Controller的使用

通过控制器方法的形参获取请求参数(参数名必须和提交的name值一样,无视参数的数据类型的String可以接收任何参数,不适用于请求参数过多的请求)(若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参 [用,拼接起来] 接收此请求参数)若设置为true,则当前请求必须传输value所指定的请求参数。现实中接受参数的情况是很复杂的,比方说使用RestFul风格,是把参数写入到请求路径中,有些传递的是Json数据,还有传递什么分页参数等等各种情况。

yu的博客 2358

会计-合并-5- 增资、处置交易在合报与个报会计处理

摘要:本文系统梳理了股权投资会计处理的四种情形:从交易性金融资产转为权益法或成本法、权益法转成本法、权益法增持。核心原则是区分个报与合报处理,重点关注原投资公允/账面价值的计量差异及损益确认逻辑。对不丧失控制权的股权处置,个报确认投资收益,合报调整资本公积;丧失控制权时,个报需追溯调整权益法核算,合报计算综合投资收益。一揽子交易的特殊处理强调将过渡性差额暂记其他综合收益,最终丧失控制权时转入当期损益。文末通过典型案例演示了不同情境下的具体计算方法。

qq_34047402的博客 466

第四章、SpringMVC学习-Controller接口控制器详解(2)

4.5、ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4.web.servlet; public class ForwardingServlet extends HttpServlet { @Override protected

hongjun1847的专栏 1110

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

上一篇: 第四章 Controller接口控制器详解(1)
下一篇: 第四章 Controller接口控制器详解(3)
至鳟宝
博客等级 码龄10年 21粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值