并发编程与MyBatis精讲

零代码实战:基于Coze平台打造测试用例生成AI助手 本文详细介绍了如何利用Coze平台零代码打造测试用例生成AI助手,通过智能体和工作流配置,实现需求文档自动解析与结构化测试用例生成。该方案显著提升测试效率,特别适合敏捷开发中频繁变更的需求场景,帮助测试工程师快速应对挑战。 阅读详情

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

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

Java程序员廖志伟

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

优快云

一、并发编程知识体系

并发编程是现代软件开发中不可或缺的一部分,它涉及到如何使多个任务在同一时间点执行,以提高系统的响应性和效率。以下是对并发编程知识体系的详细解析,并补充其技术实现细节。

线程基础

线程是并发编程的核心概念,它是程序中执行运算的最小单位。

线程生命周期:

  1. 新建态:通过Thread类或其子类创建后,尚未启动。在这个阶段,线程对象被创建,但尚未分配资源,因此无法执行任何操作。
  2. 就绪态:调用start()方法后,线程等待被分配CPU资源。此时线程已经准备好执行,但尚未获得CPU时间片。
  3. 运行态:线程获得CPU资源,开始执行。线程在运行态中,会根据CPU调度策略执行相应的任务。
  4. 阻塞态:由于某些原因(如I/O操作、等待锁等)导致线程暂停执行。线程在阻塞态时,不会占用CPU资源。
  5. 终止态:线程执行完毕或被终止。终止态的线程将不再参与任何线程调度。

线程优先级: 线程优先级决定了线程在CPU资源有限时的调度顺序。Java中,线程优先级分为10个等级,范围从1(最低)到10(最高)。线程优先级不是绝对的,操作系统会根据实际情况进行调整。

守护线程: 守护线程是服务线程,它不参与程序的主要任务,而是为其他线程提供服务。当所有非守护线程结束时,程序会自动退出。在Java虚拟机中,守护线程的终止不会导致虚拟机退出。

线程池: 线程池是一组预先创建的线程,用于执行多个任务。它有以下核心参数配置:

  • 核心线程数:线程池中的核心线程数量。核心线程在创建时就被创建,并且会一直存在,除非系统资源不足。
  • 最大线程数:线程池允许的最大线程数量。当任务数量超过核心线程数时,线程池会创建额外的线程来处理任务。
  • 队列类型:用于存储等待执行的任务。常见的队列类型包括:数组阻塞队列、链表阻塞队列、优先级队列等。
  • 拒绝策略:当任务数量超过最大线程数和队列容量时,如何处理新任务。常见的拒绝策略包括:抛出异常、丢弃任务、丢弃队列头部任务、调用拒绝处理者等。

同步机制: 同步机制用于控制对共享资源的访问,确保线程安全。常见的同步机制包括:

悲观锁/乐观锁:

  • 悲观锁:假设在执行过程中,其他线程会修改数据,因此在操作数据前加锁。Java中,悲观锁的实现方式包括synchronized关键字、ReentrantLock等。
  • 乐观锁:假设在执行过程中,其他线程不会修改数据,因此采用版本号或时间戳等机制进行冲突检测。Java中,乐观锁的实现方式包括AtomicInteger、AtomicLong等。

读写锁: 读写锁允许多个线程同时读取数据,但只允许一个线程写入数据。Java中,读写锁的实现方式包括ReentrantReadWriteLock。

条件变量: 条件变量用于等待某个条件成立,然后唤醒一个或多个线程。Java中,条件变量的实现方式包括Object.wait()、Object.notify()、Object.notifyAll()等。

并发集合: 并发集合是线程安全的集合类,包括ConcurrentHashMap、CopyOnWriteArrayList等。这些集合类内部采用了多种同步机制,如分段锁、乐观锁等,以确保线程安全。

ConcurrentHashMap: ConcurrentHashMap是线程安全的HashMap实现,它采用分段锁技术,提高并发性能。分段锁将数据分为多个段,每个段有自己的锁,从而允许多个线程同时访问不同的段。

CopyOnWrite容器: CopyOnWriteArrayList等容器在每次修改操作时,都会创建一个新的副本,从而保证线程安全。这种策略适用于读多写少的场景。

BlockingQueue: BlockingQueue是线程安全的队列实现,它支持生产者和消费者模型。BlockingQueue内部采用了多种同步机制,如锁、条件变量等,以确保线程安全。

并发工具类:

  • Phaser:用于协调多个线程的执行顺序。Phaser类似于CyclicBarrier,但它提供了更灵活的同步机制。
  • Exchanger:用于在线程间交换数据。Exchanger允许两个线程在某个时刻交换数据,然后继续执行。
  • FutureTask:用于异步执行任务。FutureTask允许一个线程提交一个任务,然后其他线程可以等待该任务的执行结果。

非阻塞算法: 非阻塞算法通过无锁编程技术,实现线程间的无锁交互。Java中,非阻塞算法的实现方式包括Atomic类、CAS操作等。

CAS原理: CAS(Compare-And-Swap)是一种无锁编程技术,通过原子操作比较并交换内存中的值。Java中,CAS操作通过Atomic类实现。

Atomic类: Atomic类提供了原子操作的方法,如AtomicInteger、AtomicLong等。这些类内部采用了CAS操作,确保操作的原子性。

无锁队列: 无锁队列是一种基于CAS原理的线程安全队列。无锁队列内部采用了CAS操作,确保线程安全。

并发框架

Netty线程模型: Netty采用主从多线程模型,提高并发性能。主线程负责接收客户端连接,从线程负责处理客户端请求。

Akka Actor模型: Akka是一个基于Actor模型的并发框架,它将并发编程抽象为消息传递。Actor是一个轻量级的线程,它通过消息传递与其他Actor进行通信。

Disruptor环形缓冲区: Disruptor是一个高性能的并发框架,它使用环形缓冲区实现无锁队列。环形缓冲区内部采用了CAS操作,确保线程安全。

二、MyBatis知识体系

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。

SQL映射

注解映射: MyBatis支持使用注解进行SQL映射,如@Select、@Insert、@Update、@Delete等。这些注解可以简化SQL映射的配置。

结果集映射: MyBatis支持将SQL查询结果映射到Java对象,包括基本数据类型、集合类型等。结果集映射可以通过XML配置或注解实现。

关联查询: MyBatis支持多表关联查询,通过配置关联关系实现数据映射。关联查询可以通过XML配置或注解实现。

动态SQL: MyBatis支持动态SQL,如<if>、<choose>、<foreach>等标签。动态SQL可以根据条件动态生成SQL语句。

OGNL表达式: OGNL表达式用于在MyBatis中实现动态SQL和结果集映射。OGNL表达式可以方便地访问对象属性、执行条件判断等操作。

分支语句: MyBatis支持分支语句,如<if>、<choose>等。分支语句可以根据条件动态执行不同的SQL语句。

批量操作: MyBatis支持批量操作,如批量插入、批量更新等。批量操作可以显著提高数据库操作效率。

缓存机制

一级缓存: MyBatis默认使用一级缓存,它存储在SqlSession中,只对当前SqlSession有效。一级缓存可以提高查询效率,减少数据库访问次数。

二级缓存: MyBatis支持二级缓存,它存储在应用范围内,可以跨SqlSession共享数据。二级缓存可以提高查询效率,减少数据库访问次数。

自定义缓存: MyBatis允许自定义缓存,通过实现Cache接口实现缓存逻辑。自定义缓存可以满足特定的缓存需求。

代理模式: MyBatis使用代理模式实现Mapper接口,降低代码耦合度。代理模式可以将数据库操作与业务逻辑分离,提高代码可维护性。

执行流程

MapperProxy: MyBatis使用MapperProxy代理Mapper接口,实现动态代理。动态代理可以将数据库操作与业务逻辑分离,提高代码可维护性。

插件拦截: MyBatis支持插件拦截,如拦截查询、更新、插入等操作。插件拦截可以扩展MyBatis的功能,如日志记录、性能监控等。

动态代理执行流程: MyBatis通过动态代理技术,拦截Mapper接口的方法调用,实现SQL映射和执行。动态代理技术可以提高代码执行效率,降低代码耦合度。

SqlSession生命周期

SqlSession: MyBatis使用SqlSession管理数据库连接和事务。SqlSession是MyBatis的核心对象,它负责执行数据库操作。

生命周期: SqlSession的生命周期从创建到销毁,包括以下几个阶段:

  • 创建:通过SqlSessionFactory创建SqlSession。
  • 使用:执行数据库操作。
  • 关闭:释放数据库连接和事务资源。
执行器类型

执行器类型: MyBatis支持多种执行器类型,如简单执行器、批量执行器、缓存执行器等。不同的执行器类型适用于不同的场景。

延迟加载

延迟加载: MyBatis支持延迟加载,即在需要时才加载关联数据。延迟加载可以提高查询效率,减少数据库访问次数。

扩展机制

类型处理器: MyBatis使用类型处理器将数据库数据类型转换为Java类型。类型处理器可以提高数据转换效率,降低代码耦合度。

拦截器链: MyBatis使用拦截器链拦截SQL执行过程,如分页拦截器、日志拦截器等。拦截器链可以扩展MyBatis的功能,如性能监控、日志记录等。

方言支持: MyBatis支持多种数据库方言,如MySQL、Oracle、SQL Server等。方言支持可以提高数据库操作效率,降低代码耦合度。

通过以上对并发编程和MyBatis知识体系的详细解析,我们可以更好地理解并发编程和MyBatis的核心概念和实现原理。在实际开发中,我们可以结合这些知识点,解决实际问题,提高代码质量和系统性能。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

lerobot VLA--SmolVLA代码的讲解 2.图像resize至正方形224x224,图像长宽比不变,其他区域用黑色补充,标记为mask=1,若占位图像(摄像头缺失),则 创建全-1像素的占位图像 标记为mask=0,image为[1, 3, 512, 512],img_mask为True,masks列表长度为2,img_masks为2,因为我这里两个相机。文本嵌入:通过embed_language_tokens() 被转换为嵌入表示,lang_emb 是语言的嵌入,包含了语言的语法和语义信息。1.像素值[0,1]->[-1,1] 阅读详情

相关推荐

USB-Type-C PCB布局布线设计规范

USB Type-C连接器有24个引脚。图1和图2分别显示了USB Type-C插座和插头的插针。母头/母座公头/插头可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流,在保证高速数据传输的同时也提高了电流承载能力。表 1 和表 2 分别汇总了在 USB Type-C 型插座和插头上所使用的信号列表。

weixin_63005522的博客 8286

并发编程与MyBatis知识精讲

允许自定义缓存实现,适用于特殊场景。自定义缓存需要实现Cache接口,并重写相关方法。

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

从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成

本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。

weixin_29294975的博客 362

并发编程精讲

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

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

保姆级教程:用OpenCV的calibrateHandEye()搞定机器人手眼标定(附Python代码)

本文详细介绍了如何使用OpenCV的calibrateHandEye()函数完成机器人手眼标定,解决机械臂与相机坐标系对齐问题。教程涵盖从基础原理、数据采集到Python代码实现的完整流程,特别适合需要精确视觉引导的机器人应用开发。通过手眼标定,可确保机械臂准确抓取相机检测到的目标物体。

weixin_33712987的博客 518

gradle报错:A problem occurred configuring root project ‘My Application‘.

即使翻译了,我开始也看不懂,到处找网上教程,但都是改环境变量。马虎的我即使看了很多遍,改了很多遍也没反应过来,今天第一次搞gradle,突然就报错了,打印出。好了我就继续看项目了。

m0_59878789的博客 4091

并发编程核心知识精讲

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

AIHacksCash的博客 575

NDVI空间分布变化Slope趋势分析与F检验(自用)

1.NDVI数据预处理2.一元线性回归分析3.Slope趋势分析与F检验

什么都学亿点点的博客 9020

并发编程与MyBatis深度解析

MyBatis允许自定义缓存,实现更复杂的缓存策略。

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

基于STM32的智能衣柜系统开发实战(附完整源码与硬件设计)

本文详细介绍了基于STM32的智能衣柜系统开发实战,包括硬件设计、软件架构和云端功能实现。系统具备实时温湿度监控、自动加热除湿、紫外线杀菌等核心功能,通过STM32F103C8T6主控芯片和ESP8266无线模块实现智能控制。附完整源码与硬件设计,适合科技爱好者和开发者参考。

peach的博客 782

liquibase扩展支持达梦数据库

近期项目中需要支持国产数据库,需要liquibase底层支持达梦数据库,记录下操作的详细步骤以便分享。 1.liquibase支持的数据库很多如MySQL, PostgreSQL, Oracle, Sql Server, DB2。但是达梦数据库并不支持,所以需要新建DMDatabase类来适配达梦数据库。达梦语法和Oracle很像所以只需要复制liquibase-core下的Oracle Database做些修改就可了。以下为需要修改的地方 public class DMDatabase extends A

qq_43677719的博客 5473

并发编程与MyBatis核心解析

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

AIHacksCash的博客 945

初识 QML

QML 是一种声明性语言,允许根据用户界面的可视组件以及它们如何相互交互和相互关联来描述用户界面。QML 是一种高度可读的语言,旨在使组件能够以动态方式互连,并且允许组件在用户界面中轻松重复使用和自定义。 使用 Qt Quick,开发人员可以轻松地在 QML 中构建流体动画用户界面,并且可以选择将这些用户界面连接到任何后端 C++ 库。

青春不老,奋斗不止! 1万+

并发编程与MyBatis精髓

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

JavaCodePro的博客 895

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

并发编程与MyBatis解析

MyBatis允许自定义缓存实现,以适应特定的应用场景。自定义缓存可以通过实现Cache接口来实现。

MoneyHacksPro的博客 868

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值