《阿里巴巴 Java开发手册》读后感

《阿里巴巴 Java开发手册》读后感小结 主要介绍了《阿里巴巴 Java开发手册》读后感小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

前言

只有光头才能变强

前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦)。

趁着学校校运会,合理地给自己放了一个小长假,然后就回家了。回到家才发现当时618买了一堆书,这堆书还有没撕包装的呢…于是我翻出了最薄的一本《阿里巴巴 Java开发手册》

手册

这本书一共就90多页,一天就可以通读完了,看完之后我又来水博文了。

注意:

  • 书上很多的规范是可以用IDE来避免的,也有很多之前已经知道的了。
  • 所以,这篇文章只记录我认为比较重要,或者说是我之前开发时没有注意到的一些规范(知识点)。
  • 该文章的内容肯定没有书上写得那么全的,如果感兴趣的同学可以去买一本来读一下~

PDF官方地址:

一、Java相关

  1. POJO是DO/DTO/BO/VO的统称,禁止命名为xxxPOJO
  2. 获取多个对象的方法中list作为前缀
  3. 获取统计值的方法用count作为前缀
  4. POJO类中的布尔类型(Boolean)的变量都不要加is前缀,否则部分框架解析会引起序列化错误
    • 如果你的变量名带is的话,比如isActive,框架解析的时候可能就当成active了。
  5. 如果是形容能力的接口名称,取对应的形容词为接口名(通常是-able的形式)
  6. 不允许任何魔法值(未经预先定义的常量)直接出现在代码中
  7. Object的euqals方法容易抛出空指针异常,应使用常量或者有值的对象来调用equals。推荐使用java.util.Object#equals工具类
  8. 所有POJO类的属性全部使用包装数据类型,RPC的返回值和参数必须使用包装数据类型,所有的局部变量都使用基本数据类型。定义VO/DTO/DO等POJO类时,不要设定任何属性的默认值
    • 如果你的类属性使用int这样的基本数据类型,默认值是0。一般情况下该变量没有赋值,一般想表达的是不存在(null),而不是0。
  9. 构造方法禁止加入任何的业务逻辑,如果初始化逻辑可以放在init方法中。set/get方法也不要增加业务逻辑。
    • 如果set/get方法放入业务逻辑,有时候排查问题就变得很麻烦了
  10. 工具类Arrays.asList()把数组转成List时,不能使用其修改集合的相关方法。比如说add、clear、remove
  11. 在JDK7以及以上版本中,Comparator要满足三个条件,不然调用Arrays.sort()或者Collections.sort()会报异常。
    • x,y 的比较结果和 y,x 的比较结果相反
    • 传递性:x>y并且y>z,那么x一定大于z
    • 对称性:x=y,则 x,z 比较结果和y,z比较结果相同
  12. 使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历
    • keySet遍历了两次,一次是转成Iterator对象,一次是从hashMap中取出key所对应的value,如果JDK8可以使用Map.foreach方法
  13. 线程资源必须由线程池提供,不允许在应用中自行显示创建线程。线程池不允许用Executors创建,通过ThreadPoolExecutor的方式创建,这样的处理方式能够让编写代码的工程师更加明确线程池的运行规则,规避资源耗尽的风险。
  14. SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类
    • 如果是JDK8应用,可以使用Instant(针对时间统计等场景)代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat
  15. 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致性能下降
    • 在JDK7之后,可以直接使用API ThreadLocalRandom,而在JDK7 之前,需要编码保证每个线程持有一个实例。
  16. 类、类属性、类方法的注释必须使用 Javadoc 规范,使用 /**内容*/ 格式,不得使用 //xxx 方式
  17. 所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释,除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。所有的类都必须添加创建者和创建日期。
  18. 对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码的上方,使用三个斜杠///来说明注释代码的理由
  19. 保证单元测试的独立性。为了保证单元测试稳定可靠且便于维护,单元测试之间不能互相调用,也不能依赖执行的先后顺序。
  20. 高并发服务器建议调小TCP协议的time_await超时时间,调大最大事件句柄数(fd),

1.1值得说明的点

一、不允许任何魔法值(未经预先定义的常量)直接出现在代码中

例子:


    Negative example:
    //Magic values, except for predefined, are forbidden in coding.
    if (key.equals("关注公众号:Java3y")) {
        //...
    }

    Positive example:
    String KEY_PRE = "关注公众号:Java3y";
    if (KEY_PRE.equals(key)) {
        //...
    }

ps:我猜是把先常量定义出来,后续引用/修改的时候就很方便了。


二、Object的euqals方法容易抛出空指针异常,应使用常量或者有值的对象来调用equals。推荐使用java.util.Object#equals工具类

java.util.Object#equals的源码(已经判断null的情况了)


	public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

三、工具类Arrays.asList()把数组转成List时,不能使用其修改集合的相关方法。

因为返回的ArrayList是一个内部类,并没有实现集合的修改方法。后台的数据仍是数组,这里体现的是适配器模式。

ArrayList在这里是内部类


四、在JDK7以及以上版本中,Comparator要满足自反性,传递性,对称性,不然调用Arrays.sort()或者Collections.sort()会报异常。

The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y. (This implies that compare(x, y) must throw an exception if and only if compare(y, x) throws an exception.)

The implementor must also ensure that the relation is transitive: ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.

Finally, the implementor must ensure that compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z.

  • 1) x,y 的比较结果和 y,x 的比较结果相反。
  • 2) 传递性:x>y,y>z,则 x>z。
  • 3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。

反例:下例中没有处理相等的情况,实际使用中可能会出现异常:


new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() > o2.getId() ? 1 : -1;
    }
}

使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历

首先我们来看一下使用keySet是如何遍历HashMap的:


    public static void main(String[] args) throws InterruptedException {

        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("关注公众号:", "Java3y");
        hashMap.put("坚持原创", "Java3y");
        hashMap.put("点赞", "关注,转发,分享");


        // 得到keySet,遍历keySet得到所有的key
        Set<String> strings = hashMap.keySet();
        Iterator<String> iterator = strings.iterator();
        while (iterator.hasNext()) {

            // HashMap的每个key
            String key = iterator.next();

			// 通过key可以获得对应的value,如果有看过HashMap的同学知道get方法的时间复杂度是O(1)
            System.out.println("key = " + key + ", value = " + hashMap.get(key));
        }

    }



再来看一下源码:


// 1. 得到keySet,如果不存在,则创建
public Set<K> keySet() {
    Set<K> ks = keySet;
    if (ks == null) {
        ks = new KeySet();
        keySet = ks;
    }
    return ks;
}

// 2.初始化ks (实际上就是Set集合[HashMap的内部类],在初始化时需要顺便初始化iterator)
ks = new AbstractSet<K>() {
    public Iterator<K> iterator() {
        return new Iterator<K>() {
            private Iterator<Entry<K,V>> i = entrySet().iterator();

            public boolean hasNext() {
                return i.hasNext();
            }

            public K next() {
                return i.next().getKey();
            }

            public void remove() {
                i.remove();
            }
        };
    }

};




再来看一下entrySet,可以直接拿到key和value,不用再使用get方法来得到value,所以比keySet更加推荐使用!


    public static void main(String[] args) throws InterruptedException {

        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("关注公众号:", "Java3y");
        hashMap.put("坚持原创", "Java3y");
        hashMap.put("点赞", "关注,转发,分享");


        // 得到entrySet,遍历entrySet得到结果
        Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
        }
    }

如果是JDK8的话,推荐直接使用Map.forEach()就好了,我们也来看看用法:


public static void main(String[] args) throws InterruptedException {

    HashMap<String, String> hashMap = new HashMap<>();
    hashMap.put("关注公众号:", "Java3y");
    hashMap.put("坚持原创", "Java3y");
    hashMap.put("点赞", "关注,转发,分享");

    
    // forEach用法
    hashMap.forEach((key, value) -> System.out.println("key = " + key + ", value = " + value));
}

其实在源码里边我们可以发现,forEach实际上就是封装了entrySet,提供forEach给我们可以更加方便地遍历Map集合



	// forEach源码
    default void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);
        for (Map.Entry<K, V> entry : entrySet()) {
            K k;
            V v;
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch(IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            action.accept(k, v);
        }
    }

五、SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。

有以下的例子可以正确使用SimpleDateFormat:


// 1. 在方法内部使用,没有线程安全问题
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public String getFormat(Date date){
    SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
    return dateFormat.format(date);
}


// 2. 每次使用的时候加锁      
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void getFormat(){
    synchronized (SIMPLE_DATE_FORMAT){
    SIMPLE_DATE_FORMAT.format(new Date());
    ….;
}
        
// 3. 使用ThreadLocal,每个线程都有自己的SimpleDateFormat对象,互不干扰
private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd");
    }
};

// 4. 使用DateTimeFormatter(This class is immutable and thread-safe.)

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println(timeFormatter.format(LocalDateTime.now()));

如果是JDK8应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat。


二、数据库相关

  1. 表达是否概念的字段,必须使用isxxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)
  2. 小数类型用decimal,禁止使用float和double。
  3. varchar是可变字符串,不预选分配存储空间的话,长度不要超过5000个字符。如果超过则用text,独立一张表,用主键对应,避免影响到其他字段的索引效率。
  4. 表必备的三个字段:id(类型是unsigned bigint),gmt_create(创建时间),gme_modified(修改时间)
  5. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致性。冗余的字段必须不是频繁修改的字段,不是varhar超长字段(更不能是text字段)。
  6. 单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表(如果预计三年都达不到这个数据量,不要在创建表的时候就分库分表!)
  7. 超过三个表禁止使用join,需要join的字段,数据类型必须保持一致,当多表关联查询时,保证被关联的字段需要有索引!
  8. 在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,页面搜索严禁左模糊或者全模糊,如果需要则通过搜索引擎来解决。
    • 充分利用好最左前缀匹配特性!
  9. 利用延迟关联或者子查询优化超多也分场景。
  10. 如果有全球化需要,均以utf-8编码。如果需要存储表情,选择utf8mb4进行存储。

2.1值得说明的点

一、利用延迟关联或者子查询优化超多也分场景。

MySQL并不是跳过 offset行,而是取 offset+N行,然后返回放弃前offset行,返回N行,那当 offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。

例子:


// 优化前

SELECT id, cu_id, name, info, biz_type
	, gmt_create, gmt_modified, start_time, end_time, market_type
	, back_leaf_category, item_status, picuture_url
FROM relation
WHERE biz_type = '0'
	AND end_time >= '2014-05-29'
ORDER BY id ASC
LIMIT 149420, 20;


// 优化后

SELECT a.*
FROM relation a, (
		SELECT id
		FROM relation
		WHERE biz_type = '0'
			AND end_time >= '2014-05-29'
		ORDER BY id ASC
		LIMIT 149420, 20
	) b
WHERE a.id = b.id

解释:其实这里就是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。这样就是充分利用了索引!


三、未解决的问题

在看《手册》的时候还有一些知识点没看过、没实践过、涉及到的知识点比较多的,在这里先mark一下,后续再遇到或者有空的时候再回来补坑~

  • 使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用 countDown方法,线程执行代码注意 catch 异常,确保 countDown 方法被执行到,避免主线程无法执行至 await 方法,直到超时才返回结果。说明: 注意,子线程抛出异常堆栈,不能在主线程 try-catch 到。
  • 对于一写多读,是可以解决变量同步问题, 但是如果多写,同样无法解决线程安全问题。如果是 count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1);如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)。
  • 使用JDK8的Optional类来防止NPE问题。

当然了,如果你有比较好的资料阅读,也可以在评论区告诉我。我也会mark住好好看看。

比如说:“3y,我发现Optional类有篇文章写得很不错,url是xxxx(书籍的名称是xxx)


由于现在没有一定的经验积累,所以以下的章节得回头看:

  • 《手册》中的“日志规约”,“工程结构”、“设计规范”

最后

看我上面写的内容就知道,除了一些规范外,还有很多实用的小技巧,这些对我们开发是有帮助的。我这个阶段也有一些没怎么接触过的(“日志”,“设计”,“二方库”),这些都需要我在成长中不断的回看才行。

  • ps:我会回来补坑的。

引用书上的一句话:

很多编程方式客观上没有对错之分,一致性很重要,可读性很重要,团队沟通效率很重要。程序员天生需要团队协作,而协作的正能量要放在问题的有效沟通上。个性化应尽量表现在系统架构和算法效率的提升上,而不是在合作规范上进行纠缠不休的讨论、争论,最后没有结论。

作者(孤尽)在知乎回答的一句话:

翻完了不代表记住了,记住了不代表理解了,理解了不代表能够应用上去,真正的知识是实践,实践,实践。

如果你觉得我写得还不错,了解一下:

无人机中继传输数据链技术,(无人机+自组网)远距离传输技术实现详解 无人机中继传输数据链技术是指利用无人机作为空中移动中继节点,在需要通信的区域上空悬停或移动,以建立和维护通信链路,从而扩展通信范围、提高通信质量和灵活性。1. 通信链路:是无人机中继通信的重要组成部分,包括源节点到中继节点的链路和中继节点到目标节点的链路。同时,它还支持空中到地面的通信,距离大于100km。总的来说,无人机中继传输数据链技术和(无人机+自组网)远距离传输技术都是现代无人机通信领域的重要技术,它们的应用极大地扩展了无人机的通信范围和灵活性,为各种应用场景提供了强有力的支持。 阅读详情

相关推荐

深度探索:机器学习中的最大似然估计(MLE)原理及其应用

最大似然估计作为统计推断的核心方法,在机器学习领域具有广泛的应用价值和深远影响。尽管存在对模型假设敏感、易受异常值影响等局限性,但其直观的原理、坚实的理论基础以及高效的实现方式使其在实践中仍占据主导地位。随着深度学习、强化学习等新兴领域的快速发展,最大似然估计将继续演化并适应新的模型结构与优化框架。同时,结合现代优化算法、并行计算技术以及贝叶斯方法的融合,最大似然估计有望在保持其核心优势的同时,进一步提升参数估计的准确性和鲁棒性,为未来的机器学习研究与应用开辟更广阔的道路。

qq_51320133的博客 1万+

记一次Alibaba代码质量检测问题归总

前段时间针对公司老项目做了一次代码规范质量检查,采用的是阿里巴巴代码检测插件进行检测,检查结果并不理想,老项目比较重,开发迭代人员比较多,本文就是对这些检查点做一个记录,方便之后回顾。 Alibaba代码检测插件是2017年开发的,无论是IDEA还是Android Studio都可以安装使用,深受开发者好评。androidstudio可以直接搜索插件Alibaba Java Coding Guidelines进行安装使用。 Blocker if、for语句必须采用闭包形式,不允许采用无括号形势编写。

乂星人 1156

vscode+keil嵌入式软件开发全流程

vscode+keil嵌入式软件开发全流程

AspringQ的博客 6782

有一个魔法值问题。。。

总结的一些编程规范 :编程规范 提示问题代码,红色标记处 ...... @Override public void onClick(Column column, AssetInfo assetInfo, int col, int row) { Intent intent = new Intent(Asse...

weixin_30252155的博客 338

别只盯着Spectre!Cadence Virtuoso里APS和Spectre X该怎么选?一份给模拟IC新手的指南

本文深入解析Cadence Virtuoso中的三大仿真引擎Spectre、APS和Spectre X,帮助模拟IC新手根据电路规模、精度需求和计算资源做出智能选择。通过对比技术指标和应用场景,提供射频电路、混合信号系统和电源管理IC的优化仿真策略,显著提升设计效率。

weixin_26841743的博客 707

用python自动复制粘贴excel表里某一列的数据到另一个表中

昨天接到人事小姐姐求助减轻复制粘贴的重复工作量,分享一下代码 半路新手上路 耶 把 2.xlsx 表里的第二列 的数据复制粘贴到 test.xlsx的第一列 python3.6.2 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.writer.excel import Exc...

weixin_33854644的博客 2万+

Alibaba-Java-Coding-Guidelines

Alibaba-Java-Coding-Guidelines Table of Contents Preface 1. Programming Specification Naming Conventions Constant Conventions Formatting Style OOP Rules Collection Concurrency Fl...

Jaylon Wang的专栏 3858

基于RFM模型的电商零售数据分析

E-Commerce Data 数据集介绍 E-Commerce Data Actual transactions from UK retailer 数据集地址(kaggle) https://www.kaggle.com/carrie1/ecommerce-data/kernels 该数据来源于kaggle,是一家注册在英国的电子商务网站的2010年12月份-2011年12月份之间的...

W_H_M_2018的博客 3099

alibaba java idea 插件——alibaba java coding guidelines(三)major级别的代码~

目录 序: 1.major 1.1不允许任何魔法值(即未经定义的常量)直接出现在代码中。 1.2中括号是数组类型的一部分,数组定义如下 1.4单个方法的总行数不超过80行。 1.5循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。 1.6所有的抽象方法(包括接口中的方法)必须要用javadoc注释 1.7所有的类都必须添加创建者...

新一的技术笔记 1527

truetime2.0使用说明

truetime2.0使用说明1.1 truetime2.0工具箱的下载与安装1.2 truetime2.0工具箱的配置1.3 truetime2.0各模块的说明 注意,以下出现的地址本电脑MATLAB安装路径,请注意自己的MATLAB安装路径 1.1 truetime2.0工具箱的下载与安装 步骤1)没有工具箱的朋友可以 在可以在这个网站上免费申请下载http://www.control.lth.se/truetime/,里面有最新的版本。我用的是TrueTime 2.0 beta 1 步骤2)将

小六@sll 浊酒一杯 畅谈三千 清茶一壶 念游四海 4202

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429

[ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429 可以使用一些编码字符来制作URI,以访问WEB-INF目录的内容和/或绕过一些安全限制。默认合规模式允许带有包含 %u002e 段的 URI 的请求访问WEB-INF目录中的受保护资源。

qq_51577576的博客 3208

阿里巴巴JAVA开发手册读后感

《阿里巴巴 java开发手册》读后感 五一小长假里,在家看了看开发手册,了解了一些与编码相关的生态知识,更加明确了开发工程师应具备的基本技术素养,主要有以下几个方面 1:编码规约 字段命名采用大驼峰小驼峰的格式(特殊字段除外),不建议使用拼音; 每次写完代码都应该格式化(快捷键 ctrl + alt + l); Controller Service 实现层 都要加上注释; ...

Dandelion、 761

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2100

阿里巴巴Java开发手册v1.2.0读后感

Java规范 HashSet、ArrayList分析

brycegao321的博客 768

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

android 蓝牙通讯demo

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

大牛手把手带你!阿里巴巴java开发手册读后感

AOP简介 AOP (Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想。AOP 是 OOP(面向对象编程 Object Oriented Programming)的思想延续 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码的编写方式(例如性能监视、事务管理、安全检查、缓存、日志记录等) AOP核心思想 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 切面:需要

m0_57700605的博客 269

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2月11日 阿里巴巴Java开发手册 读后感

该手册分为几个部分: 印象深刻的几点: (五)集合处理 2.【强制】ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ; 说明:subList 返回的是 ArrayLis...

weixin_30906671的博客 157

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【小家java】《阿里巴巴 Java开发手册》读后感---拥抱规范,远离伤害

每篇一句 无规矩不成方圆 无规范不能协作 拥抱规范,远离伤害 前言 对于编码规范,本人一直是公司里的大力推崇者。其实不乏发现有很多人并不注重编码的规范性,觉得只要功能实现了就ok了,其实这种认识是非常初级的。 了解了规范,可以提前避免一些开发盲区,大大提高团队协作的效率。规范的编程习惯,更能提升我们coder的职业素养,向代码致敬 一个成熟的项目要想长足发展(其实我还没看过什么项目只考虑...

架构师:通透,才能写出好代码! 2151

《阿里巴巴Java开发手册1.4.0》阅读总结与心得(一)

前言   下面是阿里对《阿里巴巴 Java 开发手册》(下称《手册》)的介绍:   凝聚了阿里集团很多同学的知识智慧和经验,这些经验甚至是用血淋淋的故障换来的,希望前车之鉴,后车之师,能够帮助更多的开发者少踩坑,杜绝踩重复的坑。      在知乎上,也有关于这本开发手册的讨论十分热烈的帖子:https://www.zhihu.com/question/55642203。      其中...

weixin_30622107的博客 137

读《阿里巴巴java开发手册》有感。1.3.0

序 总体来说我的写代码风格,基本和手册上差不多。但是还有不少地方有细微的区别。 特别有感悟的地方说一下。对应开发手册标号 开发手册地址:https://files-cdn.cnblogs.com/files/han-1034683568/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%E7%BB%88%E6%9E%81%E7%89%88v1.3.0.pdf 一。 1.1在变量名中不用任何特殊符

u014084297的博客 279

java开发手册嵩山版读书心得,最全Java知识总结

前言 MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。是一个基于Java的持久层框架。 在国内市场来说,Mybatis的使用率比Hibernate更高,也更加流行。个人认为其流行的主要原因在于:国内绝大部分项目都是面向表结构编程的,Mybatis使用起来更加方便。 Alibaba绝对是国内互联网行业的天花板,很多优秀的开源项目都是阿里大佬分享出来的,因此今天就跟大家分享

m0_57767685的博客 174

阿里巴巴Java开发手册———个人追加的见解和补充(一)

先上干货,《阿里巴巴Java开发手册》的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.158.xUUgiz 下面分几个部分对这个手册进行说明,都是个人的见解,本人技术一般,如果有错误或者不妥,请评论指出,虚心接受,提前感谢了。 建议边看手册,边食用以下说明,效果比较好。 前言 首先当我...

weixin_30354675的博客 81

读《阿里Java开发手册》总结(1)

一·命名约定 类名使用大驼峰式命名(领域模式相关命名除外:如DAO\VO\DO等)。 常量必须全部大写,单词中间用“_”隔开(如MAX_COUNT)。 抽象类命名使用Abstract或Base开头。异常类命名使用Exception结尾。测试类命名以它要测试的类的名称开始,然后以Test结尾。 中括号是数组类型的一部分:String[] args;不要使用String args[]来定义...

weixin_33810302的博客 150
上一篇: 双十一买买买买!不买血赚!买了血亏!
下一篇: 给女朋友讲解什么是Optional【JDK 8特性】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值