iOS开发中的单元测试(二)——让断言活泼起来的匹配引擎

AI岗位重置:工作流模块化与人类价值再定位 AI对职业的影响本质是工作流的模块化重构,而非简单替代。其底层逻辑在于将可标准化、高重复、强模式化的任务单元(如结构化内容生成、流程化信息处理)从岗位中剥离,交由模型高效执行。这一过程依赖推理成本坍塌、多模态对齐成熟和RAG架构普及三大技术拐点,使AI深度嵌入日常工具链。技术价值体现为效率跃迁与职责重构并存——岗位不消失,但‘熟练度护城河’瓦解,倒逼从业者转向校验、风控、上下文架构等高阶协同角色。典型应用场景覆盖文案、客服、初级开发、财务分析等执行密集型岗位,核心挑战在于建立AI输出的三重校验机制与个人不可 阅读详情

上一篇文章简单介绍了OCUnit和GHUnit两款iOS开发中较为常见的单元测试框架,本文进一步介绍单元测试中的另一利器——匹配引擎(Matcher Engine)。匹配引擎可以替代断言方法,配合单元测试引擎使用,测试用例可以更多样化,更细致。

传统断言提供的方法数量和功能都有限,以导读中提到的两款框架为例,即使是断言相对丰富的GHUnit也只是提供了38种断言方法,范围仅涵盖了逻辑比较,异常和出错等少数几方面,仍然很单一。而使用匹配引擎代替断言,可能性就大大丰富了,除了普通断言支持的规则,一般的引擎还默认提供了包含,区间,继承关系等。更重要的是,使用匹配引擎开发者可以自行开发匹配规则,引入与业务相关的逻辑判断。


OCHamcrest
本文要介绍两款匹配引擎,一款就是Hamcrest的Objective-C实现——OCHamcrest,另一款则是专为Objective-C/Cocoa而生的后来者——Expecta。接下来将结合GHUnitTest,介绍两款匹配引擎如何在单元测试中发挥作用(有关GHUnitTest参考《iOS开发中的单元测试(一)》。

介绍匹配引擎必须要提Hamcrest,几乎已经成为匹配引擎的代名词。官网首页上的一句话表明了它的身世:“Born in Java, Hamcrest now has implementations in a number of languages.”。这款诞生于Java的匹配引擎现在还支持除Java的Python、Ruby、PHP、Erlang和Objective-C。

  • 加入工程

在iOS工程中使用OCHamcrest需要先获取OCHamcrestIOS.framework,可以从Quality Coding直接下载,或在Github上获取源码编译。注意:Github上托管的OCHamcrest工程以Submodule的形式关联源代码,因此如果使用命令行方式clone工程,需要执行“git submodule update --init”。

下载源码后,进入Source目录,执行MakeDistribution.sh脚本,将会在Source/build/Release下生成OCHamcrest.framework、OCHamcrestIOS.framework和OCHamcrest.framework.dSYM , OCHamcrestIOS.framework就是iOS工程中需要用到的框架,如图1。

图1,从源码编译生成 OCHamcrestIOS.framework

打开已经安装了GHUnitTest的工程,把OCHamcrestIOS.framework添加到单元测试的Target中。在需要使用匹配引擎的用例中,定义“HC_SHORTHAND”并导入“<OCHamcrestIOS/OCHamcrestIOS.h>”(如图2)。

图2,把OCHamcrestIOS.framework导入工程

至此OCHamcrest已经安装完成,可以再测试用例中使用匹配规则代替GHUnitTest的断言方法。

  • 预定义规则

OCHamcrest针对不同的数据类型提供了大量的预定义匹配规则,大大丰富了断言的类型。支持的数据类型包括:对象、容器、数值和文本,此外还提供了专门的逻辑匹配规则。

以文本(一般就是NSString)为例,OCHamcrest提供了6种针对对象的匹配规则:

IsEqualIgnoringCase,该文本是否与给出的文本相同(忽略大小写);

IsEqualIgnoringWhiteSpace,该文本是否与给出的文本相同(忽略空格);

StringContains,该文本是否包含给出的文本片段;

StringContainsInOrder,该文本是否按照先后顺序包含给出的若干文本片段;

StringEndsWith,该文本是否以给出的文本片段结尾;

StringStartsWith,该文本是否以给出的文本片段开头。

另外,再举OCHamcrest为对象(NSObject和NSObject的子类)预定义的8条规则:

ConformsToProtocol,该对象是否遵循了给出的协议,或者说是否实现了给出的Delegate;

HasDescription,允许使用文本规则对给出的一段文本与该对象的描述进行匹配;

HasProperty,该对象是否含有给出的属性;

IsInstanceOf,是给出的类的实例,或是给出的类子类的实例;

IsTypeOf,是给出的类的实例,不同于IsInstanceOf,无法匹配子类实例;

IsNil,为空;

IsSame,与给出的对象是同一个实例。

  • 撰写用例

OCHamcrest提供了匹配规则和相应的断言方法,配合单元测试框架(本文以GHUnit为例, 在《iOS开发中的单元测试(一)》中已经介绍了如何安装GHUnit框架并撰写用例)的驱动机制即可撰写用例。本文以联合使用上述提到的StringStartsWith和HasDescription规则为例。

首先,定义一个用于示例的类“Man”(如图3),有属性friends,当friends为空,其description为“Man without any friend, so sorry.”,反之为“Nice persion with [friends count] friend(s).”。(使用Foo或Bar这样的示例会显得很没情怀吧 ;-|)

图3,用于测试的类:Man

用例中判断某Man实例的description是否以Nice开头(这是不是一个友善的人),如图4。

图4,测试用例两则

UntTestCase是GHTestCase的子类,引入<OCHamcrestIOS/OCHamcrestIOS.h>并定义HC_SHORTHAND表示使用OChamcrest。setUp方法在每个测试方法执行之前初始化一个Man实例;testANiceMan方法向Man实例的friends属性中加入两个值,因此该实例的description将返回“Nice man ....”;使用OCHamcrest提供的断言方法assertThat与匹配规则配合,判断该实例的description是否以“Nice”开头;testNotANiceMan方法则直接测试一个未经过加入friends的实例测试。

上述测试,testANiceMan方法顺利通过,testNotANiceMan不会通过,直接报出错误堆栈,并打印在匹配规则中预先定义好的出错信息(如图5)。

图5,测试结果

  • 辅助方法

Syntactic Sugar是一种提高匹配规则和断言可读性的方案,让一个匹配和断言看起来更像是一句自然语言的话,而非多个函数的堆砌,对实际的匹配运算不产生任何影响。例如,没有加Sugar的匹配:

assertThat(foo, equalTo(bar));

加Sugar可以是:

assertThat(foo, is(equalTo(bar)));

除了Sugar,OCHamcrest还提供了describedAs方法,用于辅助断言方法,自定义出错文案,例如:

assertThat(foo, describedAs(@”foo should be equal to bar”, equalTo(bar), nil));
  • 自定义规则

OCHamcrest官方给出的自定义匹配规则示例是:onASaturday,判断一个NSDateComponents实例是否为星期六。本文以上一节使用的Man对象为例,匹配某Man实例是否有一个名为“Joe”的好友,规则命名为:hasAFriendJoe。

自定义匹配规则包括两部分,一个Macher类和一个用OBJC_EXPORT方式定义的函数。

自定义Macher类都是HCBaseMatcher的子类(如图6),接口中定义的类初始化方法供匹配方法hasAFriendJoe调用,其实现则通过调用接口中定义的另一个实例方法。

图6,HasAFriend接口和匹配方法hasAFriendJoe定义

在HasAFriend中需要引入<OCHamcrestIOS/HCDescription.h>,并重写父类中的matches:和describeTo:方法(如图7)。在maches:方法中实现匹配逻辑,匹配成功则返回YES,否则返回NO;describeTo是失败后的描述;hasAFriendJoe方法只需要调用类方法初始化匹配规则类即可。匹配规则定义后,可以配合断言方法使用,如上一节所示的assertThat方法:

assertThat(self.man, hasAFriendJoe());

图7,规则实现

Expecta

Expecta专为Objective-C/Cocoa而生,相比OCHamcrest,其优化了匹配的语法,测试用例的可读性更高。此外,Expecta对匹配对象类型没有强制要求,允许任意类型的数据进行匹配。在OCHamcrest中每一条匹配规则都是一个方法,规则联合使用也需要以参数形式传递。在Expecata中联合规则的语法是以点号连接,借助Sugar介词可以把一个联合规则拼装成一句符合自然语法的句子,例如:

OCHamcrest —— assertThat(@"foo", is(equalTo(@"foo")));
Expecta —— expect(@"foo").to.equal(@"foo");
  • 加入工程

Expecta提供了CocoaPods的源,可以通过定义依赖引入:

dependency 'Expecta', '~> 0.2.1'

dependency 'Specta', '~> 0.1.7' # specta bdd framework

或者从github上获取源代码,编译出Library,引入XCode工程。下载源码后,进入工程目录,运行rake,编译工程。编译完成后,把products目录拷贝到工程中(如图8),在iOS/MacOSX工程中加入响应的.a文件(如图9)。在Build Settings的Other Linker Flags中加入-ObjC参数(在《iOS开发中的单元测试(一)》中添加GHUnit一节介绍了如何添加-ObjC的参数)。与OCHamcrest类似,在测试用例中定义EXP_SHORTHAND,并引入“Expecta.h”(如图10)。

图8,加入编译后的头文件列表

图9,加入Library文件

图10,用例中引入Expecta

  • 预定义规则

Expecta提供的预定义规则只有20条,远远少于OCHamcrest提供的预定义规则。由于Expecta的匹配规则对匹配对象没有要求,因此没有提供像OCHamcrest中针对某种对象的特定规则。

在Expecta的github首页可以看到全部预定义规则列表。举几个较有特点的规则为例:

expect(x).to.beCloseToWithin(y, z),x距离y的距离小于z
expect(x).to.beTruthy(), x是否为真(或非空);
expect(x).to.beFalsy(),x是否为假(或空/零);
expect(^{ /* code */ }).to.raiseAny(),该Block是否抛出异常;
expect(^{ /* code */ }).to.raise(@"ExceptionName"),该Block是否抛出给定名字异常。

此外,通过.notTo或.toNot对规则取反进行匹配,如:expect(x).notTo.equal(y)。

通过.will或.willNot进行异步匹配,即在超时时间(默认超时1秒,也可通过[Expecta setAsynchronousTestTimeout:x]设定)之前满足匹配规则即可,如:expect(x).will.beNil()。

  • 撰写用例

Expecta不使用类似assertThat类似的辅助断言方法,而是直接使用expecta.语法匹配。

仍然以GHUnit测试用例为例,测试一个数字n,是否在5附近,距离小于2,即处在[3,7]区间内(如图11)。

图11,Expecta测试用例

Expecta不支持匹配规则的联合使用。

  • 辅助方法

Expecta也有语法Sugar:to。

  • 自定义规则

Expecta的自定义规则有两种方式,静态规则和动态规则。

定义静态规则:

Expecta的匹配规则不是一个类,是通过框架提供的宏定义来实现的,操作比定义OCHamcrest规则简单不少。仍以OCHamcrest中的判断一个Man实例是否有名为“Joe”的好友。

通过EXPMatcherInterface()方法定义,该方法有两个参数,规则名和规则参数列表。示例如图12。

图12,扩展规则hasAFriendJoe定义

EXPMacherInterface第二个参数允许通过这样的方式定义列表:(NSString *Foo, int bar)。

在实现中,用EXPMatcherImplementationBegin和EXPMatcherImplementationEnd标示规则实现的头尾。并定义prerequisite、match、failureMessageForTo和failureMessageForNotTo四个Block,分别返回与判断结果,匹配结果,正向匹配出错原因和反相匹配出错原因(如图13)。由于Expecta框架不支持ARC,因此需要在Build Settings中对该.m文件添加 -fno-objc-arc参数。在测试用例中可以通过如下语法调用:

expect(self.man).hasAFriend(@"Joe");

或反相匹配:

expect(self.man).notTo.hasAFriend(@"Joe");

图13,Expecta自定义规则实现

定义动态规则:

动态规则是本质上并不是一段逻辑匹配,而是通过Expecta的语法对匹配对象的属性进行是否为真的断言。例如:

@interface LightSwitch : NSObject
@property (nonatomic, assign, getter=isTurnedOn) BOOL turnedOn;
@end
@implementation LightSwitch
@synthesize turnedOn;
@end

可以写出如下断言:

expect([lightSwitch isTurnedOn]).to.beTruthy();

建立动态规则:

EXPMatcherInterface(isTurnedOn, (void));

就可以通过以下断言判断turendOn属性的真假:

expect(lightSwitch).isTurnedOn();

总结

整体看两款匹配引擎,Expecta小巧,敏捷,提供了多种灵活的匹配方式,OCHamcrest从Hamecrest体系继承而来,形式更加中庸,提供的机制更完善。从开发者的角度看,Expecta更好玩,而OCHamcrest更实用,在实验性的项目中我会偏向选择Expecta,而较正式的项目则会使用OCHamcrest。

OCHamcrest结合上一篇《iOS开发中的单元测试(一)》中介绍的单元测试框架GHUnit可以给开发者提供一个完整的单元测试方案,建议开发者在自己的项目中引入这样的质量自控机制,写出健壮的代码。

通过两篇文章介绍了单元测试框架和匹配引擎的一些基础知识,在接下来的文章中,我将结合一个项目,从实战角度详细记述如何开发带有单元测试的iOS项目。


单细胞分析避坑指南:你的Harmony批次矫正真的做对了吗? 本文深入探讨了单细胞转录组分析中Harmony批次矫正的正确使用方法,解析了其工作原理及常见误区。通过详细参数调优指南和实战案例,帮助研究者避免过度矫正,确保生物学信号的有效保留。特别关注Harmony在单细胞数据分析中的关键参数设置和结果验证方法。 阅读详情

相关推荐

深入解析USB3.0一致性测试的关键技术与实践指南

本文深入解析了USB3.0一致性测试的核心技术与实践指南。文章阐述了测试如何确保设备在5Gbps高速传输下的信号完整性、电源管理合规性及协议兼容性,并提供了从测试系统搭建到完整流程执行的实战经验,帮助工程师有效应对高速信号、电源与兼容性三大核心挑战。

weixin_29164091的博客 278

黑马程序员_多态性和关键字instanceof

------- android培训、java培训、期待与您交流! ---------- 多态: 可以理解为事物存在的多种体现形态。是类的形态之一 java引用变量有两种类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就会出现所谓的多态。其实多态就是父类的对象指向子类的对象,就

y_heima的专栏 396

Qt Coordinate System

Qt 坐标系统Qt 坐标系统 数学基础 Qt坐标系统 视口 平移变换 缩放变换 setWindow 旋转 总结数学基础 矩阵与线性变换坐标系变换Qt坐标系统 视口和OpenGL一样,视口确定了画面在窗口(QWidget)中显示的区域,Qt的绘图坐标会完全映射到视口(View port)上,就像图示一样。默认情况下,窗口和视口是重合的,视口的大小覆盖了整个窗口。和OpenGL一样,Qt的QPa

unclerunning的博客 1150

instanceof的原理你了解吗?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代.

weixin_44761091的博客 2138

VSAN 虚拟机丢失排查与恢复完整方案

VSAN虚拟机(含vCenter)显示无效 检查存储状态:登录ESXi Host Client,确认VSAN存储是否挂载。 若未挂载,通过SSH执行 手动挂载。 验证文件存在:检查虚拟机文件是否完整。 解除文件锁定:删除残留的 .lck 文件 手动注册虚拟机:强制注册虚拟机配置文件。 检查VSAN健康:验证集群节点在线、磁盘组状态正常,并测试节点间网络。 修复元数据:针对损坏对象,谨慎执行修复。 终极恢复:若数据丢失,从备份还原或联系VMware支持,提交日志

sido777的博客 2679

通过实例讲解瀑布模型

在电子商城开发中,瀑布模型如同 “工业时代的流水线”—— 能通过标准化流程交付高质量、高合规性的系统,但也可能因缺乏灵活性而错失市场机会。其优势与缺点本质上源于同一核心特征:严格的阶段性与文档驱动。决策建议若开发传统型、长周期、需求固定的电子商城(如企业内部采购平台),可优先选择瀑布模型,并通过 “需求预验证 + 模块化设计” 降低风险;若开发创新型、短周期、需快速迭代的电商平台(如社交电商、跨境电商),建议采用敏捷模型或混合模型(如瀑布 + Scrum),平衡规范性与响应速度。

跟佟格湾一起学习计算机知识吧~ 271

判断数组的方法差异(web,安卓,ios)

测试数据 var arr = ["http://mddoss.dev.gzqylc.com//oss/file/2020/11/18/9C39C6889B559FC756A92EE240A53B9D.mp4", "http://mddoss.dev.gzqylc.com//oss/file/2020/11/18/EFB7A11FD842DAFBE2277FFE558EB107.jpeg" ]; console.log(Object.prototype.toString.call(arr) =

Femi的博客欢迎大家 319

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。

jundao1997的专栏 563

iOS开发者的Java学习笔记

iOS开发者的Java学习笔记_ ^ _ ^ _ 本篇笔记主要记录了JavaSE的学习。 目录 Java概述 Java数组与字符串 类与对象 面向对象 Java概述:Java分为三个体系:> * JavaSE(Java Platform Standard Edition即Java平台标准版) * JavaEE(Java Platform Enterprise Edition即Java平台企

IOSAFei的专栏 1298

半小时搞定Yolov5安装配置及使用(详细过程)

Yolov51. 下载Yolov52. 安装Yolov5 在下载配置Yolov5前,先要安装好Anaconda环境,可参考之前博文:最新Anaconda3的安装配置及使用教程(详细过程) 1. 下载Yolov5 首先下载Yolov5源码: Yolov5 Github地址:https://github.com/ultralytics/yolov5 直接git clone到本地工作目录,等待下载完成: Yolov5代码目录架构: 2. 安装Yolov5 源码下完后,下面开始安装Yolov5所需模块,

HowieXue 薛永浩的博客 12万+

docker-compose Install OrangeHRM

OrangeHRM是一个全面的人力资源管理HRM) 系统,它包含任何企业所需的所有基本功能。OrangeHRM旨在支持任何规模的团队,包括初创企业、中小企业以及大型跨国组织。

极致,细节 1003

ios单元测试链接整理

OCUnit测试用例配置指南:http://blog.youkuaiyun.com/jjunjoe/article/details/9104869 iOS的OCUnit测试框架:http://www.infoq.com/cn/articles/ios-unit-test-1 iOS开发中的单元测试(一):http://www.infoq.com/cn/articles/ios-unit-t

在测试路上奔跑的小松鼠 800

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ios单元测试相关文章

iOS开发中的单元测试(一) iOS开发中的单元测试(二)——让断言活泼起来的匹配引擎 IOS 单元测试 iOS单元测试 XCode下的iOS单元测试 iOS开发进阶之单元测试 iOS开发那些事--OCUnit测试框架 iOS开发那些事--编写OCUnit测试方法-应用测试方法 iOS开发那些事--编写OCUnit测试方法-逻辑测试方法

编程路上的野花 729

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

第二十六、Java面向对象之instanceof 关键字

instanceof是什么?        1:属于比较运算符:        2:instanceof关键字:该关键字用来判断一个对象是否是指定类的对象。        3:使用格式:                对象  instanceof 类;                  该表达式是一个比较运算符,返回的结果是boolea类型  true|false     注意:使用

iOS小菜鸟的专栏 411

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

instanceof的用法

instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例,如下: function Person(){ this.name="wang"; } var p1=new Person(); console.log( p1 instanceof Person);//true instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构造函数的原型对象(prototype),是否在左边对象的原型链上。因此,下面这种写法是等价的。 console.log(Perso

typ的blog,记录工作中的问题、学习中的笔记、生活中的感想。 1万+

iOS中的__typeof与typeof

做SDK开发引入AFNetworking那么多的文件不太合适,所以这几天在精简AFNetworking,并共享中github上,https://github.com/yjh4866/SimplifiedAFN。 看AFN源码的AFURLConnectionOperation.m文件时发现一处代码如下: __weak __typeof(self)...

weixin_30677475的博客 376

typeOf与 instanceof的区别

typeof是判断变量是什么基本类型的; instanceof是判断对象到底是什么类型的;

德莱问的博客 9503

instanceof运算符

interface A {}class B implements A {}class C extends B {}public class Iinstanceof { public static void main(String[] args) { A ab = new B(); A ac = new C(); B bc = new C();

lefy生活 341

instanceof

主要有两个用处:1、判断一个对象是否是某个类的实例。2、判断一个对象是否实现了某个接口。

mengguihua110的博客 905

Java 多态中的类型转换(instanceof)

引用类型转换 1、向上类型转换(自动/隐式类型转换),是小类型转化成大类型,不存在认了风险。即子类型对象也是父类型。 2、向下类型转化(强制类型转化),大类型转化成小类型,存在一定风向。多态实例后,都可以向上类型转化,但是转化后,子类型对象间的互相转换就会存在一定风险。如何规避风险? 使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题 //创建子类对象

风中的劲草 1万+
上一篇: ASIHTTPRequest-进度追踪
下一篇: XCODE 单元测试指南
richeninfo
博客等级 码龄16年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值