克服J2SE 1.3 ~ 1.4不兼容问题

J2SE1.4.2_02 for windows 立即下载
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 概要 如果你要实现JavaAPI中的一个,那么可能是件比较痛苦的事情。你经常会需要实现许多交叉依赖的接口。对新特性的需求促成了升级现有的JavaAPI,这就造成了提供这些API的供应商对他们的相关实现不断的升级以维持相关功能。随着这些API的升级更改越来越频繁,API代码的不兼容使你不得不分别维护新旧版本的代码库。这直接到导致了你维护成本和难度的增加。本文演示了解决此问题的技术,揭示了如何仅使用一个代码库编译不同JavaAPI版本的代码。 -------------------------------------------------------------------------------- 现在非常多的API被加入到到Java的标准库中,比如JDBC。这样做的好处是,Java可选包在部署时不必被绑定到相关的部署应用中去。这些API由专门的专业开发小组实现,在实际的使用当中这些API变得越来越受欢迎,使用的深度及广度也在不断的增加。但是有时候对一些API升级会变得使一些类及方法不可用。开发小组宁愿让这些API包成为可选组件而不是作为Java标准支持库的形式来发布。但是一旦加入标准库中的API包,就像是和用户签定了终生契约,想再成为可选包是不可能的。所以作为用户的你,可能会突然发现你一下子自己的代码库变成了不兼容的2个代码库,一个是使用新API的代码库,另一个是使用旧API的代码库。你可能会以为情况不像你想象的那样糟糕。我这里举一个简单的例子。J2SE1.4中由于对JDBC中的一些API的升级使的java.sql.Connection 不能同时被1.3 及 1.4 版本编译通过。你可能会遇到我这样的困境:我可能需要实现java.sql.Connection这个接口,但是我的代码需要同时通过1.3 及1.4 得编译。但是我不想同时维护2个版本的代码库。所以我开始寻找更好的解决方法。 如果你依赖于javac来编译你的应用的话,那么很不幸,Java著名的一次编写,到处运行(WORA)并不包括WOCA(一次编写,到处编译^_^;)。 不过别太沮丧,编码的反射技巧以及编译的Ant技巧是你能够安然过关。我能够仅仅使用一组Java文件以及Ant工具,就能使一个版本同时编译 在1.3 和1.4 版本下面。别急,在我结识解决办法之前,让我先详细的解释一下问题的描述。 可怜人的连接池(PS:Poor man's connection pool ,很有意思的一句话) 两年前,我的公司需要一个连接池,但是又不肯出钱买一个。当时并没有什么免费的东东可以使用,所以我们自己写了一个连接池。为了能更好的跟踪在整个应用中连接的情况,我们写了一个com.icentris.sql.ConnectionWrapper类,它实现了java.sql.Connection 接口以及其他的一些包装类(实现了另外的一些的java.sql 接口)。这些包装类仅仅是跟踪我们应用中的数据库使用,以及通过方法调用真正的 数据库资源。 当J2SE1.4来的时候,我们自然而然的想到升级我们提供给客户的应用,使这些应用的性能得到很多提升。当然,我们也需要保留1.3版本,因为有些客户根本不需要升级到1.4。我们气恼的发现,如果我们不修改,我们的ConnectionWrapper 以及其他JDBC封装类根本通不过J2SE1.4的编译。 为了文章的简明,我通过使用ConnectionWrapper 这个类来演示我对所有其他不能够通过J2SE1.4的类所使用的技术。如果我按照新的API标准,那么我不得不添加几个方法到ConnectionWrapper中去,接下来2个大问题摆在了面前: 1.因为我的包装类需要经历方法调用,我将不得不调用在J2SE1.3 sql类中并不存在的方法。 2.因为一些新的方法涉及到一些新出现的类,我将不得不在编译中面对那些在J2SE1.3中并不存在的类。 反射提供了援助 一些代码可以很方便的解释第一个问题。但是我的ConnectionWrapper 封装了java.sql.Connection , 所有的我的例子 依赖于在构造方法中的变量 realConnection : private java.sql.Connection realConnection = null; public ConnectionWrapper(java.sql.Connection connection) { realConnection = connection; } 为了看清楚我怎么做到解决版本不兼容问题,让我们仔细看一下setHoldability(int)(这个在J2SE1.4被声明的新方法) public void setHoldability(int holdability) throws SQLException { realConnection.setHoldability( holdability ); } 很不幸,这个方法在J2SE1.3中显然通不过编译,这就陷入了2难的尴尬境地。为了解决这一情况,我假定setHoldability() 将只会在J2SE1.4 下面被调用,所以我使用了反射机制来调用该方法。 public void setHoldability(int holdability) throws SQLException { Class[] argTypes = new Class[] { Integer.TYPE }; Object[] args = new Object[] {new Integer(holdability)}; callJava14Method("setHoldability", realConnection, argTypes, args); } public static Object callJava14Method(String methodName, Object instance, Class[] argTypes, Object[] args) throws SQLException { try { Method method = instance.getClass().getMethod(methodName, argTypes); return method.invoke(instance, args ); } catch (NoSuchMethodException e) { e.printStackTrace(); throw new SQLException("Error Invoking method (" methodName "): " e); } catch (IllegalAccessException e) { e.printStackTrace(); throw new SQLException("Error Invoking method (" methodName "): " e); } catch (InvocationTargetException e) { e.printStackTrace(); throw new SQLException("Error Invoking method (" methodName "): " e); } } 现在我有了setHoldability() 方法,因此能顺利通过J2SE1.4的编译。原理是我并不直接调用J2SE1.3中间java.sql.Connection并不存在的方法, 而是转为通过让setHoldability调用callJava14Method这个通用方法来调用,然后在一个SQLException 里封装所有的异常。这样就达到我预期的效果。 现在所有的在J2SE1.4中新方法都工作的很好,在J2SE1.3的老版本下也能顺利编译而且工作正常。现在我来着手解决第二个问题。 就是如何在应用中能够找到一个方法能够使用J2SE1.3中并不存在的新的类。 Ant 是答案 在J2SE1.4中,java.sql.Connection 依赖于一个新的类java.sql.Savepoint。因为这个类在java.sql 包中,所以你不可能把它加入到J2SE1.3中去。Java不允许任何的第三方扩展包加入它的核心包(java.* 以及 javax.* )中去。 因此挑战来了,在J2SE1.4下调用这个新的java.sql.Savepoint 类,但同时需要代码能够在J2SE1.3下面得到编译以及能够运行。很简单,不是吗?所有回答"Yes"的人都会得到一个榛仁巧克力饼(PS:哈哈,我回答了,可是没有:P)。至少现在我找到了答案,使问题变得很简单了。 首先我插入了下面一条有条件的import语句 // Comment_next_line_to_compile_with_Java_1.3 import java.sql.Savepoint; 然后我找到了一个能够在J2SE1.3下面注释掉import的方法。非常简单,使用如下Ant 语句就可以了: <replace> <replacetoken>Comment_next_line_for_Java_1.3 </replacetoken> <replacevalue>Comment_next_line_for_Java_1.3 //</replacevalue> </replace> 这个Ant 的 replace 标签 有好几个标签选项,在以后我给出的全部例子里有很多。在这里面最重要的是使用<replacevalue>来替换<replacetoken> 。 在XML里面的意思是换行。在J2SE1.4下,没什么会发生, 但是在J2SE1.3下面一个import声明被注释掉了。 // Comment_next_line_to_compile_with_Java_1.3 //import java.sql.Savepoint; 但是我在代码中Savepoint仍在使用public Savepoint setSavepoint(String name) throws SQLException { . . .}。不过我只在J2SE1.4使用这些方法类,在J2SE1.3中只要能编译就可以了。我发现只要我有一个我自己的Savepoint 类在我的包中,我的代码就能够通过编译,而且不用任何的import包。但是我又要同时在这条import 语句不被注释的同时我自己的Savepoint类被忽略掉。因此我造了一个空的com.icentris.sql.Savepoint类,这个可能(除了JavaDoc)是最短的有效类: package com.icentris.sql; /** Dummy class to allow ConnectionWrapper to implement java.sql.Connection * and still compile under J2SE 1.3 and J2SE 1.4. When compiled * under J2SE 1.3, this class compiles as a placeholder instead of the * missing java.sql.Savepoint (not in J2SE 1.3). When compiled * under J2SE 1.4, this class is ignored and ConnectionWrapper uses the * java.sql.Savepoint that is new in J2SE 1.4. */ public class Savepoint {} 在J2SE1.4下我能够正确的import java.sql.Savepoint类,而在J2SE1.3下面Ant注释了这条import语句。因此这个Savepoint就被替换成了我这个包里面写的一个空的Savepoint类。所以我现在就能加入任何引用到Savepoint类的方法,同样的在这些新方法中使用刚才所说的反射方法。 // Comment_next_line_to_compile_with_Java_1.3 import java.sql.Savepoint; . . . public Savepoint setSavepoint() throws SQLException { Class[] argTypes = new Class[0]; Object[] args = new Object[0]; return (Savepoint) callJava14Method("setSavepoint", realConnection, argTypes, args); } public Savepoint setSavepoint(String name) throws SQLException { Class[] argTypes = new Class[] { String.class }; Object[] args = new Object[] { name }; return (Savepoint) callJava14Method("setSavepoint", realConnection, argTypes, args); } public void rollback(Savepoint savepoint) throws SQLException { Class[] argTypes = new Class[] { Savepoint.class }; Object[] args = new Object[] { savepoint }; callJava14Method("rollback", realConnection, argTypes, args); } public void releaseSavepoint(Savepoint savepoint) throws SQLException { Class[] argTypes = new Class[] { Savepoint.class }; Object[] args = new Object[] { savepoint }; callJava14Method("releaseSavepoint", realConnection, argTypes, args); } 现在我所要做的就是能够使Ant 识别 J2SE1.3版,然后能够使这条import 语句被注释掉。 <target name="compile"> <antcall target="undoJava13Tweaks" /> <antcall target="doJava13Tweaks" /> <javac srcdir="src" destdir="WEB-INF/classes" debug="on"> <classpath> <fileset dir="WEB-INF/lib"> <include name="*.jar"/> </fileset> </classpath> </javac> <antcall target="undoJava13Tweaks" /> </target> <target description="Find out if we're being compiled on Java 1.3" name="isJava13"> <echo message="java.specification.version=[${java.specification.version}]"/> <condition property="isJava13"> <equals arg1="${java.specification.version}" arg2="1.3" /> </condition> </target> <target description="There are a couple tweaks I have to do to compile under Java 1.3" name="doJava13Tweaks" depends="isJava13" if="isJava13"> <echo message="This is Java 1.3, doing Tweaks!" /> <replace dir="src/com/icentris/" summary="true"> <include name="sql/ConnectionWrapper.java" /> <replacetoken>Comment_next_line_for_Java_1.3 </replacetoken> <replacevalue>Comment_next_line_for_Java_1.3 //</replacevalue> </replace> </target> <target description="Let's undo Java 1.3 tweaks" name="undoJava13Tweaks"> <replace dir="src/com/icentris/" summary="true"> <include name="sql/ConnectionWrapper.java" /> <replacetoken>Comment_next_line_for_Java_1.3 //</replacetoken> <replacevalue>Comment_next_line_for_Java_1.3 </replacevalue> </replace> </target> 注意编译目标在调用doJava13Tweaks的前后都调用了undoJava13Tweaks。如果万一javac编译失败的话,我们可以恢复以前的编译版本。 你没有必要同时维护2个应用实现 对于Java来说,新的API升级所带来的新的方法以及新的类/接口并不是新鲜事。一般而言,加入的新方法以及新的类的同时,会考虑到向上兼容的问题来照顾老API用户。但是当升级的API属于Java核心包内时,就会很麻烦。因为Java不允许对这些核心包的任何的外在更改或者是增加。通常这会引起针对不同版本API而维护不同版本代码树的需要。但是,就像上面的例子所演示的那样,你只要维护一棵代码树就能够在不同的版本的API下,编译运行。这个反射的API允许你调用并不存在的方法,而Ant能通过识别不同的Java编译版本而对相应的import包进行调整。虽然上面的所举的例子仅仅是一个简单的演示,但是在实际工作当中,利用这些简单的技术,解决了许多J2SE1.4和J2SE1.3的版本问题。我相信通过这些技术,你可以在频繁的Java版本升级中不必为同时维护两棵代码库而烦恼。 -------------------------------------------------------------------------------- 关于作者: Sam Mefford是iCentris的首席架构设计师。对于系统的兼容性重视程度,Sam Mefford是放在第一位的。他带领的团队致力于使用一个代码库 向众多的客户公司提供应用发布方案。这些部署方案使用的应用服务器有Tomcat,Weblogic, Resin, Orion以及 Websphere;在数据库方面有 Oracle,PostgreSQL, MySQL,以及 Informix;以及多个Java运行期环境。 译者: SpikeWang (优快云 ID:hk2000c) 东华大学计算机系毕业,现在同济大学攻读软件工程硕士学位。致力于J2EE方面的企业级应用开发以及研究工作。 About Copyright: 原文章版权属于作者 Sam Mefford 译文版权属于译者及原文作者共同所有,欢迎转载,但要注上译者及原文作者。 -------------------------------------------------------------------------------- 参考资源: The API for java.sql.Connection (J2SE 1.3): http://java.sun.com/j2se/1.3/docs/api/java/sql/Connection.html The API for java.sql.Connection (J2SE 1.4): http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html The JDBC API: http://java.sun.com/products/jdbc/ Java Core Reflection参考概要: http://java.sun.com/j2se/1.3/docs/guide/reflection/spec/java-reflectionTOC.doc.html the Reflection API指南: http://java.sun.com/docs/books/tutorial/reflect/ The Javadoc (java.lang.reflect): http://java.sun.com/j2se/1.3/docs/api/java/lang/reflect/package-summary.html
三极管自激升压电路设计 - 从参数计算到实践验证 本文详细解析了三极管自激升压电路(焦耳小偷电路)的设计原理与实践方法。通过剖析自激振荡机制与三极管电流关系,指导读者完成从核心参数计算、关键元件选型到面包板搭建调试的全过程。文章重点阐述了如何利用电感、三极管等基础元件实现低压直流到高压的转换,是理解开关电源与电磁能量转换的绝佳实践项目。 阅读详情

相关推荐

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2176

用 Java 2 标准版本 (J2SE) 1.4 进行 Internet 安全编

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 525

GD32F303驱动WS2812B灯带:用TIMER+PWM+DMA解放CPU,实现流畅灯效(附完整代码)

本文详细介绍了基于GD32F303的TIMER+PWM+DMA全自动控制方案,用于高效驱动WS2812B灯带。通过硬件外设协同工作,该方案不仅解放了CPU资源,还能实现复杂的灯光效果,如渐变、流水等。文章提供了完整的代码实现和性能优化技巧,适合嵌入式开发者参考。

weixin_42561143的博客 381

j2se和j2ee

随着Internet网络的迅速发展,基于互联网的企业应用要求软件平台具有开放性、分布性和平台无关性。于是就相继出现了RPC/COM/CORBA等技术,但这些技术在实际应用中存在着许多不足和局限。它们的特定协议难以通过防火墙,因而不适于Web上的应用开发。为了进一步开发基于Web的应用,出现了Sun公司的Sun ONE(Open Net Environment 开发网络环境)和Microsoft公司

fighter_hua的专栏 2243

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 146

STM32开发实战:从嵌入式系统到硬件控制 | 你必须得会

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1046

J2SE1.4的I/O新特性

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 512

嵌入式编程模型 | 原型模式

本文介绍了原型模式在嵌入式传感器网络中的应用。原型模式通过复制现有对象创建新实例,避免了重复初始化开销,适用于设备配置克隆、状态复制等场景。文章以传感器网络为例,展示了原型模式的结构(抽象原型类、具体原型类、客户端)和实现方式,通过C语言代码演示了温度/湿度传感器的克隆过程。该模式能有效提升嵌入式系统资源复用效率,实现快速部署相似配置的传感器节点,同时保持内存优化和配置灵活性。

嵌入式大杂烩 148

克服J2SE 1.3 ~ 1.4不兼容问题 (转)

克服J2SE 1.3 ~ 1.4不兼容问题 (转)[@more@]克服j2se 1.3 ~ 1.4不兼容问题--从反射api和ANT获得帮助 概要 如果你要实现JavaAPI中的一个,那么可能是件比较痛苦的事情...

csd3176的博客 193

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

使用GBIF获取生物多样性数据与GIS的结合

随着全球生物多样性的重要性日益凸显,越来越多的研究人员和保护机构开始利用地理信息系统(GIS)来分析和可视化生物多样性数据。GBIF(全球生物多样性信息设施)作为一个全球性的生物多样性数据库,提供了大量的物种分布和分类信息,为研究人员和保护工作者提供了宝贵的数据资源。本文将介绍如何使用GBIF API获取生物多样性数据,并将其与GIS技术相结合,以便更好地理解和研究生物多样性。利用GIS的强大功能,我们可以在地理空间上可视化物种分布、分析物种多样性的空间格局,并为保护生物多样性提供科学依据。

BnxBackend的博客 1765

克服J2SE 1.3 ~ 1.4不兼容问题--从反射API和ANT获得帮助

概要    如果你要实现JavaAPI中的一个,那么可能是件比较痛苦的事情。你经常会需要实现许多交叉依赖的接口。对新特性的需求促成了升级现有的JavaAPI,这就造成了提供这些API的供应商对他们的相关实现不断的升级以维持相关功能。随着这些API的升级更改越来越频繁,API代码的不兼容使你不得不分别维护新旧版本的代码库。这直接到导致了你维护成本和难度的增加。本文演示了解决此问题的技术,揭示了如何仅

求鱼不如求渔的专栏 903

Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)

Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。

大模型大数据攻城狮的专栏 2534

克服J2SE 1.3-1.4 的不兼容性

 概要     实现Java 众多API中的一个是一件困难的工作。你必须经常实现许多相互依赖的接口。对新特征的需求促进了最新Java API的创建,投资商们必须不断的更新他们的实现以跟上时代的需要。当复杂性和持续修改可以理解甚至被看好时, API 版本的不兼容性迫使你为更新的版本保留独立的代码库,从而N次方增加你的受挫等级。本文演示了如何克服接口版本的不兼容性,制作可为多个API版本编译的代码库的

JAVA|J2EE|J2ME|JDK|JSP 529

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2017—8年阿里JAVA大神,教你如何正确的学习JAVA(新手必看)

学习步骤和学习流程图都有,只要好好的跟着这个步骤学习,年入10W都不是梦。首先:java基础很重要的,选一本好的java书,好好的学习钻研,然后还是继续学了,主要的步骤就是:1:J2SE面向对象-封装、继承、多态、内存的分析、递归、集合类、泛型、自动打包与解包、Annotation、IO 、多线程、线程同步 、TCP/UDP 、AWT、事件模型、匿名类、正则表达式、反射机制。2:数据库(Oracl...

weixin_41780944的博客 3240

数学建模模型总结

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

克服J2ME开发中的困难之硬件设备

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 512

值得学习的经验

那么关于JAVA的学习路径问题,虽然现在是WEB为王,但不应该放松J2SE的学习,即便要用SSH,也要从基础开始: 1、Thinking In Java,打下良好的J2SE基础 2、sun官方的Java EE Tutorial,第15章之前重点看,15章之后有选择的看 3、如果学Struts,就看Struts User Guide , 4、如果学Spring,就学Spring Reference

265

HTTP 1.1与HTTP 1.0的比较

http://blog.csdn.net/elifefly/article/details/3964766  HTTP 1.1与HTTP 1.0的比较 分类: 1.1J2se 2009-03-06 23:27 13410人阅读 评论(0) 收藏 举报 服务器浏览器文档web服务数据库连接池authorization   HTTP 1.1与HTTP 1.0的比较 一个WEB站点每

诺尔曼 390

老兵学Java编程(1):从头再来

引言         老兵学编程,秉承“活到老、学到老”的信念,无奈“人有惰性”的弱点,反反复复“拿起书看上几页,放下书混过几年”,总是没能真正掌握和运用这门技术,而Java已发展到版本7,Sun都已被Oracle收购。          这次又痛下决心来学习Java,但愿不象以前那样轻易放弃,希望在学习上走得更远些,为此不求速度但求持久,采用读书笔记来记录学习体会和进度,属菜鸟级且纯粹给自己

老兵的自主空间 3181

用EJB3.0 简化EJB开发

        引入 Enterprise JavaBeans ( EJB ) 是为了构建分布式组件。最初 , 该技术承诺可以解决 CORBA 的所有问题并降低其复杂性。作为J2EE的核心,EJB经历了几次较大的修订,并加入了许多特性,因而变得臃肿起来。从一开始,大部分开发人员就非常钟爱EJB,甚至在没有任何意义的情况下也在其应用程序中使用EJB。当项目不能正常扩展,又在使用EJB时,很多开发人员

newhappy的专栏 3524

More.Java.Pitfalls中文版

More.Java.Pitfalls中文版本书通过分析和探究Java编程中的问题,总结出高效的解决方案,帮助Java程序员克服实际编程工作中的“陷阱”。全书分为3个部分,50个Items。第一部分“客户层”(22个Items)涵盖了J2ME和J2SE,讨论了在开发网络和独立客户应用程序时可能遇到的陷阱。第二部分“Web层”(14个Items)探讨了运行于Web容器内部的组件的陷阱。第三部分“企业层...

boox 195

学习day3

Java帝国的诞生 一场旷日持久的战争 C&C++ 1972年C诞生 贴近硬件,运行极快,效率极高 操作系统,编译器,数据库,网络系统等 指针和内存管理 1982年C++诞生 面向对象 兼容C 图形领域 游戏等 反抗 建立一个新的语言: 语言有点像C 没有指针 没有内存管理 真正的可移植性,编写一次,到处运行 面向对象 类型安全 高质量的类库 Java初生 1995年的网页简单而粗糙,缺乏互动性 图形界面的程序(Applet) Java2标准版(J2SE):去占领桌面 Java2标准版

weixin_44644260的博客 77

Java:一个帝国的诞生

C语言 帝国的统治现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了。 1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美到欧洲, 从欧洲到亚洲, 无数程序员臣服在他的脚下。 帝国给我们提供了极好的福利:贴近硬件, 运行极快, 效率极高。 使用这些福利, 程序员们用C 开发了很多系统级软件,操作系统, 编译器, 数据库,网络系统..... 但是帝国也给我们安上了两个沉重的枷锁: 指针和内存管理虽然指针无比强大, 能直接操作内存, 但是帝国却没有给我们

zangbin9495的博客 228

More Java Pitfalls中文版

内 容 提 要 本书通过分析和探究Java编程中的问题,总结出高效的解决方案,帮助Java程序员克服实际编程工作中的“陷阱”。 全书分为3个部分,50个Items。第一部分“客户层”(22个Items)涵盖了J2ME和J2SE,讨论了在开发网络和独立客户应用程序时可能遇到的陷阱。第二部分“Web层”(14个Items)探讨了运行于Web容器内部的组件的陷阱。第三部分“企业层”(14个Ite...

Mexican的博客 169

Java路径问题最终解决方案-转载

ava路径问题最终解决方案 —可定位所有资源的相对路径寻址 前言 Java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决...

zhongrunfu的专栏 228
上一篇: Servlet及JSP中的多线程同步问题
下一篇: Sun开发的JINI技术在网络中的应用
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值