并发编程知识精粹

C++并发编程经典实例与实战精粹 C++11并发库为线程管理、同步机制、原子操作等提供了标准化的API。它包括了<thread><mutex><future><atomic>等头文件,它们支持互斥锁、条件变量、未来(future)和承诺(promise)对象等并发编程元素。C++11提供了一系列的原子操作类,这些类位于<atomic>头文件中,例如和。模板类可以对任何可赋值的类型提供原子操作,而则是一个简单的原子布尔标志。 阅读详情

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

一、并发编程知识体系

线程基础

线程生命周期: 线程的生命周期管理是并发编程的核心之一。在Java中,线程的生命周期由Thread类控制,其状态变化可以通过Thread类中的方法来查询和改变。线程从创建到销毁的过程可以分为以下几个阶段:

  • 新建(New):线程对象被创建后,处于新建状态,此时线程尚未启动。
  • 就绪(Runnable):线程调用start()方法后进入就绪状态,此时线程已经被系统加载到就绪队列中,等待被调度执行。
  • 运行(Running):线程从就绪队列中被调度到CPU上执行,进入运行状态。
  • 阻塞(Blocked):线程因为某些原因(如等待某个锁、I/O操作等)无法继续执行,进入阻塞状态。
  • 等待(Waiting):线程处于等待状态,它需要其他线程或条件变量来唤醒它。
  • 超时等待(Timed Waiting):线程在等待一段时间后仍未被唤醒,进入超时等待状态,与等待状态类似,但超时等待有一个固定的时间限制。
  • 终止(Terminated):线程执行完毕或被终止后进入终止状态。

线程优先级: 线程优先级是线程调度的一个重要因素,它表示线程获得CPU时间片的优先级。Java中的线程优先级分为10个等级,数值越高,优先级越高。线程优先级可以通过setPriority(int newPriority)方法来设置。然而,线程优先级只是建议性的,最终线程的调度还是由操作系统决定。

守护线程: 守护线程(Daemon Thread)是一种特殊的线程,它被用来为其他非守护线程提供服务。当所有的非守护线程结束时,程序将退出,即使守护线程仍在执行,程序也会正常结束。Java中的守护线程可以通过调用setDaemon(true)方法来设置。

线程池: 线程池是一种复用线程的机制,它可以提高程序的性能,减少创建和销毁线程的开销。Java中的线程池通过Executor框架来实现,主要包括以下几个核心参数:

  • 核心线程数(Core Pool Size):线程池中的核心线程数,即使空闲也会保持在线程池中。
  • 最大线程数(Maximum Pool Size):线程池中允许的最大线程数。
  • 存活时间(KeepAlive Time):空闲线程的存活时间,超过这个时间,空闲线程将被终止。
  • 排队策略(Queue):工作队列的类型,如LinkedBlockingQueue、ArrayBlockingQueue等。

拒绝策略: 当线程池中的线程数量达到最大值时,拒绝策略决定了如何处理新任务。常见的拒绝策略包括:

  • AbortPolicy:抛出RejectedExecutionException异常。
  • CallerRunsPolicy:调用者运行,将任务回退给调用者线程。
  • DiscardPolicy:丢弃任务,不抛出异常。
  • DiscardOldestPolicy:丢弃最旧的任务,不抛出异常。
同步机制

悲观锁/乐观锁: 悲观锁和乐观锁是两种不同的并发控制机制。悲观锁假设冲突会发生,因此总是先加锁;乐观锁则假设冲突不会发生,通过版本号或时间戳来检测冲突。Java中的乐观锁实现通常依赖于原子类,如AtomicInteger、AtomicLong等。

读写锁: 读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。Java中的读写锁实现可以使用ReentrantReadWriteLock类。

条件变量: 条件变量允许线程在某些条件下等待,直到其他线程通知它们继续执行。Java中的条件变量可以使用Object类的wait()、notify()和notifyAll()方法实现。

并发集合

ConcurrentHashMap: ConcurrentHashMap是线程安全的HashMap实现,它通过分段锁(Segment Locking)来减少锁的竞争。每个分段都是一个Segment数组,每个Segment内部维护一个链表,锁只对特定的Segment有效。

CopyOnWrite容器: CopyOnWrite容器在写操作时创建一个新的副本,并在副本上进行修改,从而避免了对读操作的阻塞。这种策略适用于读多写少的场景。

BlockingQueue: BlockingQueue是线程安全的队列实现,它支持线程间的阻塞操作。常见的阻塞队列实现包括LinkedBlockingQueue、ArrayBlockingQueue和PriorityBlockingQueue。

并发工具类

Phaser: Phaser是一个可伸缩的同步工具,用于控制多个线程的执行顺序。它允许线程在某个点等待,直到所有线程都到达该点。

Exchanger: Exchanger允许两个线程交换数据,它通常用于生产者-消费者场景。

FutureTask: FutureTask是一个可以异步执行并返回结果的Future对象。它可以与线程池结合使用,实现异步任务执行。

并发框架

Netty线程模型: Netty使用主从多线程模型,一个Boss线程负责接收连接,多个Worker线程处理实际的读写操作。

Akka Actor模型: Akka使用Actor模型,每个Actor独立运行,通过消息传递进行通信。

Disruptor环形缓冲区: Disruptor使用环形缓冲区来存储数据,通过发布/订阅模式实现高效的并发处理。

二、MyBatis知识体系

SQL映射

注解映射: MyBatis提供了多种注解来简化SQL映射,如@Select、@Insert、@Update和@Delete。这些注解可以用于映射SQL语句和Java对象之间的关系。

结果集映射: MyBatis将SQL查询结果映射到Java对象,可以通过XML或注解来配置映射关系。映射关系包括字段映射、类型转换、关联映射等。

关联查询: MyBatis支持级联查询,通过配置一对一、一对多和多对多关系,实现复杂的关联查询。级联查询可以通过@One、@Many、@ManyToMany等注解实现。

动态SQL: MyBatis使用OGNL表达式和分支语句来构建动态SQL,支持条件、循环和批量操作。动态SQL可以通过@SelectProvider、@SqlProvider等注解实现。

缓存机制

一级缓存: MyBatis默认使用一级缓存,它存储在SqlSession内部,只对当前会话有效。一级缓存通过HashMap实现,每个SqlSession有一个独立的一级缓存。

二级缓存: MyBatis支持二级缓存,它可以在多个会话间共享,通过配置全局缓存来实现。二级缓存通常使用HashMap或其他数据结构来实现,并通过配置文件或注解来管理。

自定义缓存: MyBatis允许自定义缓存实现,通过实现Cache接口来实现自己的缓存策略。自定义缓存可以实现复杂的缓存策略,如缓存淘汰、过期处理等。

代理模式: MyBatis使用代理模式来创建Mapper接口的代理实现,使得可以通过注解或XML来配置SQL映射。代理模式使得MyBatis能够动态地生成SQL语句,并执行数据库操作。

MapperProxy插件拦截

动态代理: MyBatis使用动态代理来创建Mapper接口的代理实现,使得可以在代理实现中拦截方法调用。动态代理通过Proxy类实现,它可以在运行时创建对象的代理实例。

执行流程: MyBatis的执行流程包括解析XML配置、构建SqlSource、构建MappedStatement、构建SqlSession、执行查询、处理结果集等。执行流程涉及到多个组件,如SqlSessionFactory、SqlSession、Executor等。

SqlSession生命周期: SqlSession是MyBatis的核心接口,它管理数据库连接、事务和执行SQL操作。SqlSession的生命周期包括创建、使用和关闭。创建SqlSession可以使用SqlSessionFactory.openSession()方法,使用完毕后需要关闭SqlSession以释放资源。

执行器类型: MyBatis提供多种执行器类型,如SimpleExecutor和ReuseExecutor。SimpleExecutor每次执行SQL都会创建一个新的Statement对象,而ReuseExecutor则复用Statement对象。

延迟加载: MyBatis支持延迟加载,即在需要时才加载关联对象,减少初始化时的开销。延迟加载可以通过@Lazy注解实现。

扩展机制: MyBatis允许通过插件来扩展其功能,如拦截器、类型处理器和方言支持。插件可以通过实现相应的接口来实现,并在MyBatis配置文件中进行配置。

类型处理器: MyBatis使用类型处理器来转换SQL类型和Java类型。类型处理器可以通过实现TypeHandler接口来实现。

拦截器链: MyBatis允许通过拦截器链来拦截SQL执行过程中的各种操作。拦截器可以通过实现Interceptor接口来实现。

方言支持: MyBatis支持多种数据库方言,如MySQL、Oracle和SQL Server,通过配置方言来适配不同的数据库。方言可以通过实现Dialect接口来实现。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号: SeniorRD

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

Python编程实践项目精粹.zip Python 是一种解释型、高级、通用编程语言,以其简洁明了的语法和强大的功能库而闻名。在开始编写 Python 代码之前,必须确保安装了 Python 解释器。安装完成后,开发者可以使用任何文本编辑器或集成开发环境(IDE)来编写和运行代码。Python的标准库中包含了大量的模块,每个模块都提供了特定的功能。这里举例介绍一些常用的模块并结合案例进行分析。datetime模块提供了操作日期和时间的函数和类,适用于需要处理时间数据的场景。json。 阅读详情

相关推荐

AMEsim柱塞泵的建模学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、为什么要对柱塞泵进行仿真?二、Amesim中柱塞泵的模型1.amesim中自己的定排量五柱塞的斜盘柱塞泵2.压力、流量仿真总结 前言 最近在学习Amesim进行柱塞泵的仿真学习,顺便在这里记录我的学习过程,这是我的初衷 提示:以下是本篇文章正文内容,下面案例可供参考 一、为什么要对柱塞泵进行仿真? 柱塞泵是功能和动力学比较复杂的流体机械。而在实际实验中,往往没有条件或者需要对柱塞泵做一些优化,所以需要我们利用仿真...

innocent_cft的博客 8187

学习记录

编号 书名 学习内容 学习时间 记录的博客 1 《数据结构与算法Java版》 1、什么时间复杂度 2、Big O表示法 3、数组的其他实现 4、栈的实现 5、队列的实现 6、单链表和双向链表、双端链表 7、什么是二叉树 8、红黑树 9、2-3-4树 10、二叉搜索树 2018.10.1-2018.10.20 https://blog.youkuaiyun.com...

BoringError的博客 651

Win10 LTSC 2021 CPU占用率飙升?KB5017308补丁修复全攻略

本文针对Windows 10 LTSC 2021系统中因wsappx进程导致的CPU占用率异常飙升问题,提供了详细的解决方案。核心在于安装微软官方发布的KB5017308补丁,该补丁能从根本上修复系统组件缺陷,使CPU占用恢复正常。文章详解了补丁的下载、安装步骤、注意事项及安装后的验证方法,是解决此问题的权威指南。

python9snake的博客 1275

并发编程与MyBatis精粹

不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。并发编程是计算机科学中的重要领域,它允许程序在同一时间执行多个任务,从而提高系统的响应性和资源利用率。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1001

仿真每日一练 | Workbench下薄板疲劳分析

今天给大家介绍Workbench下薄板疲劳分析,采用稳态分析模块进行评估。完成求解后,插入疲劳工具,同时插入对应的寿命进行查看,如图7和图8所示。采用稳态分析模块,导入几何模型,效果如图1。添加固定约束与扭矩,同时添加转速如图4所示。主要包括7要素,对应的类型见图2。求解完成后查看应力,如图6所示。1-1-3、有限元系统模型构建。1-2-1、加载条件/边界条件。1-1-1、几何模型构建。1-1-2、材料定义。1-2-2、求解设置。1-3-1、查看结果。1-3-2、评估结果。1-3-3、修正结果。

ansysxuexizhe的博客 1071

合宙ESP32C3实战:MPU6500六轴传感器数据读取与校准全解析

本文详细解析了如何使用合宙ESP32C3开发板读取和校准MPU6500六轴姿态传感器数据。从硬件接线、开发环境搭建到核心代码解析,提供了全面的实战指南,帮助开发者快速掌握传感器配置与数据处理技巧,适用于姿态控制、运动检测等应用场景。

weixin_27066963的博客 406

《Java核心技术·卷 I》知识点精粹总结

这本书适合有一定编程基础(不一定是Java)的学习者,也适合想要巩固和深化Java基础的开发者。它覆盖了Java SE(标准版)的核心特性,是学习后续高级框架(如Spring)的坚实地基。对于读过的人,它可以作为一个优秀的知识点回顾清单,帮你查漏补缺。我的总结将按照书中知识点的递进顺序,从基础到进阶,为你清晰地梳理出整个知识体系。这是本书的核心和精华所在,深入讲解了Java的OOP思想。这本书被誉为Java领域的“圣经”之一,它的特点是。这部分是Java的入门,涵盖了最基本的语法和概念。

千里之外的专栏 1259

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

C#精粹,一本都不能少

C#与.NET框架,入门 + 进阶 + 精通,外加并发编程实例,8本C#图书,一本都不能少。

图灵教育 3524

YOLOv10改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤

本文记录的是。采用深度可分离卷积将标准卷积分解为深度卷积和1×1卷积。同时,引入来,避免非线性层导致的性能下降问题。本文将应用到YOLOv10中,借助其高效的结构和特性,在保持一定精度的前提下,显著降低YOLOv10的计算复杂度和内存占用。

Limiiiing的博客 533

国产化操作系统shell常用脚本

国产操作系统常用脚本:统信、麒麟。

Reyn_观极 599

Java面试进阶指南:高级知识点问答精粹(二)

Java内存模型(JMM)是一个抽象的模型,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下这些变量如何被不同线程所看到。JMM规定了主内存和工作内存的概念,以及它们之间的交互规则。在并发编程中,JMM确保了多线程间操作的原子性、可见性和有序性。它允许合理的并行执行,同时保证程序结果的正确性。例如,volatile关键字的使用就是基于JMM来保证变量的可见性。强引用:如果一个对象具有强引用,那么它永远不会被垃圾回收器回收。软引用。

Layla_c的博客 672

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第5篇,昇腾环境下部署蒸馏版deepseek-r1,并在dify中注册模型供应商

这两天没少折腾deepseek-r1。之前在A100上用ollama部署了一份DeepSeek-R1-Distill-Qwen-32B,感觉真的特别慢。现在,再用昇腾部署一遍,看看速度能不能更快。p.s. 类似的内容其实已经写了很多遍了。但感觉之前写得都太碎,不够顺畅。接着新模型写篇长文,把能包括的都包括进来。这样大家也不需要到处翻来翻去。

xiezhipu的博客 2450

Java开发工程师面试题!java项目开发案例精粹

前言 今年我也33了,离传说中不好找工作的35岁又更近了。说没有焦虑是对自己撒谎,于是我采访了一些人,自己思考了下,写下了这篇文章,希望能有些共鸣。 先看看大家的态度: 色老力衰,不好忽悠,不能带头加班 老油条,学不动,加班就是磨洋工 关键还是贡献的价值。能不能给业务带来价值 找背书 基本逻辑就是,比你这个难得多的哥们都搞定了,你这点小事根本不再话下 去bat镀镀金,捷径 看看你的上司是咋过来的 不知从何时起,很多企业将入职门槛限定在35岁以下,“35岁”已然成为职场老鸟的魔咒,而近年来有关**“程序员

m0_57768082的博客 329

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

上一篇: 并发编程与MyBatis精解
下一篇: ShardingSphere核心机制解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值