关于OR-Mapping的学习心得体会

理解O/R Mapping <br />本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping。什么是O/R Mapping?<br />广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。<br />狭义上,ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节。为什么需要O/R Mapping?< 阅读详情

注:本文只针对设计上采用OOA(面向对象分析)及OOD(面向对象设计)方式,数据存储采用关系型数据库的系统而言。

从对OR-Mapping错误认识谈起

       从工作流管理系统和信息共享平台的设计开发过程中,不断的摸索面向对象分析和面向对象设计的方法, 因为面向对象程序设计更加接近人的思维活动,利用这种思想进行程序设计时,可以很大程度的提高编程能力,缩短软件开发周期,减少软件维护的开销。面向对象技术已经成为软件开发的一种趋势。

       通过工作流管理系统和信息共享平台的设计和实现,我们对面向对象的程序设计的认识也越来越深刻,逐渐过渡到以面向对象的思想为基准的分层、分布式程序设计开发方式。通过理论、实践、理论的步骤,不断总结学习的过程中,发现原来对OR-Mapping的认识是不正确的。首先概述以下原来软件设计的过程:

首先从需求出发,分析用户需求,界定系统功能,然后做详细设计,详细设计阶段主要是拉通业务流程,根据业务流程,完成数据字典的设计,如果采用面向对象开发的方式,我们将会抽象出业务实体对象,并将他和关系型数据库的表和字段联系起来,进行映射,完成从具有关系型的表到对象的映射,这也就是我开始对OR-Mapping的理解,后来意识到这种认识是错误的,面向对象的开发过程也存在问题。

面向对象的分析设计方法强调分析和设计全部采用面向对象的方法。从用户需求出发,分析面向对象的业务,在分析阶段应该构建出面向对象的分析模型,这些模型是概念模型,和任何数据库或者语言无关。不产生数据字典,而是概念层次的UML图。进入到设计阶段,UML近一步被细化,设计出类图和类接口。这个过程中并不考虑数据库的结构。当把类图和接口设计完毕后,根据设计的对象来生成相应的数据库结构。而不是上面提到的根据数据库结构建立对象,这个由根据“对象来生成相应的数据库结构”的过程其实正是我们要讨论的OR-Mapping的问题,对象关系的映射问题。

下面的章节,将详细讨论OR-Mapping的相关问题,还讨论了面向对象的数据库设计的方式,以及自己对面向对象分析设计的一点感想。

为什么我们要做OR-Mapping?

如果我们采用面向对象的思想进行系统的分析设计,而数据库采用关系型数据库就会存在这个不容忽视的问题。面向对象设计和关系型数据库设计存在很大的不同。对象模型和关系模型两者之间“阻抗不匹配”。对象模型基于软件工程的一些原理,面向对象设计的理论包括封装、关联、聚合、继承、多态,而关系模型主要针对数据的存储,“阻抗不匹配”就成为了他们的主要矛盾。我们希望通过面向对象的设计方式来完成业务流程,这一点可以实现,但最终如何把对象保存下来,是必须考虑的。如果我们的存贮介质采用关系型数据库,那么怎样将对象保存到关系型数据库的时候,矛盾也就出现了。也是我们要做OR-Mapping的主要原因,架起对象和关系型数据库的桥梁。OR-Mapping主要解决对象层次的映射、对象关系的映射以及对象的持久化问题。

OR-Mapping是面向对象分析设计的产物,也是分层设计要解决的问题之一。OR-Mapping会给程序设计带来那些好处呢?在面向对象的分层设计的系统体系中,上层的程序执行最终结果都是要操作数据库,而数据库是关系型,不是面向对象的,正是通过对象关系的映射,使我们实现了只对上层对象的操作实现对表的操作,感觉好象没有数据库的存在,上层只管面向对象编程就可以了。

OR-Mapping的原则

O-R Mapping通常的做法是将程序中的类映射到数据库的一个或多个表, 但是,由这种方式会带来一些问题。首先就是数据实体在数据库和程序中的表现方式不一样,对于一些涉及到多个表的“粗粒度对象”,一个实体类可能会引用到多个其它实体类,也就是说会在涉及到对象粒度的建模方面带来一些问题;其次在同数据库交互时,也涉及到一个转换的问题,如果一个对象涉及到对多个表的操作,问题就更大;最后,当系统做查询操作,需要返回多个对象时,因为涉及到转换的问题,效率就比较低下。

上面提到的这些都是我们实际要考虑的问题,这里就涉及到做O-R Mapping的原则问题。我们做数据映射时依据一个什么样的标准,以什么原则为指导,那些因素是我们在映射的过程中必须考虑的,下面我将谈到这个问题。

①、性能:

对象映射到表时,性能将是最主要的考虑因素。对象映射到表的方式将会对数据库访问的次数有显著的影响。数据库访问通常是在磁盘上或其它外部媒介上执行,它们的访问时间数量级大约在毫秒级,而CPU的处理周期是在纳秒级。因此,较好的做法是浪费一些存储周期和内存空间,来提高慢速IO的性能。其中有一些做法是计算机可以自己做的,例如Cache、DMA方式等等,有一些则需要我们通过编程来手动处理,减少对数据库的访问次数,例如延迟读、为数据置标志位等等。

    延迟读的核心思想是用到那些数据就读那些数据,比如一个人员对象,有个部门属性,人员和部门分别存放在不同的表中,在初始化人员这个对象时就没必要把部门这个属性一起初始化,当需要这个属性时在从数据库中读出来,值付给这个属性。

数据标志位的主要目的是为了减少内存和磁盘间的IO开销。一般来说,从数据库读入到内存中的数据,不论有没有修改,最后都需要全部写回到数据库中。这是最简单、最通常,但也是最糟糕的做法。一个100K的数据可能只有1K的数据发生了改动,但却不得不写入99K的额外数据。可以考虑为每一行,甚至每个字段的数据甚至修改位,然后根据修改位的状态来选择性的写回数据库。

②、空间消耗:

不同的映射方式会使数据的存取空间有很大的不同,某些映射不会浪费数据库空间(类似于空值字段),另一些则需要大量无用的数据库记录。空间的消耗将会提高性能。我们是牺牲空间还是要提高性能,可能要因事因时而议,要作到最好的权衡。

③、数据库的可维护性和性能

数据库的可维护性和性能是相互冲突的。在优化数据模型性能的同时,改变应用的维护成本也在上升。也需要我们权衡,取舍。

向上面提到的,O-R Mapping不紧要把对象映射到数据库中,还要把对象的关系映射到数据库中,为了更好的阐述O-R Mapping,先来叙述对象之间的几种不同的关系,以便根据不同的关系来叙述相应的映射规则。

对象之间有以下类型的关系:继承、关联、聚合和组成。要有效地映射这些关系,必须理解它们之间的差异。

继承(Inheritance):继承也称一般化关系,是类与类之间最基本的关系,这里就不在详细阐述。

关联(Associations):关联关系是类与类之间的连接,它使一个类指到另一个类的属性和方法。例如仓库类和产品类之间的关系。

聚合(Aggregation):聚合关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如:汽车类与引擎类、轮胎类之间的关系。关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类一个代表整体,一个代表部分。

组成(Composition):也成合成关系,组成关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,组成关系是不能共享的。也就是说,代表部分的对象在某一时刻只能与一个对象发生合成关系。

讨论完上面的类之间的关系后下面我们将阐述对象到关系映射的原则。为了更加清晰的说明映射,我们将采用模式语言来叙述。模式是解决某类问题的方法论,我们这里用模式语言来描述,一是为了便于交流,二是为了进行总结,作为解决问题的一种特定方式。

模式语言阐述把对象映射到表时会遇到的三大类问题的解决方案。根据你的项目的需求的不同,你可能会根据灵活性、易于维护性、低数据库空间消耗,以及性能这几个方面来优化映射方法。把对象映射到表的几种模式,请看下面的模式语言图:


下面将详细的阐述每一种模式:

继承映射模式:

把继承层次映射到关系型数据库表有很多种做法。以下展示的模式是单种的映射方式,在实际中,你可以混合使用不同的映射方式。

以下的讨论没有涉及多重继承。在领域层中很少会遇到有多重继承的情况。

模式: One Inheritance Tree One Table

方法:把继承层次中的所有对象的属性全集对应到数据库的单个表中。每条记录中那些无用的字段使用Null值。

结论:

A.        所占空间:就像你在上面的映射中所描述的,存储对象的属性会浪费一些空间,浪费空间的多少取决于继承层次的深度。层次越深,不同的属性越多,属性的全集就越大,也就越浪费空间。

B.        维护成本:当映射比较直接、比较简单的时候,只要继承的层次不会很多,模式的改进相对也会比较直接和简单。

C.        查询:由于映射简单,查询比较容易,只需访问一张表

如下图所示:


模式:One Class One Table

方法:将每个类的属性放到不同的表中。在每个表中插入一个Synthetic OID,将子类的行和父类所在表的行关联起来。

结论:

A.        虚类:注意虚类也需要映射到单独的表中。

B.        所占空间:这种映射几乎有最佳的空间节约性。唯一的容易就是额外的synthetic OID,来连接不同的层级层次。

C.        维护成本:由于这种映射比较直接,也易于了解,模式的改进也相应较为直接、容易。

D.       查询:由于映射需要访问多个表来获取一个对象实例的数据
模式:One Inheritance Path One Table

方法:将每个类的属性映射到不同的表中。并在表中加入该类的父类的所有属性。

结论:

A.        虚类:注意虚类不要映射到表。

B.        所占空间:这种映射提供了最佳的空间占用。没有任何的冗余属性,甚至连额外的synthetic OID都没有。

C.        维护成本:增加或删除父类的属性将会导致对所有子类的表结构的修改。

D.       查询:查询比较相对来说比较容易


模式:Objects in BLOBs

方法:表包括两个字段:一个是synthetic OID,另一个是变长的BLOB,后者囊括了一个对象内的所有数据。使用流把对象的数据存放到BLOB中。

注:

由于这种方式在关系型数据库中用的不够多,如果用这种方式部分也就失去了关系型数据库的意义,这里不再讨论。


 

关联映射模式:

对于关联关系的对象,主要包括两种类型,一种是1对多,一种是多对多。下面将分别阐述每种类型的关系映射。

模式:Foreign Key Association

方法:该模式展示了怎样把对象间1:m的关系映射到关系型数据库表中。在依赖对象的表中插入所属对象的OID。这个OID可以是数据库的关键字或一个Synthetic Object Identity。

结论:

A.        所占空间:除了在依赖对象表中需要的外键字段以外,没有冗余的字段。

B.        维护成本:较低

C.        查询:相对简单


模式Association Table

方法:该模式展示了怎样把对象间n:m的关系映射到关系型数据库表中。创建一张单独的表,来存放两种对象类型的关系中的对象标志(或外键)。其它的对象类型到表的映射可以使用另外适当的模式来处理。

结论:

A.        所占空间:增加了一张新表,占用了一定的存储空间,但是这是解决多对多问题的较好的方式。

B.        维护成本:较低

C.        查询:相对简单


 

聚合映射模式:

模式:Single Table Aggregation

方法:把被聚合对象的属性和使用聚合对象的属性放在同一张表中。

结论:

A.        性能:在性能方面,该方案是最佳的,因为只需要访问一张表就能够获取一个带聚合的对象,并读入所有聚合对象。另一方面,由于聚合对象的字段的增多,一次读取将会增大数据库读入的页面数,导致IO带宽的浪费。

B.        维护成本:如果聚合的对象类型被多个对象所引用,那么将会降低可维护性,因为每一次对聚合对象类型的修改都会导致对所有引用聚合对象的修改。


模式:Foreign Key Aggregation

方法:为聚合类型使用单独的表。在表中插入Synthetic Object Identity,并使用使用聚合对象表中的对象标记做一个外键,连接到聚合对象。AggregatingObject(使用聚合对象)映射到一张表,而AggregatedObject(聚合对象)映射到另一张表。聚合对象的表中包含了Synthetic Object Identity。SyntheticOID字段被使用聚合表中的AggregatedObjectsOID外键字段引用。

结论:

A.        性能:Foreign Key Aggregation需要连接操作或至少两次的数据库访问,而Single Table Aggregation只需要一次的数据库操作。如果访问聚合对象的概率较小,这个性能还是可以接受的,如果聚合对象总是需要和使用聚合对象一同返回,那么就需要慎重的思考性能问题了。

B.        可维护性:将对象做分解,例如单独存放AddressType,这将使得维护更加容易,并提高映射的灵活性。


到这里我们将映射模式的准则叙述完毕,下面用一张图来进行总结如下:

各映射模式的对比情况:
 

面向对象的数据库设计

在这里我们将对面向对象的数据库设计做个说明,因为采用了面向对象的分析设计方法后,这一步和前面的对象关系映射有着密切的联系,其实这一步就是由上面的分析到实现的一个过程。这里主要是阐明面向对象的数据库设计和传统设计的区别和意义。

一般数据库设计方法有两种,即属性主导型和实体主导型。属性主导型从归纳数据库应用的属性出发,在归并属性集合(实体)时维持属性间的函数依赖关系。实体主导型则先从寻找对数据库应用有意义的实体入手,然后通过定义属性来定义实体。

平时我们作的基本属于属性主导型的设计,而通过上面的OR-Mapping后,轻松实现了以实体主导型的面向对象的数据库设计。

从某种意义上讲,是数据库设计的面向对象特征最终奠定了整个系统的面向对象性,其效果归纳如下:

1、数据库结构清晰,便于实现 OOP

由于实现了应用模块对象对数据库对象的完全映射,数据库逻辑模型可以自然且直接地模拟现实世界的实体关系。用户所处的当前物理世界、系统开发者所抽象的系统外部功能,与支持系统功能的内部数据库 (数据结构)一一对应,所以用户、开发者和数据库维护人员可以用一致的语言进行沟通。特别是对多数不了解业务的程序开发人员来说,这种将应用对象与相应的数据对象封装在对象统一体中的设计方法,大大减轻了程序实现的难度,使他们只要知道加工的数据及所需的操作即可,而且应用程序大多雷同,可以多处继承由设计人员抽象出来的、预先开发好的各种物理级超类。

2、数据库对象具有独立性,便于维护

除了数据库表对象与应用模块对象一一对应外,在逻辑对象模型中我们没有设计多重继承的泛化关系,所以这样得到的数据库结构基本上是由父表类和子表类构成的树型层次结构,表类间很少有继承以外的复杂关系,是一个符合局部化原则的结构,从而使数据库表数据破坏的影响控制在局部范围且便于修复,给系统开通后的数据库日常维护工作带来便利。

3、需求变更时程序与数据库重用率高,修改少

在映射应用对象时,除关系映射规范化后可能出现一对多的表映射外,大多数应用对象与表对象是一一对应的。我们可以把规范化处理后的、由一个应用对象映射出来的多个表看成一个数据库对象。因此当部分应用需求变更时,首先,系统修改可以不涉及需求不变更的部分。其次,变更部分的修改可以基本上只限于追加或删除程序模块或追加新库表,而基本上不必修改原有程序代码或原有库表定义,从而大大减少了工作量,降低了工作难度。

RTE知识总结 在开头,写一点自己学习的心得体会。学习的过程中切忌东一榔头,西一棒子。知识都是成体系的,像一课参天大树一样,我们学习之前首先要做的就是找到这个大树的树干部分,在学习完树干部分之后,再进行查补和扩展。所以我打算以老灰老师的专栏作为我学习的主干,后边再进行添砖加瓦,之后会将学习的一些问题和见解写成文章,以供参考,还请诸佬不吝赐教。 阅读详情

相关推荐

简单的OR-Mapping 工具---不差托作者

NULL 博文链接:https://erbin.iteye.com/blog/367375

什么是OR Mapping

对象-关系映射(ORM, 即 Object-Relation Mapping)模式指的是在单个组件中负责所有实体域对象的持久化,封装数据访问细节。ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象-关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库层之间充当桥梁。 ORM解决的主要问题就是对象-关系的映射。域模型和关系模型都分别建立在概念模型的基础上。

ttwwok的专栏 2827

谷歌Gemini模型免费API调用全攻略:从注册到实战(附代码示例)

本文详细介绍了如何免费调用谷歌Gemini模型的API,从注册获取API密钥到实战应用的全过程。内容涵盖环境准备、基础API调用、多模态处理、高级功能及生产环境实践,帮助开发者高效利用Gemini模型进行代码生成和复杂任务处理。附有代码示例,适合AI开发者和技术爱好者。

weixin_29212429的博客 1601

OR Mapping 的原理

OR-Mapping是面向对象分析设计的产物,主要解决对象层次的映射、对象关系的映射以及对象的持久化问题,也是分层设计要解决的问题之一。OR-Mapping会给程序设计带来那些好处呢?在面向对象的分层设计的系统体系中,上层的程序执行最终结果都是要操作数据库,而数据库是关系型,不是面向对象的,正是通过对象关系的映射,使我们实现了只对上层对象的操作实现对表的操作,感觉好象没有数据库的存在,上层只管面向

SpringFileld的专栏 4705

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络连续像素级与估计

Transformer-Based Attention Networks for Continuous Pixel-Wise Prediction 基于Transformer注意力网络的连续的像素级的

MengYa_Dream的博客 4716

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

面试问题: 什么是ORMapping... 最朴素的说法!!

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持...

phubing 1541

别再为数码管引脚发愁了!用STM32的普通IO口驱动TM1650数码管模块(附完整模拟I2C代码)

本文详细介绍了如何利用STM32的普通IO口通过模拟I2C协议驱动TM1650数码管模块,提供了完整的硬件连接方案和软件实现代码。通过模拟I2C技术,开发者可以灵活使用任意GPIO引脚控制多位数码管显示,解决了传统驱动方式占用大量IO资源的问题。文章包含TM1650寄存器解析、亮度控制等实用功能实现,并分享了常见问题排查与性能优化技巧。

weixin_30764771的博客 658

ElasticSearch学习心得

ElasticSearch简介 1.1、Elasticsearch Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 特点: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎--做不规则查询 可以扩展到上百台服务器,处理...

魔法革1996 911

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3889

『杭电1199』Color the Ball

Problem Description There are infinite balls in a line (numbered 1 2 3 ....), and initially all of them are paint black. Now Jim use a brush paint the balls, every time give two integers a b and follow by a char 'w' or 'b', 'w' denotes the ball from a to

漠宸离若的博客 497

java项目开发心得_Java开发学习心得(三):项目结构

3 项目结构经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构下面以两个项目结构为参照图1图2第一个是我自己学习时的Demo,一边学一边建文件,应该有些错误的地方,第二张是从网上看到的一个结构比较清晰的图片图1的结构完整一点,就以图1为主一点点讲起3.1 src因为我用的是Maven,大方向上项目两大...

weixin_33370255的博客 1017

X电容与Y电容,看这一篇就够了

本文详细介绍了X电容与Y电容的定义、作用、位置、分类,以及它们在实际应用中的容值选取和计算方法。通过汽车电子应用和X电容放电电路的实例,帮助读者深入理解这两种安规电容的重要性。文章还探讨了电容放电电阻的计算,确保符合安全规范。

让你爱上电路设计 7016

《深入浅出mfc》学习笔记

《深入浅出MFC》是本人一直想深读的一本书,在刚开始学VC时虽然也曾化一些时间来看,但总觉得收获不大,经过一段时间的程序设计实践,现在回过头来看这些东西,觉得有了不少收获,或许这正是我喜欢这本书的原因所在,越读越有味道,越读越觉得书中的东西能够弥补自己的缺憾,这样的才算是真正的得到了阅读的乐趣吧。下面摘抄一些原文,并总结了一些学习心得,权当作一点小小的学习收获吧,也希望在写作和阅读的过程中获得更多

small_sea的专栏 939

015:机载三维激光扫描技术相关知识

机载三维激光扫描系统(LiDAR)是集激光、GPS、INS等尖端技术于一体的三维航空遥感技术,能高效准确获取地表三维信息。该系统由GPS、INS、激光扫描测距系统、成像装置和工作平台组成,各部件协同工作以获取精确的空间定位、运动状态、地表三维坐标及真实色彩信息。通过制定飞行计划、安置GPS基站、激光扫描测量、惯性测量及获取高清数码影像等步骤,机载LiDAR技术能实时获取大范围高精度三维数据。该技术具有扫描速度快、精度高、全数字特征等优势,广泛应用于测绘、工程、环境监测和城市建设等领域,如城市三维模型重建、灾

qq_31762031的博客 1726

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

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

Django之ORM介绍

前言 最近由于对Python这一门编程语言产生想要继续深入学习的兴趣也好还是因为和别人一同参加比赛需要这方面的技术也好,都使得我在疫情期间坚持深入学习Python的更多知识。碰巧也是前几天涉及到了有关ORM的知识,想着用博客记录一下自己的学习心得与体会,并且也帮助正在学习相关知识的朋友们更好的理解什么是ORM。 ——————————————————————————————————— 引子 在正...

玄色i 的博客 369

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java面试八股文高频考点与实战排查指南

在Java技术栈的工程实践中,集合框架、并发机制与内存管理是衡量开发者基础功底的核心维度。理解HashMap底层数据结构与扩容策略、synchronized锁升级过程、JVM垃圾回收算法,不仅是应对技术面试的必备知识,更能帮助开发者在实际项目中规避性能陷阱与内存溢出风险。从基础语法到框架源码,从线程池参数配置到OOM现场排查,系统化梳理高频考点与常见报错的解决思路,能够显著提升面试沟通效率与代码排障能力。这份整理结合近年大厂真题与一线实战复盘,覆盖Java基础、集合、并发、JVM、数据库与中间件等核心板块,

weixin_30516429的博客 309

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

自定义ORMapping—动态生成SQL语句

概述        之前在自定义ORMapping——关系表转换为实体或实体集合对象中提到过ORMapping的东西,在那片博客中也有ORMapping实现的一个简单思路,当时只实现了关系表转换为实体或实体集合这个功能,没有实现动态生成SQL这个部分,本片博客就是完善之前的那片博客,实现动态生成SQL语句这么一个功能。 实现思路        1、创建两个自定义特性,分别为表特性和字

张青山 2659

O/R Mapping 对象关系映射

ORM(Object-Relational Mapping)是一种将对象模型和关系型数据库之间的映射关系进行自动化转换的技术。ORM 的目标是将对象模型和关系型数据库之间的转换过程自动化,使开发人员可以使用面向对象的方式来操作数据库,从而提高开发效率和代码质量。对象和关系之间的映射关系定义。数据库操作的自动化,包括 CRUD 操作、事务管理等。

Hanhahahahah的博客 557

什么是ORMapping?

**ORM ????*对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),用于实现面向对象编程语言里不同类型系统的数据之间的转换。 O(面向对象) <-----> ORMapping <-----> R(面向关系) 在数据库层面, 尤其是关系型数据库. 是没有对象概念的. 有的只是表格, 和数据记录 想象一下, 如果你在某个视频网站, 为某个视频写了一条评论 接下来会发生什么呢? 我们要更改用户表的记录, 增加

sdasadasds的博客 378

MyBatis开发框架

MyBatis是继Hibernate开发框架之后使用为广泛的实体层开发技术,在Java软件开发中开始占据着越来越重要的地位,同时也是广大的互联网公司使用多的开发框架。本课程将为读者完整的讲解MyBatis开发技术。官方QQ群:612148723。

上一篇: JSP文件操作大全
zhoubin_java
博客等级 码龄22年 2粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值