《Java编程思想》(第4版)学习总结

java编程思想第四版电子书,,终于有人把Java程序员必学知识点全整理出来了 据统计,人的阅读时间在20分钟以内是能够达到全身心投入的,顾文章单张篇幅以后会尽量缩短,但更新会尽量相应频繁一些。首先我们了解下计算机软件的发展历史,大概总结概括,分为c/s时代,web1.0时代和web2.0时代。**c/s时代:**富客户端方案。卖软件可赚钱。例如 qq、影音、游戏。**1.0时代:**主要是单向信息的发布,即信息门户—广大浏览器客户端 ,互联网内容是由少数编辑人员(或站长)定制的。表是三大门户,新浪/网易/搜狐。新浪以新闻+广告为主,网易拓展游戏为主,搜狐延伸门户矩阵。 阅读详情

        一次偶然的机会让我接触到了《Java编程思想》这本书,之前他们说是Thinking in Java 我当时并不知道,后来查资料的时候才知道是这本经典的书籍,于是就忍不住开始阅读了。开始感觉这本书讲解的东西不太理解,然后经过反复的思考才感觉有所收获,也许我对书中的知识理解有误差甚至误解,在这里也希望大家能批评指正,也欢迎大家补充,谢谢大家。

        下面就是我对每一章的学习总结:

                         第一章:对象导论

1.1、抽象过程(有了面向对象)

        面向对象程序设计方式:
  • 万物皆为对象
  • 程序是对象的集合,它们通过发送消息来告知彼此所要做的。具体的说,可以把消息想象为对某个特定的对象的方法的调用请求。
  • 每个对象都有自己的由其他对象所构成的存储。
  • 每个对象都拥有其类型。每个对象都是某个类(class)的实例(instance)。这里的“类”就是“类型”的同义词。
  • 某一特定类型的所有对象都可以接收同样的消息。比如几何图形的方法,可以被它的子类圆形来调用(即发送给“几何图形”对象消息)。

1.2、每个对象都有一个接口
        当一个类被创建的时候(类是描述了具有相同特性(数据元素)和行为(功能)的对象集合),就可以随心所欲的创建对象,但是我们创建对象应该要有实际意义才行,比如某个对象完成某件事情,而这件事情的具体动作就是接口。之前看到书上讲过接口其实是对动作的抽象,也就说明接口中的方法其实可以对应各个动作。

1.3、每个对象都提供服务
       可以将对象看成“服务员”,程序本身将向用户提供服务,它将通过调用其他对象的方法来实现用户需要的服务(功能)。

1.4、被隐藏的具体实现
        将程序开发人员按角色分为类创建者(那些创建新数据类型的程序员)和客户端程序员(那些在其他应用中使用数据类型的类消费者)是大有裨益的。
        类创建者提供给客户端程序员部分代码,其他的薄弱部分要隐藏起来,避免被别人修改从而减少程序bug。就好像我们在使用类库的时候调用别人的方法都是公共的,但是还有隐藏的,只是我们看不到而已。

1.5、复用具体实现
      
         一旦类被创建并被测试完,那么它就应该(在理想状况下)代表一个有用的代码单元。事实证明,这种复用性并不容易达到我们所希望的程度,产生一个可复用的对象设计需要丰富的经验和敏锐的洞察力。但一旦有了这样的设计就可供复用。代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
       最简单地复用某个类的方式就是直接使用该类的一个对象,此外也可以将那个类的对象置于某个新的类中。我们称其为“创建一个成员对象”。新类可以由任意数量、类型的其他对象以任意可以实现新的类中想要的功能的方式所组成。因为是在使用现有的类合成新的类,这种概念被称为组合。

1.6、继承

       在现实生活中当创建了一个类之后,即使另一个新类与其有相似的功能,你还得重新创建一个新类。如果我们能够以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类那就好多了。通过继承就可以达到这样的效果,不过需要注意的是,当源类(被称为基类、超类或父类)发生变动时,被修改的“副本”(被称为导出类、继承类或子类)也会反映出这些变动。
      有两种方法可以使基类与导出类产生差异:
  •  第一种方法很直接:直接在导出类中添加新方法,这些新方法并不是基类接口的一部分。这意味着基类不能直接满足你的所有要求,因此添加更多的方法。虽然这种方法有时候是一直完美的解决方式,但是,你应该仔细考虑基类是否要添加这些额外方法的可能性。
  • 第二种方法是改变现有基类的方法的行为,这被称之为覆盖。要想覆盖某个方法,可以直接在导出类中创建该方法的新定义即可,
      可以理解为:此时,我正在使用相同的接口方法,但是我想在新类型中做些不同的事情。
 
1.6.1、“是一个”与“像是一个”的关系
           因为继承有两种情况:
  • 导出类和基类是完全相同的类型,因为它们具有完全相同的接口。通常称之为替代原则。在某种意义上,这是一直处理继承的理想方式。这种情况的基类与导出类的关系称为is-a(是一个)的关系,例如,“一个圆形就是一个几何形状”。判断是否继承,就是要确定是否可以用is-a来描述类之间的关系,并使之具有实际意义。
  • 有时候到处类型中会添加新的接口元素(功能),这样也就扩展了接口。这个新类也可以代替基类,但这种代替不完美了,因为导出类有新的方法了,基类无法访问这些新方法。这种情况称之为is-like-a(像是一个)关系。  

1.7、伴随多态的可互换对象
       当我们添加新的子类时调用基类的方法时,它却能够正确执行不同的代码。例如,可以把三角形(导出类)看作是几何图形(基类),当我们在导出类中调用基类画图的方法的时候,却能正确的画出三角形。(补充:在编译器中是无法精确地了解哪一段代码将会被执行,所在这里涉及了一个后期绑定的概念,通过后期绑定则当向一个对象发送消息时,该对象知道对这条消息应该做些什么)。
例如一段程序代码:
void doSomething(Shape shape){
        //擦除
        shape.erase();  
       //绘制  
        shape.draw();
}

       这个方法可以与任何Shape对话,因此它是独立于任何它要绘制和擦除的对象具体类型的,如果程序中其他部分用到了doSomething()方法:
      Circle circle = new Circle();
      Line line = new Line();
      doSomething(circle);
      doSomething(line);

     对于doSomething()的调用会自动地正确处理,而不管对象的确切类型。

     以这行代码为例:
     doSomething(circle);
     当Circle被传入到预期接收Shape的方法中,由于Circle可以被doSomething()看作是Shape,也就是说,doSomething()可以发送给Shape的任何消息,Circle都可以接收,这么做是完全安全且符合逻辑的。

     把导出类看作是它的基类的过程是向上转型。通常基类在顶部,而导出类在其下部散开,因此,转型为一个基类就是在继承图中向上移动,即“向上转型”。

1.8、单根继承结构
       在OOP(面向对象)中,Java里边所有的类都继承自单一的基类,这个类的名字就是Object。
       在单根继承结构中的所以对象都具有一个公共接口,所以他们归根到底都是相同基本类型。所以这种结构保证所有对象都具备某些功能。因此在系统中你可以在每个对象上执行某些基本操作。所以对象都可以很容易的在堆上创建,而参数传递也得到极大的简化。
    单根继承结构使垃圾回收器的实现变得容易很多,因为所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。

1.9、容器(也称之为集合)
        通常说来,如果不知道在解决某个特定问题时需要多少个对象,或者他们将存活多久,那么就不可能知道如何存储这些对象。我们不知道需要多少空间来创建这些对象,因为这类信息只有在运行时才能获得。
        在OOP中都有一组容器,例如Java中就有List(用于存储序列),Map(也被称为关联数组,用来建立对象之间的关联),Set(每种对象类型只有一个,不能重复),以及诸如队列、树、堆栈等更多的构件。

  1.9.1、参数化类型
        容器存储的对象都只具有Java中的通用类型:Object。单根继承结构意味着所有的东西都是Object类型,所以可以存储Object的容器可以存储任何东西。这使得容器很容易被复用。
        因为容器只存储Object,所以当将对象引用置入容器时,它必须向上转型为Object,因此它会丢失其身份,当将它取回的时候却是对Object对象的引用,而不是最初置入的对象,因此这里就用到了转型,但这是向下转型为更具体的类型。我们知道向上转型是安全的,例如Circle是一种Shape类型,但不知道某个Object是Circle还是Shape,所以除非确切知道所要处理的对象类型,否则向下转型几乎是不安全的。
      向下转型并非彻底是危险的,因为如果向下转型为错误类型,就会得到被称为异常的运行时错误。
      因为这些原因,在Java中就出现泛型这个类型。一对尖括号,中间包含类型信息,通过这些特征就可以识别对泛型的使用。例如:
      ArrayList<Shape> shapes = new ArrayList<Shape>();
   
      从上面我们就可以了解到,其实在编程的过程中会大量的使用泛型。因为它给我们带来极大的便利。

1.10、对象的创建和生命期
       在使用对象的时候,最关键的问题之一便是它们的生成和销毁方式。每个对象为了生存都需要资源,尤其是内存,当我们不再需要一个对象的时候就必须清理掉,使其占有的资源可以被释放和重用。但是在实际开发过程中有的对象很难确定什么时候销毁,怎样控制对象生命周期是由程序员决定。
       第一种:为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值。但是也牺牲了灵活性,因为必须在编写程序时知道对象的确切数量、生命周期和类型。
      第二种:在被称为堆的内存池中动态的创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及具体类型只能在程序运行时相关代码被执行到那一刻才能确定。如果需要一个新对象,可以在需要的时候直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配空间,这可能要远远大于在堆栈中创建存储空间的时间。
      Java采用了动态内存分配方式。每当创建新对象时,就要使用new关键字来构建此对象的动态实例。对于对象生命周期,在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。如果是在堆上创建对象,编译器对它的生命周期一无所知。但是Java提供了“垃圾回收器”的机制,它可以自动发现对象何时不再被使用,并继而销毁它。

1.11、异常处理:处理错误
      自从编程语言问世以来,错误处理就始终是最困难的问题之一。Java的异常处理在众多编程语言中格外引人注目,因为Java一开始就内置了异常处理,而且强制你使用它。它是唯一可接受的错误报告方式。如果没有编写正确的处理异常的代码,那么就会得到一条编译时的出错消息。这种有保障的一致性有时会使错误处理非常容易。

1.12、并发编程
      在计算机编程中有一个基本概念,就是在同一时刻处理多个任务的思想。
      在程序中彼此独立运行的部分被称之为线程。通常线程只是一种为单一处理器分配执行时间的手段。但是如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,并且它们是在真正地并发执行。在语言级别上,多线程所带来的便利之一是程序员不用再操心机器上是有多个处理器还是只有一个处理器。由于程序在逻辑上分为线程,所以如果齐全拥有多个处理器,那么程序不需要特殊调整也能执行得更快。
      所以这些都使得并发看起来相当简单,但是有一个隐患:共享资源。如果有多个并行任务都要访问同一项资源,那么就会出问题。例如,两个进程不能同时想一台打印机发送信息。为了解决这个问题,可以共享的资源,必须在使用期间被锁定。因此,整个过程是:某个任务锁定某项资源,完成其任务,然后释放资源锁,使其他任务可以使用这项资源。


总结:
       这一章其实已经提到了很多的知识,但是并没有详细的解释,它主要是让我们在脑海里有一个印象。在编程中其实都是对现实中某些实物的抽象过程。每个事物我们可以看成一个对象,而这个对象都有自己的存在意义,也就是它能够干什么,具有什么功能,同时在生活中会有很多相似的东西,我们没必要去一一的重复,因此就有了复用这个概念。当我们在某个对象上有更多要求的时候可以新建一个去继承该对象的对象,然后扩展对应的接口。在Java中有一个特性:多态,例如,人类是一个基类,然后有一些接口,走、跳、跑等,然后在这个接口中传入一个“男人”的对象,那么这个男人就会具有上述的功能。然后进一步深入就是当我们创建对象之后要学会怎样去管理,和存储。所以也就有了容器、泛型、生命周期这些概念。在编程的时候难免会出现错误,在Java有异常处理的机制可以帮助我们更好的解决这个难题,另外为了提高效率所以会有并发这个概念。
      其实我对这章总结得比较简单,只是为了方便自己记忆罢了,里边提到的知识点,后面应该会详细阐述的。


Java编程思想中文版完整学习指南(第3版与第4版) 类由属性(成员变量)和方法组成。属性用于描述对象的状态,方法用于描述对象的行为。// 实例变量// 静态变量// 每创建一个对象,计数加1Java的垃圾回收(Garbage Collection,GC)机制自动管理内存,当对象不再被引用时,JVM会自动回收其占用的内存空间。本章从封装入手,介绍了如何通过访问控制和 Getter/Setter 方法实现数据隐藏与安全访问;随后深入讲解了继承机制,包括类的继承、方法重写与super关键字的使用;接着探讨了多态。 阅读详情

相关推荐

《Java编程思想》.pdf

《Java编程思想》

Java编程思想(第4版) 扫描版

禁止打广告禁止打广告。

qq_42429369的博客 1436

手把手教你用LDR9201芯片DIY高性能Type-C耳机转接头(附电路图)

本文详细介绍了基于LDR9201芯片DIY高性能Type-C耳机转接头的完整实战教程。从芯片选型、电路设计、元器件采购到焊接调试,手把手指导如何打造一个免驱兼容、支持高解析度音频且可通过EEPROM深度定制功能的专属转接头。重点解析了LDR9201作为高度集成的USB音频控制器SoC的优势,并提供了核心电路图与配置指南,适合电子爱好者和硬件开发者实践。

jump7的博客 355

《Java编程思想 第4版》

文章目录第一章 对象导论第二章 一切都是对象第三章 操作符 第一章 对象导论 Java对象是什么? 对象具有状态、行为和标识(地址),每个对象都能提供服务,将问题分解为对象集合。 Java类是什么? 类描述了具有相同特性(成员变量)和行为(方法)的对象集合,一个类实际上就是一个数据类型。 Java继承是什么? 以现有的类为基础,复制它,然后通过增加和修改这个副本来创建新的类。一个基类型包含其所有导出类型所共享的特性和行为。 Java多态是什么? 面向对象程序采用了后期绑定的概念,程序直到运行时才能确定

qq_42514129的博客 1174

innovus:如何在init design之后新增参考库(lib/lef)

如题,在PR过程中经常会遇到这种问题,时序无法收敛,需要新增一套lvt或者hpc的库,怎么办?

m0_61544122的博客 5001

瑞芯微RK3588部署YOLOv8模型

写下这篇博客进行记录,以防后面忘了怎么部署。

weixin_45303602的博客 3650

Java编程思想(第4版)pdf

下载地址:网盘下载内容简介编辑从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到、深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概念。本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究...

weixin_30861797的博客 1451

Unreal Engine开发:角色动画与状态机_动画混合:通过混合节点实现平滑动画过渡

动画混合是提升游戏动画质量的关键技术之一。Unreal Engine提供了多种混合节点,包括BlendSpace1D、Blend Two By Bool、Blend Two By Alpha和Sequencer,每种节点适用于不同的场景。通过合理使用这些节点,可以实现平滑、自然且高效的动画过渡效果。此外,遵循最佳实践和高级应用技巧,可以进一步优化动画质量和性能。希望本节内容对你在Unreal Engine中实现动画混合有所帮助,使你的游戏角色动作更加流畅和自然。

chenlz2007的博客 1243

《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long time = System.currentTimeMillis() - start;         目录 前言 简介 第1章 对象导论 1.1 ...

weixin_33875564的博客 2552

SAP 权限配置(复合角色)

复合角色创建步骤:业务场景:通常单一角色权限颗粒度划分比较细,当需要分配单一角色权限A、B(多个单一角色)给某账号用户Y时,可以先建立一个复合角色C,将A、B绑定到复合角色C中,再将角色C分配给账号Y即完成权限配置。 业务模拟: 1、PFCG创建复合角色: 2、在角色页面添加子角色 在角色分页内添加子角色,点击“菜单”分页中的“读菜单”即可导入子角色中的菜单: 3、将用户分配给...

willieyuan的博客 7085

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 176

java编程思想第4版初始学习

前言 1、看过这部分内容,首先我了解到作者通过和其他程序语言的比较强调了java程序设计对复杂性的优势。 2、 以作者原话,这本书的诞生是因为java语言的升级,“这本书基本可以称为‘只限javaSE5/6’”,而我现在使用的大多是javaSE7/8,会有些差别。 3、 作者还提到他内建的测试框架,该框架由Python编写。 4、作者还推荐了几款工具,UML工具:Spar...

moyu的博客 661

Exploring Automated Distractor Generation for Math Multiple-choice Questions via Large Language Mode

多项选择题(MCQ)在几乎所有级别的教育中都无处不在,因为它们易于管理、评分,并且是评估和实践中可靠的格式。MCQ最重要的方面之一是干扰因素,即旨在针对真实学生常见错误或误解的不正确选项。迄今为止,对于教师和学习内容设计师来说,制作高质量的干扰物的任务在很大程度上仍然是一个劳动和时间密集型的过程,其可扩展性有限。在这项工作中,我们研究了数学MCQ领域的自动干扰物生成任务,并探索了从上下文学习到微调的各种基于大型语言模型(LLM)的方法。

c_cpp_csharp的专栏 317

java编程思想4

java编程思想第4版

xzy8088的专栏 154

ThingsBoard教程(七):模拟设备遥测

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了六篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 上一篇我们讲解了如何使用设备管理来对设备进行增删改查,和设备配置的一些基本概念,本篇文章就带大

知无涯 4575

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

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

《Java编程思想》第4版第3章学习笔记

《Java编程思想》第4版 第3章 操作符 在最底层,Java中数据是通过使用操作符来操作的 3.1中提及了静态导入:就是导入类中的静态方法 import static java.lang.System.out //这里就是静态导入System类中的静态方法out。所以程序中可以使用: //说明类只有两种访问限制控制:包访问权限(如下);public class staticPrint{ p...

taxi1993的博客 240

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

《Java编程思想》第4版-第2章学习笔记

《Java编程思想》第4版学习笔记 第2章 存储到什么地方 寄存器:位于处理器内部,是最快的存储区域。 堆栈:位于RAM(随机访问储存器),速度仅次于寄存器。里面存储最重要的当属对象引用。Java必须知道存储在堆栈中所有对象的确切生命周期,以便上下移动堆栈指针。 堆:一种通用的内存池,也位于RAM。主要存储Java对象。 常量存储:常量值通常直接存放在程序代码内部。一般选择存放在ROM(只读储...

taxi1993的博客 243

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

二.一切都是对象——Java编程思想第4版学习笔记

2.1 用引用操纵对象 在Java中,一切都看作是对象,但操纵的标识符是对象的一个“引用”(reference)。拥有一个引用,并不一定需要有一个对象与它关联。如果想操纵一个词或句子,则可以创建一个String引用:String s; 比较安全的做法是创建一个引用的同时便进行初始化:String s = "asdf"; 2.2 必须由你创建所有对象 一旦创建了一个引用,就希望它能与一个新的对

Bonjour~ 509

一.Java对象导论——Java编程思想第4版学习笔记

1.1 抽象过程 所有编程语言都提供抽象机制,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。 Alan Kay曾经总结了面向对象语言的5个基本特性: 1)万物皆为对象。 2)程序是对象的集合,它们通过发送消息来告知彼此所要做的。 3)每个对象都有自己的由其他对象所构成的存储。 4)每个对象都拥有其类型。

Bonjour~ 969

Java 编程思想(第4版)学习笔记(LinkedList)

 jdk1.6帮助文档上LinkedList说明(LinkedList具有直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。不过,有时一个真正的栈更能把事情讲清楚。)push(v)=addFirst(v)peek(v)=getFirst()pop()=removeFirst()empty()=isEmpty() List 接口的链接列表实现。

方逸涛的专栏 701

三.操作符——Java编程思想第4版学习笔记

3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 3.4 赋值 对一个对象进行操作时,真正操作的是对对象的引用。所以倘若”将一个对象赋值给另一个对象“,实际上是将”引用“从一个地方复制到另一个地方。这种特殊的现象通常称作“别名现象”,是Java操作对象的一种基本方式, 3.4.1 方法调用中的别名问题 将一个对象传递给方法时,也会产生别名问题。 3.5 算术操作符

Bonjour~ 823

四.控制执行流程——Java编程思想第4版学习笔记

4.1 true和false 对于非布尔值a,不允许if(a),而要使用if(a!=0)。 4.2 if-else 4.3 迭代 while,do-while,for被划分为迭代语句。 Math库里的static(静态)方法random()的作用是产生0和1之间(包括0,但不包括1)的一个double值。 java.lang.Character.isLowerCase()检查字符是否为

Bonjour~ 569

JAVA 编程思想 第4版 学习笔记 - 第五章

第五章 初始化与清理5.1 用构造器确保初始化用构造器来替代初始化方法 initialize(),Java能够在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。在编写构造器之前,需要解决两个问题,1,所取得任何名字都可能与类的某个成员名称相冲突,2.调用构造器是编译器的责任,所以必须让编译器知道应该调用某个方法。解决方法如下,构造器采

kiddy1985的专栏 420

经典怀旧pdf: java编程思想3、4以及3、4的练习题答案下载

文件名称:ThinkinginJava3_4_answer.rar 大小:8.73 MB 内容:不用介绍了吧?直接看书皮儿吧.这里包括了中文版的java编程思想3,java编程思想4 的英文版,和3、4的习题全部答案 封皮: 下载地址: 下载 ...

222

【亲测免费】 Java编程思想 中文版 第4版

Java编程思想 中文版 第4版 去发现同类优质开源项目:https://gitcode.com/ 书籍简介 《Java编程思想(第4版)》是一本深受广大程序员喜爱的经典之作,以其深入浅出的讲解、丰富的实例和独到的见解,全面剖析了Java编程语言的核心概念和技术。此版本针对Java的最新迭代——JDK 5.0进行了全面更新,不仅涵盖了新的语言特性,还对原有的内容架构进行了精心调整。作者Bruce ...

gitblog_06647的博客 580
上一篇: APK反编译以及重新打包的详细步骤
下一篇: 第五章 初始化与清理(上)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值