【Java并发编程的艺术】【学习笔记】Java并发集合

java并发编程的艺术 《JAVA并发编程艺术》 阅读详情

8、阻塞队列

​ 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞的插入和移除方法。

​ 1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。

​ 2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。

​ 阻塞队列常用于生产者和消费者的场景。

插入和移除操作的4中处理方式

方法/处理方法抛出异常返回特殊值一直阻塞超时退出
插入方法add(e)offer(e)put(e)offer(e, time, unit)
移除方法remove(e)poll()take()poll(time, unit)
检查方法element()peek()不可用不可用

8.1、ArrayBlockingQueue

​ 一个由数组结构组成的有限阻塞队列。此队列按照FIFO的原则对元素进行排序。

​ ArrayBlockingQueue有界且固定,在构造函数时确认大小,然后不支持改变。

​ 在多线程环境下不保证“公平性”。所谓的公平访问队列,即先阻塞线程先访问队列。非公平性是当队列可用时,阻塞的线程都可以争夺队列的访问资格。

​ 为了保证公平性,通常会降低吞吐量。创建公平的阻塞队列

ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);

​ 访问的公平性是使用重入锁实现的。

public ArrayBlockingQueue(int capacity, boolean fair) {
  if (capacity <= 0)
    throw new IllegalArgumentException();
  this.items = new Object[capacity];
  lock = new ReentrantLock(fair);
  notEmpty = lock.newCondition();
  notFull =  lock.newCondition();
}

8.2、LinkedBlockingQueue

​ 一个由链表结构组成的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先FIFO原则对元素进行排序。

8.3、PriorityBlockingQueue

​ 一个支持优先级排序的无界阻塞队列。默认情况下元素采取自然顺序升序排列。

​ 也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparartor来对元素进行排序。

​ 需要注意的是不能保证同优先级元素的排序。

​ PriorityBlockingQueue低层采用二叉堆和重入锁来实现的。

二叉堆:

​ 二叉树是一种特殊的堆,结果性而言就是完全二叉树或者是近似完全二叉树。

​ 最大堆:父节点的键值总是大于或等于任何一个子节点的键值。

​ 最小堆:父节点的键值总是小于或等于任何一个子节点的键值。

​ 二叉堆一般用数组表示,那么其左孩子节点为:2 * n + 1,其右孩子节点为2 * (n+1),其父节点为(n-1)/2。

​ 因为是二叉堆,所以添加操作就是不断“上冒”,而删除操作则是不断“下掉”。

8.4、DelayQueue

​ 一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。

​ DelayQueue应用场景:

缓存系统的设计:可以用DelayQueue保持缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。

定时任务调度:使用DelayQueue保存当天将会执行的任何和执行时间,一旦从DelayQueue中获取到任务就开始执行。

​ (1)如何实现Delayed接口:

DelayQueue队列的元素必须实现Delayed接口。可以参考ScheduledThreadPoolExecutor里ScheduledFutureTask类的实现。

第一步:在对象创建的时候,初始化基本数据。使用time记录当前对象延迟到什么时候可以使用,使用sequenceNumber来标识元素在队列中的先后顺序。

private static final AtomicLong sequencer = new AtomicLong(0);

ScheduledFutureTask(Runnable r, V result, long ns, long period) {
  super(r, result);
  this.time = ns;
  this.period = period;
  this.sequenceNumber = sequencer.getAndIncrement();
}

第二步:实现getDelay方法,该方法返回当前元素还需要延时多长时间,单位是纳秒

public long getDelay(TimeUnit unit) {
  return unit.convert(time - now(), NANOSECONDS);
}

第三步:实现compareTo方法来指定元素的顺序。

public int compareTo(Delayed other) {
  if (other == this) // compare zero if same object
    return 0;
  if (other instanceof ScheduledFutureTask) {
    ScheduledFutureTask<?> x = (ScheduledFutureTask<?>)other;
    long diff = time - x.time;
    if (diff < 0)
      return -1;
    else if (diff > 0)
      return 1;
    else if (sequenceNumber < x.sequenceNumber)
      return -1;
    else
      return 1;
  }
  long diff = getDelay(NANOSECONDS) - other.getDelay(NANOSECONDS);
  return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
}

​ (2)如何实现延时阻塞队列

​ 当消费者从队列里获取元素时,如果元素没有达到延时时间,就阻塞当前线程。

long delay = first.getDelay(TimeUnit.NANOSECONDS);
if (delay <= 0)
  return q.poll();
else if (leader != null)
  available.await();
else {
  Thread thisThread = Thread.currentThread();
  leader = thisThread;
  try {
    available.awaitNanos(delay);
  } finally {
    if (leader == thisThread)
      leader = null;
  }
}

​ 代码中变量leader是一个等待获取队列头部元素的线程。如果leader不等于空,表示已经有线程在等待获取队列的头元素。所以,使用await()方法让当前线程等待信号。如果leader等于空,则把当前线程设置成leader,并使用awaitNanos()方法让当前线程等待接收信号或等待delay时间。

8.5、SynchronousQueue

​ 一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。

​ 它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。

public SynchronousQueue(boolean fair) {
    transferer = fair ? new TransferQueue<E>() : new TransferStack<E>();
}

​ SynchronousQueue可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合传递性场景。SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。

8.6、LinkedTransferQueue

​ 一个由链表结构组成的无界阻塞TransferQueue队列。相当于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。

​ (1) transfer方法

​ 如果当前有消费者正在等待接受元素(消费者使用take()方法或带时间限制的poll()方法时),transfer方法可以把生产者传入的元素立刻transfer(传输)给消费者。如果没有消费者在等待接收元素,transfer方法会将元素存放在队列的tail节点,并等到该元素被消费者消费了才返回。

transfer方法的关键代码:

Node pred = tryAppend(s, haveData);
return awaitMatch(s, pred, e, (how == TIMED), nanos);

​ 第一行代码是试图把存放当前元素的s节点作为tail节点。第二行代码是让CPU自旋等待消费者消费元素。因为自旋会消耗CPU,所以自旋一定的次数后使用Thread.yield()方法来暂停当前正在执行的线程,并执行其他线程。

​ (2) tryTransfer方法

​ tryTransfer方法是用来试探生产者传入的元素是否能直接传给消费者。如果没有消费者等待接收元素,则返回false。和transfer方法的区别是tryTransfer方法无论消费者是否接收,方法立即返回,而transfer方法是必须等待消费者消费了才返回。

​ 对于带有时间限制的tryTransfer(E e, long timeout, TimeUnit unit)方法,试图把生产者传入的元素直接传给消费者,但是如果没有消费者消费该元素则等待指定的时间在返回,如果超时还没消费元素,则返回false,如果在超时时间内消费了元素,则返回true。

​

​ 相当于ConcurrentLinkedQueue、SynchronousQueue(公平模式下)、无界的LinkedBlockingDeque等的超集。

​

8.7、LinkedBlockingDeque

​ 一个由链表结构组成的双向阻塞队列。所谓双向队列指的是可以从队列两端插入和移出元素。

​ 在初始化LinkedBlockingDeque时可以设置容量防止其过度碰撞。

​ 另外,双向阻塞队列可以运用在“工作窃取”模式中。

Java并发编程的艺术(一)——并发编程需要注意的问题 并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换 死锁 资源限制 接下来会逐一分析这三个问题,并给出相应的解决方案。问题一:上下文切换会带来额外的开销线程的运行机制 一个CPU每个时刻只能执行一条线程; 操作系统给每条线程分配不同长度的时间片; 操作系统会从一堆线程中随机选取一条来执行; 阅读详情

相关推荐

Java并发编程的艺术—— 一本系统全面的Java并发编程书籍

作者:禅与计算机程序设计艺术 1.背景介绍 什么是Java并发编程? 在过去的几十年里,由于计算机的性能的增长和分布式计算的普及,使得多核CPU和服务器的普及,同时也带来了一种编程模式:并行编程。 对于并行编程来说,无论是在单核CPU还是多核CP

AI天才研究院 948

Java并发编程的艺术

Java并发编程的艺术读书笔记

qq_36811160的博客 2006

《Java并发编程艺术》源码解析与实战

htmltable {th, td {th {pre {简介:《Java并发编程艺术》是Java开发者的宝贵资源,本书配套源码包含了书中所有实例和示例,用于加深对并发编程概念的理解与实践。源码包中包含详细的章节源代码、测试用例以及相关材料。

weixin_31688273的博客 914

# Java 并发编程的艺术(三)

如果一个操作另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。两个操作之间存在关系,并不意味着Java平台的具体实现必须要按照关系指定的顺序来执行。如果重排序之后的执行结果,与按关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)。在队列为空时等待从队列中获取元素,或者在队列已满时等待向队列中添加元素阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。

不积跬步,无以至千里;不积小流,无以成江海 944

深入理解Java并发编程艺术

在Java中,除了使用现有的线程安全集合外,还可以通过扩展现有的类或使用同步工具类来创建自定义的线程安全集合。例如,可以利用方法来同步一个普通的ArrayList,但这通常不如直接使用方便和高效。在自定义集合时,需要特别注意同步的粒度和锁的使用,以确保并发安全同时避免过度的性能损失。通过本章节的介绍,你已经了解到如何在Java中选择和使用线程安全的数据结构,并且知道了它们的内部原理和各自的使用场景。下一章我们将讨论如何在并发编程中应用最佳实践与技巧。

weixin_32047493的博客 748

Java并发编程权威书籍集合

并发工具类包括了各种各样的功能,例如:Semaphore:信号量,用于控制访问特定资源的线程数量。:倒计时门栓,允许一个或多个线程等待直到在其他线程中执行的一组操作完成。:循环栅栏,用于使一定数量的线程互相等待,直到所有线程都达到某个公共屏障点。Exchanger:交换器,用于线程之间交换数据,尤其适用于那些执行对称操作的线程。通过这些工具类,开发者可以以声明式的方式实现并发控制,而不需要编写复杂的逻辑来手动控制线程间的协作。例如,使用。

weixin_42612804的博客 805

Java并发编程的艺术-第三章-内存模型

资源 1.1 代码 https://github.com/ouyangxizhu/ArtConcurrentBook.git 1.2 书籍 链接:https://pan.baidu.com/s/18xLExmEllaowDsXbulH-iw 提取码:ttln 三、java内存模型 3.1 java内存模型的基础 3.1.1 并发编程模型的两个关键问题 这里的线程是指并发执行的活动实体 3.1.1....

欧阳惜竹的博客 645

JAVA并发编程艺术 高清pdf

JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

【免费下载】 探索Java并发编程的奥秘:《JAVA并发编程艺术》高清PDF下载

探索Java并发编程的奥秘:《JAVA并发编程艺术》高清PDF下载 【下载地址】JAVA并发编程艺术高清PDF下载 本仓库提供了一份名为《JAVA并发编程艺术》的高清PDF文件下载。该资源详细介绍了Java并发编程的各个方面,涵盖了从基础概念到高级技术的全面内容 ...

gitblog_06678的博客 1191

Vue 10分钟入门VR全景显示 基于photo-sphere-viewer

文章目录前言一、引入photo-sphere-viewer?二、使用步骤1.引入库2.声明容器3.内容加载4.全部代码总结 前言 由于工作的需求,要实现全景图片的展示与预览,本来以为会是一个很难的内容,没想到使用现成的组件photo-sphere-viewer就可以轻松实现,上手只需要10分钟! 一、引入photo-sphere-viewer? 可以直接通过npm进行引入 npm install photo-sphere-viewer 二、使用步骤 1.引入库 photo-sphere-viewer

YIGE_MO的博客 5867

国产麒麟系统中的PaddleOCR离线绿色部署:高效安全的文字识别新纪元

摘要:本文详细介绍了PaddleOCR在银河麒麟V10SP1系统上的离线部署方案。通过Conda虚拟环境隔离依赖,采用离线包安装方式实现无网络部署,支持80+语言识别。重点讲解了模型量化剪枝优化、多线程处理等性能调优技巧,并提供了完整的OCR识别代码示例。该方案具有数据本地化处理的安全优势,适用于医疗票据数字化等对隐私要求严格的场景,同时解决了模型加载失败、内存不足等常见问题。

墨夶的博客 1230

《Java并发编程的艺术》之 Java并发编程基础

《Java并发编程的艺术》之 Java并发编程基础 文章目录《Java并发编程的艺术》之 Java并发编程基础线程简介什么是线程代码清单4-1 MultiThread.java解析为什么要使用多线程更多的处理器核心更快的响应时间线程优先级代码清单4-2 Priority.java结果注意参数解析线程的状态注意Daemon线程注意注意启动和终止线程构造线程代码清单4-6 Thread.java启动线程注意理解中断代码清单4-7 Interrupted.java过期的suspend()、resume()和sto

weixin_44019182的博客 2496

告别糊涂账!用CKM3底表逻辑自建物料成本监控报表(含ABAP代码片段)

本文详细介绍了如何利用CKM3底表逻辑自建物料成本监控报表,解决标准报表无法穿透成本差异根源的问题。通过ABAP代码片段和四步架构法,帮助财务团队精准分析成本构成,优化成本核算批量处理,实现多维透视差异分析,提升成本监控效率。

weixin_30740295的博客 268

Java 并发编程的艺术

内容简介 书中采用循序渐进的讲解方式,从并发编程的底层实现机制入手,逐步介绍了在设计 Java 并发程序时各种重要的技术、设计模式与应用,同时辅以丰富的示例代码,使得开发人员能够更快地领悟 Java 并发编程的要领,围绕着 Java 平台的基础并发功能快速地构建大规模的并发应用程序。 第1章介绍 Java 并发编程的挑战,会向读者说明可能会遇到哪些问题,以及如何解决。 第2章 Java 并发编程...

GitChat 2694

大模型-internvl高通qnn运行源码解读

模型链接:https://huggingface.co/OpenGVLab/InternVL2-2B论文官方简要说明 https://internvl.github.io/blog/2024-07-02-InternVL-2.0中文解读 https://zhuanlan.zhihu.com/p/702946079在线demo https://internvl.opengvlab.com/

点滴的岁月 1833

从零构建Carsim线控转向仿真:模型搭建、算法集成与整车联动实战

本文详细介绍了从零开始基于Carsim和Simulink搭建线控转向仿真模型的完整实战流程。内容涵盖RWA前轮执行器动力学建模与PID控制、卡尔曼滤波器估算齿条力、HWA方向盘手感模拟算法设计,以及最终实现HWA与RWA闭环联动并进行整车仿真调试。通过分步拆解,帮助读者深入理解线控转向系统的核心原理与工程实现。

weixin_29158413的博客 251

《java并发编程的艺术》阅读笔记总结

第1章 并发编程的挑战 并发编程的目的是为了让程序运行得更快,但是不是更多的线程就能让程序最大限度的并发执行。比如上下文切换、死锁的问题,以及受限于软件和硬件的资源限制问题。 软件资源限制:有数据库的链接数和socket连接数等 硬件的资源限制有带宽的上传、下载速度、硬盘读写速度和CPU处理速度。 减少上下文切换的方法 无锁并发编程 CAS算法 使用最少线程 使用协程 避免死锁 避免...

weixin_36152448的博客 3982

在Ubuntu22.04.2远程服务器上搭建OHIF+Orthanc

在Ubuntu远程服务器上不翻墙,但是本地windows需要科学上网开始之前,首先在终端输入export -p查看是否有代理端口如下如果有就关了,输入如下命令。

weixin_51116549的博客 1343

《并发编程的艺术》第一章——并发编程的挑战

🔥本篇概览:详细讲解了《并发编程的艺术》第一章——并发编程的挑战。🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1391

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3967

把 LLM 编排能力塞进 ABAP 系统里,ZLLM 仓库的工程价值与 SAP 落地场景

ZLLM项目将LLM应用开发中的常见工程问题引入ABAP原生环境,为SAP系统提供AI工作流构建能力。它类似ABAP版的LangChain,支持Chain组合、Prompt模板、状态传递等核心功能,强调纯ABAP实现、延迟执行以及与ABAP数据结构的深度集成。项目包含工厂类、LLM客户端、负载均衡器等模块,特别设计了能处理ABAP内表和结构的模板引擎,使业务数据可直接用于Prompt生成。通过Step和Flow机制支持复杂业务过程编排,并采用延迟执行和并行处理优化批量任务性能。该项目为ABAP开发者提供了在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

Java并发编程深度解析

在现代软件开发中,并发编程已经成为一个不可或缺的部分。Java作为一门广泛使用的编程语言,提供了丰富的并发编程工具和库。本文将深入探讨Java中的并发模型、线程安全、锁机制以及一些高级并发工具。在Java中,并发编程的基础是线程(Thread)。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。每个对象都有一个内置锁,线程在进入同步代码块时会自动获取该锁,退出时自动释放。线程池通过复用线程来减少线程创建和销毁的开销。类提供了多种线程池的实现。接口,可以创建新的线程。

weixin_52094968的博客 2064

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java并发编程的艺术与实践

Java并发编程是构建高效、可靠软件的重要组成部分,它通过多线程技术实现了在同一程序内并发执行多个任务的能力,从而更好地利用多核CPU资源提高系统性能。本文旨在详细介绍Java并发编程的核心概念、关键机制,辅以详细的代码实例,帮助读者深化理解和应用这一关键技术。

极客代码 1173

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

计算机控制技术及应用

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

上一篇: 【深入理解Java虚拟机 第2版】【学习笔记】JVM
下一篇: 【翻译JMX1.4】Introduction-to-the-JMX-Specification(持续修改)
阿登灯
博客等级 码龄15年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值