CAS系列

jeesite集成cas认证 cas和shiro集成,很好的解决了登录及权限问题。本人最近第一次使用,框架使用的是jeesite开源框架,本身已经集成了shiro,现在将cas集成到项目中。 折腾了三天,终于把cas集成到jeesite中。现将集成过程写下,供朋友参考。 本项目集成cas的同时还留有登录入口,此时需要多种认证方式,步骤6、7的设置就是针对这个功能的,如不需要可直接跳过。 1、添加cas的maven依赖。 阅读详情

一:理解Java并发里面的CAS概念

前言:
我们知道在Java多线程里面关于共享变量的操作,一定是要使用线程同步来保证线程安全的,一旦涉及线程同步,就需要加锁,一旦加锁就意味着某一个时候只能有一个线程在操作,其他的线程如果没有得到锁就会阻塞起来,此时的线程的状态是BLOCKED,当前面的线程释放锁的时候,系统会自动调度当前的线程进入临界区,这里面存在一个问题,就是线程的上下文切换的问题,虽然比起来进程的上下文切换,线程的上下文切换更轻量级,但仍然也是有一定开销的,比如最简单的i++的例子,那么如何有没有一种不需要加锁也能保证线程安全的数据结构呢?答案是肯定的,这就是今天需要谈到的CAS(Compare And Swap或 Compare And Set)。


什么是CAS:
CAS通常是指Compare And Swap或 Compare And Set,是硬件操作系统级别提供的具有原子性的原语指令(CAS的原子性是因为说cpu在执行cas时对这一块内存是独占排他的),利用它可以在多线程中取得和同步一样的效果。


CAS的原理:
CAS 算法大致原理是:在对变量进行计算之前(如 ++ 操作),首先读取原变量值,称为 旧的预期值 A,然后在更新之前再获取当前内存中的值,称为 当前内存值 V,如果 A==V 则说明变量从未被其他线程修改过,此时将会写入新值 B,如果 A!=V 则说明变量已经被其他线程修改过,当前线程应当什么也不做或者再循环几个周期直到更新成功。
CAS通过避免同步,也就是避免了线程的上下文来极大的提高了同步处理的能力,比如在多线程下使用AtomicLong的无锁累加要比,使用synchronized关键字处理性能高出很多。


CAS 缺点:
(1)ABA问题
通过上面的解释,我们知道CAS的原理是读取两个时刻的值,然后比较是否一致再决定是否更新,如果不一致,那么就需要多循环几次直到更新成功,这里面有一个问题假如第一次读到的预期值是A,然后在这段时间间隔内A的值变化成B又变化成A,这个时候其实它的值已经被更新过了,但是如果只比较值是没法判断出来是否更新过的,虽然对于一些计数,求和的操作不影响结果,但这是有缺陷的。 解决方法:通过版本号来判断,在每次更新后对应的版本号加1,这样一来在比较值之后如果相等,可以再次比较版本号来判断是否真的更新过。JDK 1.5 以后的 AtomicStampedReference 类就提供了此种能力,其中的 compareAndSet 方法就是 首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
(2)自旋多次循环导致的效率问题
上面说过CAS在判断两次读取的值不一样的时候会放弃操作,但为了保证结果正确,通常都会继续尝试循环再次发起CAS操作,如果连续多次CAS都失败,那么就会消耗大量的cpu资源。
(3)仅仅保证单个共享变量的原子操作?
CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效;不过从 JDK 1.5开始提供了 AtomicReference 类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作


CAS与Java并发工具包的关系:
java.util.concurrent包里面的工具类基本全部都是使用了CAS+volatile的乐观锁机制,也就是说Java并发工具包里面的大多数类底层是构建在CAS+volatile这种lock-free的机制上,所以拥有更好更高的并发效率。


总结:
CAS是一项基于乐观锁的非阻塞技术(不需要线程的上下文切换),虽然CAS也有自己的一些缺点,但其通过操作系统底层提供的原子指令来实现lock-free的取得同步效果,在大多数情况下其效率和性能都要比synchronized和lock更好。

 

二:CAS无锁原理简单理解

为什么要用CAS:
在多线程高并发编程的时候,最关键的问题就是保证临界区的对象的安全访问。通常是用加锁来处理,其实加锁本质上是将并发转变为串行来实现的,势必会影响吞吐量。而且线程的数量是有限的,依赖于操作系统,而且线程的创建和销毁带来的性能损耗是不可以忽略掉的。虽然现在基本都是用线程池来尽可能的降低不断创建线程带来的性能损耗。

对于并发控制而言,锁是一种悲观策略,会阻塞线程执行。而无锁是一种乐观策略,它会假设对资源的访问时没有冲突的,既然没有冲突就不需要等待,线程不需要阻塞。那多个线程共同访问临界区的资源怎么办呢,无锁的策略采用一种比较交换技术CAS(compare and swap)来鉴别线程冲突,一旦检测到冲突,就重试当前操作直到没有冲突为止。

与锁相比,CAS会使得程序设计比较复杂,但是由于其优越的性能优势,以及天生免疫死锁(根本就没有锁,当然就不会有线程一直阻塞了),更为重要的是,使用无锁的方式没有所竞争带来的开销,也没有线程间频繁调度带来的开销,它比基于锁的方式有更优越的性能,所以在目前被广泛应用,我们在程序设计时也可以适当的使用。不过由于CAS编码确实稍微复杂,而且jdk作者本身也不希望你直接使用unsafe(后面会讲到)来进行代码的编写,所以如果不能深刻理解CAS以及unsafe还是要慎用,使用一些别人已经实现好的无锁类或者框架就好了。

CAS原理分析:

一个CAS方法包含三个参数CAS(V,E,N)。V表示要更新的变量,E表示预期的值,N表示新值。只有当V的值等于E时,才会将V的值修改为N。如果V的值不等于E,说明已经被其他线程修改了,当前线程可以放弃此操作,也可以再次尝试次操作直至修改成功。基于这样的算法,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰(临界区值的修改),并进行恰当的处理。

额外引申技术点:volatile
上面说到当前线程可以发现其他线程对临界区数据的修改,这点可以使用volatile进行保证。
volatile实现了JMM中的可见性。使得对临界区资源的修改可以马上被其他线程看到,它是通过添加内存屏障实现的。

 

三:CAS无锁自旋和同步锁线程切换使用场景对比

1、对于资源竞争较少的情况,使用同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗CPU资源;而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。
2、对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于锁。CAS在判断两次读取的值不一样的时候会放弃操作,但为了保证结果正确,通常都会继续尝试循环再次发起CAS操作,如Jdk1.6版本的AtomicInteger类的getAndIncrement()方法,就是利用了自旋实现多次尝试:

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

如果compareAndSet(current, next)方法成功执行,则直接返回;如果线程竞争激烈,导致compareAndSet(current, next)方法一直不能成功执行,则会一直循环等待,直到耗尽cpu分配给该线程的时间片,从而大幅降低效率。
总之:
1、使用CAS在线程冲突严重时,因为自旋会大幅降低程序性能;CAS只适合于线程冲突较少的情况使用。
2、线程冲突严重的情况下,同步锁能实现线程堵塞和唤醒切换,不会出现自旋,避免了上述的情况,从而让性能远高于CAS。

H3C CAS系列开篇之CAS初认识 基于信创需要,某项目中的VMware软件存求替代方案,尤其在VDI方面,寻求使用紫光集团旗下H3C的CAS云计算管理平台,又称CAS虚拟化解决方案/管理系统,H3C CAS是H3C公司面向数据中心自主研发的企业级虚拟化软件。CAS提供了强大的虚拟化功能和资源池管理能力,能有效整合数据中心IT基础设施资源,只需通过简单易用的管理界面轻松管理IT资源池和架构,助力数据中心从传统架构向云架构平滑演进。对硬件主机,CVM进行双击热备,两台服务器以主备模式运行CVM管理软件,通过虚拟IP来访问CAS管理平台。 阅读详情

相关推荐

安全系列之CAS系统

前言 本期介绍一下CAS(Central Authentiction Service )中心认证服务,以Apereo CAS工程为核心讲解CAS是怎么解决商业级系统SSO(single sign-on)认证问题的。 目录 前言 一,SSO与SLO 二,CAS系统架构 三,CAS client 四 , CAS server 五,CAS protocol 一,SSO与SLO 在介绍CAS工作之前,要先从SSO的故事讲起。SSO(single sign-on)单点登陆和SLO(single .

lishinho的博客 3700

cas系列(一)--cas单点登录基本原理

一、为什么要实现单点登录 随着信息化不断发展,企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是 在不同的时期开发完成的,各应用系统由于功能侧重、设计方法和开发技术都有所不同,也就形成了各自独立的用户库和用户认证体系。随着新的业务网站不断的增 加,用户在每个应用系统中都有独立的账号,这样就造成在访问不同

享耳三羊 4269

定积分计算器_fx-CG系列图形计算器CAS应用程序Khicasen

【作者声明】  本文所有文字均为作者原创,所有图片均为作者本人真实制作。  版权所有,仅供阅读欣赏,严禁任何单位或个人以任何形式转载、复制、引用、抄袭、截图、模仿、翻译本评测的部分或全部内容(包括但不限于文字、图片)。  作者保留所有权利。  请尊重作者劳动成果,谢谢合作。  CASIO彩屏图形计算器fx-CG10、fx-CG20、fx-CG50原生不带有CAS(Computer Algebra ...

weixin_39765588的博客 2223

cas系列(二)--cas单点登录配置

一、概述 此文的目的就是为了帮助初步接触SSO和CAS 的人员提供一个入门指南,一步一步演示如何实现基于CAS的单点登录。 CAS的官网:http://www.jasig.org/cas 二、演示环境 本文演示过程在同一个机器上的(也可以在三台实体机器或者三个的虚拟机上),环境如下: windows7 64位,主机名称:gy-pc JDK 1.7.0_79 Tomcat7 CAS-

享耳三羊 3771

python积分计算_fx-CG系列图形计算器CAS应用程序Khicasen

【作者声明】  本文所有文字均为作者原创,所有图片均为作者本人真实制作。  版权所有,仅供阅读欣赏,严禁任何单位或个人以任何形式转载、复制、引用、抄袭、截图、模仿、翻译本评测的部分或全部内容(包括但不限于文字、图片)。  作者保留所有权利。  请尊重作者劳动成果,谢谢合作。  CASIO彩屏图形计算器fx-CG10、fx-CG20、fx-CG50原生不带有CAS(Computer Algebra ...

weixin_39778400的博客 1046

cas系列(五)--CAS+OpenLDAP实现SSO

一、概述 本来主要详细是介绍CAS和LDAP整合实现单点登录的步骤。 二、详细步骤 1.CAS的基础安装配置:cas系列(二)--cas单点登录配置 2.LDAP安装配置:cas系列(四)--openLDAP安装和配置 安装配置,添加部分测试数据如下: 3.CAS整合LDAP的配置 如果是Mave构建项目的,添加LDAP的相关依赖: org.jasi

享耳三羊 3775

03单点登录CAS5.3.4集成客户端

参照网址 参照网址 server代码地址 client1代码地址 client2代码地址 之前一直是server端登录验证。所谓单点登录(SSO),只当企业用户同时访问多个不同(类型的)应用时,他们只需要提供自身的用户凭证信息(比如用户名/密码)一次,当用户在不同的应用间切换时,他们不用再重复地输入自身的用户凭证了。所以此章写一下cas如何整合客户端 1.配置Host #cas服务端 127.0....

Amy的博客 1483

【Java 线程系列】CAS 原理解析

作者:半身风雪 上篇:ThreadLocal进阶解析 系列文章简介:什么叫做CAS呢?CAS 本名叫做:Compare And Swap。本文将通过CAS 的实现,JDK中相关的原子操作,及原子操作的三大问题,来全面的解析CAS。 CAS 原理解析一、什么是原子操作?如何实现原子操作?二、CAS 实现原子操作的三大问题2.1、ABA 问题2.2、开销问题2.3、只能保证一个共享变量的原子操作。三、Jdk 中相关原子操作类的使用3.1、AtomicInteger3.2、AtomicIntegerArra.

半身风雪 892

轻松入门CAS系列(1)-轻松看懂企业单点登录的解决方案

常见的企业应用情况 企业内部的信息化一般都是一个过程中的 ,起初企业为了部分管理的需要,会上线几个信息化系统;后来对这块慢慢重视,信息系统会越来越多。开始,只有一两个系统时,员工还好,靠脑袋还能记得住帐号名密码,但是后面系统多,使用的系统超过4个后,开始有点记不住了。特别是偶尔使用系统,需要经常要联系系统负责人,重置帐号密码; 但是,重置密码这件事情,在小公司还算好,大家相互认识;但是在大...

好用的CAS 1308

AI Agent技能评测框架SkillsBench:从黑盒评估到白盒技能拆解

在人工智能领域,模型评估是衡量技术进展的核心环节。传统评测基准如GLUE、MMLU主要关注模型的通用认知能力,但实际工程应用中,AI Agent需要的是在复杂场景中协调多种能力的“职业技能”。SkillsBench创新性地将Agent能力进行原子化拆解,定义了理解规划、工具调用、推理决策、交互安全等技能维度,并通过领域专家构建的评测集确保生态效度。这一框架为Agent开发提供了精准的“度量衡”,使性能优化从经验驱动转向数据驱动,同时为不同模型和框架提供了公平比较的基础,推动了AI Agent生态从“野蛮生长

weixin_30530339的博客 389

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 555

cas系列文章转载

CAS系列文章 向原作者致敬

孙晴 476

ECN实战指南:如何用SAP系统搞定工程变更(附库存处理避坑技巧)

本文详细解析了如何在SAP系统中高效执行工程变更通知(ECN),特别聚焦PP模块的操作流程与库存处理技巧。通过实战案例和系统操作指南,帮助制造业企业避免库存混乱和生产中断,实现从创建到生效的全流程管理。

m5n6o7的博客 1085

【JavaEE初阶系列】——CAS

CAS:全称,字面意思:”比较并交换,一个CAS涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。1. 比较 A 与 V 是否相等。(比较)2. 如果比较相等,将 B 写入 V。(交换)3. 返回操作是否成功。CAS 比较交换的是 内存 和 寄存器。比如有一个内存M,现在有俩个寄存器A,B.CAS(M,A,B)如果M和A的值相同的话,就把M和B的值交换,同时整个操作返回true.如果M和A的值不同的话,无事发生,同时整个操作返回false.

m0_74438843的博客 1222

3DE重客户端安装

3DE重客户端安装

m0_48170265的博客 9438

《备考系统架构设计师》 - 专栏介绍和目录

本专栏包括所有历年真题及详解、章节知识核心总结、精选高分论文、补充知识、专题总结等。欢迎订阅专栏。

数据知道的博客 4万+

锁系列—浅谈CAS及原理

一、什么是CAS? CAS就是比较并交换(compare and swap)的意思,属于乐观锁的一种。通俗点说,当我们想修改一个值时,我们会先将这个值和原先的值进行比较,如果发现和原先的值一样,那么我们再进行修改。 CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。 更新一个变量时,只有当预期值A和内存地址V中的实际值相同时,才会将内存地址对应的值修改为B。 如果发现不一致,则会重新进行尝试,这个尝试的过程被称为自旋。 二、CAS的缺点 1.cpu开销大 ​ 自旋锁的目的是为了占

lans_g的博客 4995

嵌入式面经(2)——央企篇

前文得知我只投央企,不投国企,有面试的央企大致有三类:感兴趣的同学可以和我私聊军工央企相关(航空航天,兵器兵工)制造央企相关(三桶油,装备制造)金融运维相关(信通集团,国有银行)接下来我将对我有的面试中询问的面经进行总结。

coldmood77的博客 473

6. Java JUC源码分析系列笔记-CAS

1.1. Java JUC源码分析系列笔记-JMM模型之先谈硬件2.2. Java JUC源码分析系列笔记-JMM模型之再谈JMM3.3. Java JUC源码分析系列笔记-Synchronized4.4. Java JUC源码分析系列笔记-锁的优化5.5. Java JUC源码分析系列笔记-volatile6.6. Java JUC源码分析系列笔记-CAS7.7. Java JUC源码分析系列笔记-AQS8.8. Java JUC源码分析系列笔记-手写AQS9.

weixin_28928727的博客 81

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1914

计算机组成原理(第三版)唐朔飞-第七章指令系统-课后习题

机器字长是指CPU一次能处理数据的位数通常与CPU的寄存器位数有关。指令字长是指机器指令中二进制代码的总位数。存储字长是指存储单元中存放二进制代码的总位数。三者可以相等也可以不等视不同机器而定。答:OP(4位)A1(6位)A_1(6位)A1​(6位)A2(6位)A_2(6位)A2​(6位)设二地址指令格式为该指令系统的基本格式,4位操作码共有16种编码,其中13种用来定义二地址指令,还剩3种可用作扩展标志。一地址指令条数=3∗26=192。

weixin_45735391的博客 7万+

并发系列—CAS初识

CAS(Compare And Swap)锁的一种,可以称为自旋锁。 与我们知道的synchronized、lock其本质区别是CAS并没有像其他两种一样真正将这个对象锁住而是通过不断获取原有值然后进行比较的方式去保证数据的正确性,如其名称的直译【比较与交换】。 例:3个线程同时操作一个对象的属性(age)。 age=0;现在3个线程都对age进行操作(每次对当前值+1,每个线程都是操作1...

dengdai123654的博客 284

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

矩阵化为行最简形矩阵计算器_fx-9860GIII系列图形计算器CAS应用程序Khicas

【作者声明】  本文所有文字均为作者原创,所有图片均为作者本人真实制作。  版权所有,仅供阅读欣赏,严禁任何单位或个人以任何形式转载、复制、引用、抄袭、截图、模仿、翻译本评测的部分或全部内容(包括但不限于文字、图片)。  作者保留所有权利。  请尊重作者劳动成果,谢谢合作。  CASIO黑白屏图形计算器fx-9860GIII系列已经发布,但fx-9860GIII和之前的一样,仍然是原生不带CAS(...

weixin_39517560的博客 5127

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java多线程系列——CAS机制

Java多线程

飞影铠甲的博客 1425

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

上一篇: 单例模式 与 线程安全
下一篇: 转载---MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值