Nacos作为Dubbo注册中心时Consumer更新Provider的机制

Nacos服务治理—负载均衡 如果通过使用OpenFeign访问远程的服务提供者,则可以配置由于网络、连接、读取等问题出现访问失。在使用注册中心时,OpenFeign作为服务间通信的组件,它本身集成了负载均衡能力、错误重试、日。志、服务熔断等机制,同时也能够支持点对点的通信方式,让开发者感觉更像是调用本地接口,而不是。缓存有可能和远程的注册信息不一致,所以引入长连接的订阅实现Nacos的主动通知更改。具体的服务降级是依赖Sentinel组件实现的,所以需要添加Sentinel依赖。2、可以全局或者局部配置使用设置的负载均衡策略。 阅读详情

目录

一、RegistryDirectory

二、NacosRegistry

三、NacosNamingService

四、HostReactor

1、立即获取更新

 2、定时更新配置

五、EventDispatcher

六、PushReceiver

七、获取最新Provider实例的三种方式

八、新增加Provider的日志分析


一、RegistryDirectory

Consumer端启动时,Dubbo的RegistryDirectory中向Nacos发起订阅,并把自己做为回调通知的Listenering执行器:

当Nacos中注册的Provider实例有发生变化时,会及时的收到回调通知,RegistryDirectory.notify(List<URL> urls)方法会被调用,用于处理接收到的新的Provider实例:

二、NacosRegistry

RegistryDirectory的subscribe(URL url)方法通过NacosRegistry中的doSubscribe(...)方法,往Nacos服务端发起注册及获取Provider信息:

方法doSubscribe(URL, NotifyListener)中根据Consumer端的url生成对应的Provider服务名称,如此时consumer的url如下:

consumer://192.168.22.198/cn.raysonblog.shopserviceprovider.service.RpcShopService?application=shop-service-consumer&category=providers,configurators,routers&dubbo=2.0.2&generic=false&interface=cn.raysonblog.shopserviceprovider.service.RpcShopService&lazy=false&logger=log4j2&methods=sayHello,getConfigServiceName&pid=397&qos.enable=false&release=2.7.3&side=consumer&sticky=false&timestamp=1629807903321

此时生成的Provider服务名称serviceNames为:

providers:cn.raysonblog.shopserviceprovider.service.RpcShopService::

三、NacosNamingService

在方法doSubscribe(URL, NotifyListener, Set<String>)中通过namingService.getAllInstances(serviceName)获取当前Consumer对应服务的所有Provider节点,namingService代表的类为NacosNamingService ,在该类中会通过getAllInstances(...)方法调用HostReactor的getServiceInfo方法获取ServiceInfo对象:

四、HostReactor

getServiceInfo(...)方法会判断本地是否已经有Provider节点信息,如果没有则通过updateServiceNow(...)立即从Nacos服务获取:

 以下将立即获取更新及将更新加到定时任务中分别说明。

1、立即获取更新

updateServiceNow(...)方法中是通过HTTP请求向Nacos获取最新的配置信息:

此处的serverProxy对象是NamingProxy类的实例,queryList(...)方法:

会调用Nacose服务的接口“/nacos/v1/ns/instance/list”获取数据,传入的参数:

  • namespaceId:指定获取配置的命名空间,dubbo可以通过配置项dubbo.registry.address中的nacos地址中增加namespace参数进行指定,如下所示:

  • serviceName:当前Consumer应用的要获取的Provider的服务名称,Consumer自动生成,类似如下所示:
DEFAULT_GROUP@@providers:cn.raysonblog.shopserviceprovider.service.RpcShopService::
  • clusters:暂时不清楚,代码中也没有注释,默认情况下是new了一个空的ArrayList<String>,到这里时该参数的值ArrayList中的值按英文逗号分隔后的拼接:StringUtils.join(clusters, ","),因而其值还是空字符串"";
  • udpPort:用于接收Nacos的UDP连接的端口,Nacos服务端往当前应用发送推送消息时,就往该端口推送,接收UDP的实现为PushReceiver,后面单独介绍该实现;
  • clientIp:当前应用所在服务器的IP地址,用于接收Nacos服务的UDP推送等;
  • healthOnly:用于指定是否只获取健康的Provider示例,默认值为false,跟了一下queryList方法的调用,共有三个地方且都在HostReactor中,传入的值都是false,因而目前还没有发现可以通过配置修改该值;

调用Nacos服务获取Provider信息的接口,可能成功也可能失败,如果失败则不更新Provider的信息;如果成功则会比较本地与从服务端获取的进行刷新时间的比较,以便于确认其是否为过期服务等验证,验证通过后才会使用新的Provider信息更新本地的Provider信息,如下HostReactor.processServiceJSON(String)方法所示:

 2、定时更新配置

定时更新是方法scheduleUpdateIfAbsent(serviceName, clusters)调用其中的addTask方法增加到定时任务中:

public synchronized ScheduledFuture<?> addTask(UpdateTask task) {
    return executor.schedule(task, DEFAULT_DELAY, TimeUnit.MILLISECONDS);
}

初次执行周期延迟为DEFAULT_DELAY,默认值为1000,即1秒。

 其中UpdateTask为真正执行的线程,检查是否有新的Provider节点信息,实现如下:

 通过UpdateTask的线程实现可以得知,Nacos作为注册中心时,Consumer会通过HostReactor中的UpdateTask线程间隔10秒去服务端拉取最新的Provider信息实现的,作为对监听即时回调的补充,避免由于监听回调用处理失败导致不能够获取到完整的Provider实例的问题。

五、EventDispatcher

HostReactor.processServiceJSON(String)方法会调用EventDispatcher.serviceChanged(ServiceInfo)方法,将变化的ServiceInfo加入到名为changedServices的LinkedBlockingQueue队列中,然后会通过EventDispatcher中的线程Notifier进行处理:

EventListener会调用Dubbo服务提供者变更通知NotifyListener的实现类RegistryDirectory,通知Dubbo Consumer端发起对这些可用Provider的连接,如果原来有连接也会重新发起连接,后面会有操作步骤及日志展示。

六、PushReceiver

PushReceiver为Consumer接收Nacos服务端UDP通知的监听器,以单独的线程进行监听,分为三种消息类型:dom、service及dump,dom及service消息类型都是服务端给Consumer发送消息,如Provider节点变更消息,然后通过hostReactor.processServiceJSON(...)处理这些信息,如下图红枉中的代码所示;dump消息类型为服务端希望获取Consumer的中现在的Provider信息:

但是不论我是增加新的Provider还是断掉Provider,该线程就从来没有读取到数据,说明Nacos服务端没有通过UDP消息的方式往客户端推送消息,那问题来了,Nacos服务端会在什么时候触发UDP通知呢?

七、获取最新Provider实例的三种方式

综上所述,Nacos做为Dubbo注册中心时,获取到最新的Provider实例有以下三种方式:

1、通过注册的回调处理的org.apache.dubbo.registry.integration.RegistryDirectory.notfity()方法,即时的接收实例变更的回调用;

2、通过线程com.alibaba.nacos.client.naming.core.HostReactor.UpdateTask定期的去查询当前应用的Provider实例,避免由于监听回调用处理失败导致不能够获取到完整的Provider实例的问题;

3、通过UDP服务com.alibaba.nacos.client.naming.core.PushReceiver线程,接收Provider实例变化的通知,虽然在本次调试中没有触发这样的请求,但是其应该是有触发机制的。

八、新增加Provider的日志分析

现在已经启动一台Provider以及一台Consumer,现在观察一下新增加Provider时,Consumer在获取到新的Provider,除了对新节点进行重连以下,是否会重新对已经存在Provider再次发起连接。

启动第二台Provider 2

先看一下启动第二个Provider节点的启动日志:

55分19秒启完成,55分20秒显示成功注册到Nacos。

查看Consumer此时的日志变化:

 Consumer在55分21秒的时候显示收到Nacos的通知,并在同一秒的时间成功与Provider连接。

通过上面的日志可以看到,Provider在启动成功后的一秒钟之内,Consumer收到通知并成功与Provider进行连接。

与此同时Provider 1的日志控制台有重新注册到Nacos的日志:

启动第三台Provider 3

先看一下启动第三个Provider节点的启动日志:

 56分17秒启完成,56分18秒显示成功注册到Nacos。

查看Consumer此时的日志变化:

Consumer在56分21秒的时候显示收到Nacos的通知,并在同一秒的时间成功与Provider连接。

通过上面的日志可以看到,Provider在启动成功后的四秒钟之内,Consumer收到通知并成功与Provider进行连接。

与此同时Provider 1的日志控制台有重新注册到Nacos的日志:

与此同时Provider 2的日志控制台有重新注册到Nacos的日志: 

通过以上几个Provider的加入及日志分析,说明Consumer有重新往原来已经建立了连接的Provider发起了建立连接的请求。 

集成Nacos1.2.1和Dubbo2.7.6 消费者报错No provider available for the service xxx maven依赖 <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.6</version> </dependency... 阅读详情

相关推荐

深入解析Dubbo注册中心:从核心机制到生产实践

在微服务架构中,服务注册与发现是支撑分布式系统协同工作的基础组件,其核心原理在于解耦服务提供者与消费者,实现动态的服务地址管理。通过心跳机制、健康检查与事件推送等技术,注册中心确保了服务实例状态的实时感知与列表的最终一致性,从而为系统提供了高可用与可扩展性的技术价值。这一机制广泛应用于电商、金融等需要处理高并发、多实例的业务场景。本文以Dubbo Registry为例,结合**服务发现**与**心跳机制**等热词,深入剖析其从接口级到应用级的数据模型演进,并对比主流实现如Nacos、ZooKeeper的选型

387

1.Dubbo 常见错误及解决方法

1.Dubbo 常见错误及解决方法 地址找不到:No provider available 找不到服务,这时候可能有这么几种情况: Provider 服务没启动,或者注册中心Nacos宕机了。 Dubbo 的服务配置有误差,必须保证服务名,组别(默认是 Dubbo ),version 三者都正确。 排查: 访问注册中心的 Ops 系统,查询对应的服务是否有提供者列表;同时检查调用者应用所在服务器的日志(一般每种注册服务的客户端都会有对应的日志记录),查看是否有地址信息的推送/拉取记录。 如无,则表明发布者发

FirstMrRight的博客 2029

Nacos 1.x 注册中心核心原理与本地实操指南

在微服务架构中,服务注册与发现是实现服务间动态通信的基石。其核心原理在于维护一个中心化的服务注册表,服务提供者启动时向注册中心注册自身信息,并通过心跳机制维持健康状态;服务消费者则从注册中心拉取或订阅服务提供者列表,实现动态寻址。这项技术对于构建高可用、可扩展的分布式系统具有关键价值,广泛应用于电商、社交、金融等需要应对流量波动和实例动态变化的场景。本文聚焦于阿里巴巴开源的Nacos 1.x,深入剖析其作为注册中心时,默认采用的AP一致性模型和基于心跳的健康检查机制,并通过本地环境搭建,带你亲手验证服务注册

culuo8053的博客 492

[RPC学习]Dubbo+nacos实现动态更新内存RTree

dubbo+nacos实现注册中心和配置中心,在分布式场景下动态更新内存RTree数据

龙大 616

Dubbo+Spring Boot+Nacos整合实战:构建高性能微服务架构

在微服务架构中,服务发现与远程过程调用(RPC)是核心基础组件。其原理在于通过注册中心实现服务的自动注册与发现,解耦服务提供者与消费者。Dubbo作为一款高性能的Java RPC框架,提供了强大的服务治理能力。结合Spring Boot的快速开发特性和Nacos作为一体化服务发现与配置管理中心,能够显著提升微服务架构的**简化配置**与**动态治理能力**。这种组合方案尤其适用于需要高并发、低延迟通信的业务场景,例如电商交易、实时数据处理等。通过本文,您将掌握如何将三者无缝整合,构建一个配置简洁、易于运维的

weixin_30555515的博客 315

Spring Boot整合Dubbo与Nacos:构建微服务通信基础

在分布式微服务架构中,服务注册与发现是实现服务间高效通信的核心机制。其基本原理是通过一个中心化的注册中心,动态管理服务实例的地址信息,从而实现服务的自动发现与负载均衡。这一技术为微服务架构提供了关键的弹性与可扩展性,广泛应用于电商、金融、物联网等需要高并发、高可用的业务场景。Nacos作为一款集服务发现、配置管理于一体的开源平台,以其轻量、易用和功能全面著称,成为众多团队替代传统ZooKeeper的首选方案。通过将Nacos与高性能RPC框架Dubbo结合,开发者可以快速搭建稳定可靠的微服务通信基础设施。本

weixin_30521161的博客 392

Dubbo源码解读-Consumer消费端服务列表刷新

RegistryDirectory.notify(List invokerUrls)监听三个节点providers,configurators,routers根据Url中的目录(category),设置具体协议urlinvokerUrls:dubbo协议:providers目录routerUrls:router协议:routes目录configuratorsUrl:overide协议:configurators处理协议:routerUrls:routes目录变动。

胖墩儿没腹肌 3015

Dubbo应用级服务注册发现机制解析与优化

在分布式服务架构中,服务注册与发现是确保系统高可用的关键技术。其核心原理是通过注册中心维护服务提供者与消费者的动态映射关系,实现服务的自动发现与负载均衡。传统RPC框架如Dubbo早期采用接口级注册,存在元数据膨胀和注册中心压力大的问题。Dubbo 2.7引入的应用级服务注册发现机制,通过将注册粒度从接口提升到应用级别,显著优化了性能与可维护性。该技术通过减少注册中心数据量、降低网络请求次数,并支持更灵活的服务治理策略,特别适用于微服务架构下的高并发场景。结合Zookeeper等注册中心的使用,应用级注册在

weixin_34364071的博客 994

Dubbo注册中心故障深度解析:Provider与Consumer全行为链路

注册中心作为Dubbo微服务架构的核心组件,其故障影响范围广,但通过Dubbo的“本地缓存+长连接复用”核心设计,以及Provider/Consumer侧的容错、兜底优化,可最大限度降低故障影响。本文通过对注册中心故障分类、Provider与Consumer完整行为链路的深度解析,结合大厂高可用实践,给出了全流程的治理方案,核心结论如下:注册中心故障的核心影响边界是“新服务注册、新Consumer订阅、状态动态变更”,不影响已建立连接的服务调用,这是Dubbo高可用的核心基础。

qq_16500963的博客 1019

Dubbo:Dubbo服务发现

1、创建service2工程父级pom.xml

流楚丶格念的博客 2620

HFSS微带线仿真从零到一:材料参数与求解设置优化指南

在射频电路设计中,微带线仿真涉及电磁场求解与传输线理论,其精度高度依赖材料参数和求解设置。相对介电常数、损耗角正切和导体电导率等参数直接影响特性阻抗与插入损耗,而求解频率、网格划分和参数扫描则决定仿真效率与收敛性。合理设置这些参数可显著提升S参数准确性,避免设计迭代。应用场景包括天线馈线、滤波器和微波互连。本文基于HFSS微带线仿真实践,系统讲解材料选择与参数优化全链路,帮助工程师快速复现可靠模型。

weixin_29192211的博客 79

【Dubbo】高性能的 RPC

/ 接口需单独打包,供消费者引入(1)Dubbo 基于 RPC 协议,性能优异,适合对通信效率要求高的内部服务,需单独处理服务治理。(2)OpenFeign 基于 HTTP 协议,依赖 Spring Cloud 生态,适合简单的跨服务调用,整合成本低。两者均可通过 Nacos 实现服务注册与发现,Nacos 作为注册中心时,需在配置中指定其地址,并确保服务启动后成功注册。

weixin_44823875的博客 981

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2770

Nacos配置中心和注册中心

nacos常用的两个功能,配置中心以及注册中心

bear_309的博客 1149

UDS诊断ISO14229新手入门篇

这个命令的格式稍微复杂一点。sub-function = 0x06 用于读取某个 DTC 及其相关的环境数据,此时 parameter 为 4 个 byte,前三个 byte 用于标识我们要读取的 DTC,第四个 byte 用于标识要读取的环境数据的范围,UDS 规定使用 FF 来表示读取所有的环境数据,各厂家可以要根据自己的需求定义其他的值来代表要读取的环境数据的范围。环境数据包括 DTC 状态,优先级,发生次数,老化计数器,时间戳,里程等,厂家还可以根据自己的需求定义一些此 DTC 产生时的测量数据。

weixin_45387165的博客 1972

企业固定资产管理的SAP实战:FICO模块配置与折旧范围设置详解

本文深入解析了SAP FICO模块中固定资产会计配置的核心实践,重点阐述了折旧范围的设计哲学与配置逻辑。通过详解折旧表、折旧范围、资产分类及折旧码等关键配置步骤,指导企业如何搭建满足多会计准则(如CAS、IFRS)与税务要求的资产管理体系,实现资产购置、折旧计提与报废清理的自动化与精准化。

wdx01234567的博客 728

Spring Boot整合Dubbo与Nacos:微服务通信实战与避坑指南

微服务架构通过将单体应用拆分为独立、松耦合的服务,提升了系统的可扩展性和可维护性。其核心原理在于服务间的通信与协调,这通常依赖于服务注册与发现机制。在Java生态中,Apache Dubbo作为一款高性能的RPC框架,是实现这一通信的关键技术,它通过高效的网络传输和序列化协议,为服务调用提供了低延迟、高并发的解决方案。结合阿里巴巴开源的Nacos作为服务注册中心,不仅能实现服务的自动注册与发现,还能提供动态配置管理,极大地简化了微服务的治理工作。本文聚焦于Dubbo 3.x与Nacos 2.x在Spring

weixin_34056162的博客 462

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 768

深入解析Dubbo注册中心:微服务架构的神经中枢与实战指南

服务发现是微服务架构的核心基础,它解决了分布式系统中服务实例动态寻址的关键问题。其基本原理基于发布-订阅模型,服务提供者向中心节点注册自身信息,消费者则订阅所需服务,从而实现了服务位置的透明化与动态更新。这一机制的技术价值在于解耦了服务间的硬编码依赖,支撑了服务的弹性伸缩、故障自愈和高可用部署。在云原生和动态部署场景下,服务发现更是实现持续交付和敏捷运维的基石。本文聚焦于Apache Dubbo框架的注册中心模块,深入剖析其作为微服务“神经中枢”的设计理念与实现机制,并结合Nacos、ZooKeeper等主

weixin_34174322的博客 374

STM32项目分享:智能家居语音系统

(资料分享见文末)基于STM32的智能家居语音系统温湿度采集:系统通过DHT11模块采集温湿度烟雾监测:通过MQ-2模块采集环境中烟雾浓度光照强度采集:通过BH1750传感器采集环境光照强度窗帘控制:通过步进电机转动模拟窗帘控制风扇控制:通过继电器和指示灯模拟风扇驱动照明控制:通过继电器和指示灯模拟照明驱动蜂鸣器报警:环境烟雾异常情况下蜂鸣器报警OLED显示:显示温湿度、光照强度和烟雾浓度APP功能:使用机智云APP,包括功能有控制照明灯和风扇开关、显示当前温湿度信息。

qq_44016222的博客 4146

Vue+OpenLayers:解决中国境内OpenStreetMap地图加载问题

然而,在使用OpenLayers和Vue框架搭建地图应用时,很多中国开发者可能会遇到一个常见问题:OpenStreetMap(OSM)地图无法正常加载。为了解决这个问题,我们可以使用其他方式获取地图数据,比如使用国内的地图服务提供商。通过使用国内地图服务商提供的地图数据,我们可以解决OpenStreetMap地图加载问题。然后,我们创建一个OpenLayers地图对象,并指定地图图层的源为国内地图服务商提供的地图URL。属性,可以将地图的中心点和缩放级别调整到我们需要的位置。

CodeWhizZ的博客 8270

Dubbo面试八股文:服务暴露、Nacos适配与性能调优全解析

在微服务架构中,RPC框架是解决分布式服务间高效通信的关键技术,而Dubbo正是Java生态中极具代表性的RPC与服务治理框架。理解Dubbo的核心原理,不能只停留在负载均衡、集群容错等孤立概念上,而应从服务暴露、服务引用、注册中心适配、SPI扩展机制这一完整链路入手。Dubbo通过URL作为配置总线,结合Invoker与动态代理模型,实现了透明的远程调用;同时支持Nacos等注册中心实现服务自动发现与上下线感知。在实际工程中,合理选择序列化方案(如Hessian2、Kryo)和调优线程池、超时参数,能够显

weixin_33802505的博客 372

C#实战大华智能安防系统:从SDK封装到视频流与智能报警的全链路落地

本文将介绍C#集成大华SDK开发安防系统的实战经验,重点解决多路视频预览卡顿和报警延迟问题。文章通过三层架构设计(SDK封装层、业务服务层、应用层)实现解耦,详细分析线程安全封装、高效解码显示和智能事件联动等核心技术。针对16路摄像头同时预览时CPU占用率过高的问题,提出使用子码流拉流与异步解码的优化方案,并总结8个常见开发陷阱的解决方案。文中还提供了大华智能安防系统的完整架构图,展示从设备层到应用层的交互流程,特别强调业务服务层中视频流服务和智能报警服务的核心功能设计。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 428

Dubbo架构

本文深入解析了Apache Dubbo架构的核心组件与运行机制。Dubbo作为高性能Java RPC框架,包含服务提供者(Provider)、消费者(Consumer)、注册中心(Registry)和监控中心(Monitor)四大核心组件。文章详细阐述了服务注册发现流程、负载均衡策略(随机/轮询等)及容错机制(Failover等),并对比了同步与异步调用模式的适用场景。通过Mermaid流程图直观展示了各组件交互关系,强调了注册中心解耦、本地缓存保障高可用等设计特点。

无论云泥意贯一 462

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Nacos 1.x 注册中心核心原理:心跳机制、服务发现与Distro协议详解

在微服务架构中,服务注册与发现是实现服务治理的基础能力,其核心在于管理服务实例的动态上下线与健康状态。其工作原理通常涉及客户端注册、服务端存储、健康检查与状态同步等环节,通过心跳机制维持实例活性,并利用推送或拉取机制实现服务列表的准实时更新。这一技术为分布式系统提供了高可用的服务寻址能力,支撑了弹性伸缩与故障自愈。具体到Nacos 1.x这一广泛应用的注册中心,其设计采用了AP模型,优先保证可用性,通过客户端主动上报心跳维护临时实例,并依赖其自研的Distro协议在集群内异步同步数据,最终达成一致性。对于微

weixin_30487201的博客 358

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

springcloud alibaba系列:整合springcloud alibaba+nacos+dubbo

Spring Cloud Alibaba 是由阿里巴巴开发的一套微服务一站式解决方案。它基于 Spring Cloud规范,可以让你用简单的方式,快速搭建起功能强大的分布式应用系统。它的诞生,主要是为了给当时进入维护模式的 Spring Cloud Netflix 提供一个更强大、更全面的第二代实现方案。

Rosen's 547

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

上一篇: Nacos配置中心回调机制
下一篇: NacosSync从Eureka批量同步应用到Nacos改造完成
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值