什么是微服务架构?

Spring Cloud微服务功能及其组件详细讲解 微服务是一种架构风格,它强调将大型复杂的系统功能根据业务需求切分为一系列小型、独立的服务。每个服务都专注于满足某个具体的业务需求,并且能够独立部署、运行和扩展。这种架构风格使得系统更加灵活、可维护,并且能够更好地应对业务变化和技术挑战。虽然微服务在初始阶段可能会增加开发和维护的难度,因为它要求团队具备更高的分布式系统开发和运维能力。但是,从长远来看,微服务带来的好处是显而易见的。它使得系统更加易于扩展,因为每个服务都可以独立地进行水平扩展,以满足不断增长的业务需求。 阅读详情

请添加图片描述


1. 前言

微服务(Microservices)是一种软件架构风格,它将一个大型应用程序拆分为一组小型、独立的服务。每个服务运行在自己的进程中,通过轻量级的通信机制(如 HTTP/REST 或消息队列)进行交互。每个微服务专注于完成特定的业务功能,并且可以独立开发、部署和扩展。


2. 为什么需要微服务架构?

微服务架构的兴起是为了解决传统单体架构(Monolithic Architecture)在开发、部署和维护大型复杂应用时面临的诸多问题。以下是需要微服务架构的主要原因:


2.1 解决单体架构的局限性

  • 单体架构的问题:
    • 随着应用规模的增长,代码库变得庞大且复杂,难以维护。
    • 所有功能模块耦合在一起,修改一个模块可能影响整个系统。
    • 部署周期长,即使只修改一个小功能,也需要重新部署整个应用。
    • 扩展性差,无法针对特定模块进行扩展。
  • 微服务的优势:
    • 将应用拆分为多个小型服务,每个服务独立开发、部署和扩展。
    • 降低代码耦合度,提高可维护性。

2.2 支持敏捷开发和持续交付

  • 单体架构的问题:
    • 开发团队需要协调所有模块的变更,导致开发效率低下。
    • 部署风险高,一个小错误可能导致整个系统崩溃。
  • 微服务的优势:
    • 每个微服务可以由独立的小团队开发和维护,支持快速迭代。
    • 独立部署的特性使得新功能可以快速上线,降低部署风险。

2.3 提高可扩展性

  • 单体架构的问题:
    • 扩展时需要复制整个应用,即使只有部分模块需要扩展。
    • 资源利用率低,无法针对高负载模块进行优化。
  • 微服务的优势:
    • 可以根据需求单独扩展某个服务,提高资源利用率。
    • 适合高并发场景,能够动态调整服务实例数量。

2.4 技术栈灵活性

  • 单体架构的问题:
    • 整个应用必须使用统一的技术栈,难以引入新技术。
  • 微服务的优势:
    • 每个服务可以使用最适合的技术栈(如编程语言、数据库)。
    • 便于尝试新技术,降低技术债务。

2.5 容错性和弹性

  • 单体架构的问题:
    • 单个模块的故障可能导致整个系统崩溃。
  • 微服务的优势:
    • 故障隔离,单个服务的故障不会影响其他服务。
    • 通过重试、熔断、降级等机制提高系统的弹性和容错性。

2.6 支持云原生和容器化

  • 单体架构的问题:
    • 难以充分利用云平台的弹性、可扩展性和自动化能力。
  • 微服务的优势:
    • 天然适合容器化(如 Docker)和编排工具(如 Kubernetes)。
    • 能够动态扩展和调度服务实例,充分利用云平台资源。

2.7 适应业务复杂性

  • 单体架构的问题:
    • 随着业务复杂性的增加,单体应用变得难以管理和扩展。
  • 微服务的优势:
    • 将复杂业务拆分为多个小型服务,每个服务专注于特定功能。
    • 便于理解和维护复杂系统。

2.8 支持多团队协作

  • 单体架构的问题:
    • 多个团队在同一个代码库上协作,容易产生冲突和瓶颈。
  • 微服务的优势:
    • 每个团队可以独立负责一个或多个服务,减少协作成本。
    • 支持并行开发和部署,提高开发效率。

2.9 提高资源利用率

  • 单体架构的问题:
    • 所有模块共享相同的资源,可能导致资源浪费。
  • 微服务的优势:
    • 每个服务可以独立配置资源(如 CPU、内存),优化资源利用率。

2.10 支持现代化开发实践

  • 微服务的优势:
    • 支持 DevOps 实践,如持续集成(CI)、持续交付(CD)。
    • 便于实现自动化测试、部署和监控。

3. 微服务架构特点及挑战

3.1 微服务架构的特点

  1. 单一职责:
    每个微服务只负责一个特定的业务功能,遵循单一职责原则。

  2. 独立性:
    每个微服务可以独立开发、测试、部署和扩展。
    使用不同的技术栈(如编程语言、数据库)来实现不同的服务。

  3. 轻量级通信:
    微服务之间通过轻量级的通信协议(如 HTTP/REST、gRPC、消息队列)进行交互。

  4. 去中心化:
    数据管理去中心化,每个微服务可以有自己的数据库。
    治理去中心化,每个服务可以有自己的配置和监控。

  5. 弹性与容错:
    微服务架构通常设计为具有弹性和容错能力,能够应对部分服务故障。

  6. 自动化:
    微服务的开发、测试、部署和运维通常依赖自动化工具(如 CI/CD、容器化、编排工具)。


3.2 微服务架构的挑战

微服务架构虽然提供了许多优势,如灵活性、可扩展性和技术栈自由度,但也引入了许多新的挑战。以下是微服务架构面临的主要挑战:

  1. 分布式系统的复杂性。微服务架构本质上是分布式系统,需要处理服务发现、负载均衡、网络通信、数据一致性等问题。需要引入额外的组件(如服务注册中心、API 网关)来管理服务间的通信。网络延迟和通信故障可能导致系统性能下降或服务不可用。
  2. 数据管理。每个微服务通常有自己的数据库,导致数据分散。数据一致性难以保证,尤其是在跨服务的事务中。需要引入分布式事务(如两阶段提交)或最终一致性方案(如事件溯源、CQRS)。数据查询可能涉及多个服务,增加了复杂性。
  3. 服务间通信。微服务之间需要通过网络进行通信。通信协议的选择(如 HTTP/REST、gRPC、消息队列)会影响性能和复杂性。需要处理通信故障、重试、熔断、降级等问题。网络延迟可能影响系统性能。
  4. 服务发现与负载均衡。在动态环境中,服务的实例可能随时启动或停止。需要实现服务发现机制(如 Consul、Eureka)来动态定位服务实例。需要负载均衡策略来分配请求流量。
  5. 运维复杂性。微服务架构涉及多个独立部署的服务。需要自动化工具(如 CI/CD、容器化、编排工具)来管理部署和扩展。监控和日志管理变得更加复杂,需要集中式日志和分布式追踪系统(如 ELK、Zipkin)。故障排查和调试更加困难。
  6. 测试。微服务架构中,服务之间存在依赖关系。需要实现端到端测试、集成测试和契约测试。测试环境的搭建和维护更加复杂。
  7. 安全性。微服务架构中,服务间的通信需要保护。需要实现身份验证、授权、加密通信等安全机制。需要管理多个服务的密钥和证书。
  8. 版本管理。微服务需要独立升级和发布。需要管理服务间的版本兼容性。需要实现向后兼容的 API 设计。
  9. 团队协作。微服务架构通常涉及多个团队协作。需要明确的团队职责划分和接口定义。需要协调多个团队的开发、测试和发布流程。
  10. 成本。微服务架构需要更多的硬件和软件资源。需要更多的服务器、容器实例和云资源。需要投资于自动化工具和监控系统。
  11. 文化和技术转型。微服务架构需要团队具备新的技能和思维方式。需要从单体架构向微服务架构转型,可能面临技术债务和团队抵触。需要培养 DevOps 文化和自动化运维能力。
  12. 性能优化。微服务架构中,服务间的通信可能成为性能瓶颈。需要优化网络通信、序列化和反序列化性能。需要设计高效的负载均衡和缓存策略。

微服务架构虽然提供了许多优势,但也引入了分布式系统的复杂性、数据管理、服务间通信、运维复杂性等挑战。为了成功实施微服务架构,团队需要具备相应的技术能力、工具支持和文化转型。在采用微服务架构之前,需要仔细评估其适用性,并制定合理的架构设计和运维策略。


4. 如何搭建微服务架构

在智能驾驶系统中搭建微服务架构需要结合智能驾驶的特点(如实时性、高可靠性、分布式计算等)和微服务架构的优势(如灵活性、可扩展性、独立部署等)。以下是搭建微服务架构的关键步骤和注意事项:

4.1 系统分析与服务拆分

  • 分析业务功能:

    • 将智能驾驶系统拆分为多个独立的业务功能模块,例如:
      • 感知模块(如摄像头、雷达数据处理)。
      • 定位与地图模块。
      • 决策与规划模块。
      • 控制模块(如转向、加速、制动)。
      • 人机交互模块(如仪表盘、语音交互)。
      • 数据存储与分析模块。
  • 确定服务边界:

    • 每个微服务应具有清晰的职责和边界,避免功能重叠。
    • 确保服务间的依赖最小化。

4.2 技术选型

  • 编程语言:
    • 根据模块需求选择合适的语言(如 C++ 用于高性能计算,Python 用于数据分析)。
  • 通信协议:
    • 使用高效的通信协议(如 gRPC、ROS 2、MQTT)实现服务间通信。
  • 数据存储:
    • 根据数据类型选择合适的存储方案(如时序数据库、关系数据库、分布式文件系统)。
  • 容器化与编排:
    • 使用 Docker 容器化微服务,并使用 Kubernetes 进行编排和管理。

4.3 服务设计与实现

  • 服务接口设计:
    • 定义清晰的 API 接口,确保服务间的松耦合。
    • 使用 Protobuf 或 JSON 定义数据格式。
  • 服务实现:
    • 每个微服务独立开发、测试和部署。
    • 确保服务的高性能和高可靠性。

4.4 服务通信

  • 同步通信:
    • 使用 gRPC 或 REST 实现服务间的同步调用。
  • 异步通信:
    • 使用消息队列(如 Kafka、RabbitMQ)实现事件驱动架构。
  • 服务发现:
    • 使用服务发现工具(如 Consul、Eureka)动态管理服务实例。
  • 负载均衡:
    • 使用负载均衡器(如 Nginx、Envoy)分配请求流量。

4.5 数据管理

  • 数据一致性:
    • 使用分布式事务或最终一致性方案(如 Saga 模式、事件溯源)。
  • 数据存储:
    • 每个微服务使用独立的数据库,避免数据耦合。
  • 数据流处理:
    • 使用流处理框架(如 Apache Flink、Kafka Streams)处理实时数据。

4.6 容错与弹性

  • 熔断与降级:
    • 使用熔断器(如 Hystrix、Resilience4j)防止服务雪崩。
  • 重试机制:
    • 实现重试策略以应对临时故障。
  • 监控与告警:
    • 使用 Prometheus、Grafana 监控系统状态,并设置告警规则。

4.7 安全设计

  • 身份验证与授权:
    • 使用 OAuth 2.0、JWT 实现服务间的身份验证和授权。
  • 数据加密:
    • 使用 TLS 加密服务间通信。
  • 访问控制:
    • 实现细粒度的访问控制策略。

4.8 部署与运维

  • 容器化部署:
    • 使用 Docker 将微服务打包为容器镜像。
  • 编排与管理:
    • 使用 Kubernetes 管理容器化服务的部署、扩展和故障恢复。
  • CI/CD 流水线:
    • 使用 Jenkins、GitLab CI 实现持续集成和持续交付。

4.9 监控与日志

  • 集中式日志:
    • 使用 ELK(Elasticsearch、Logstash、Kibana)或 Fluentd 收集和分析日志。
  • 分布式追踪:
    • 使用 Jaeger、Zipkin 追踪服务调用链。
  • 性能监控:
    • 使用 Prometheus 监控系统性能指标。

4.10 测试与验证

  • 单元测试:
    • 为每个微服务编写单元测试。
  • 集成测试:
    • 测试服务间的交互和集成。
  • 端到端测试:
    • 模拟真实场景,验证整个系统的功能。
  • 性能测试:
    • 测试系统在高负载下的性能表现。

4.11 团队协作与流程

  • 团队分工:
    • 每个团队负责一个或多个微服务的开发和维护。
  • 接口管理:
    • 使用 API 管理工具(如 Swagger、Apigee)定义和发布接口。
  • 文档与沟通:
    • 确保团队间的文档共享和有效沟通。

4.12 持续优化

  • 性能优化:
    • 根据监控数据优化服务性能。
  • 架构演进:
    • 根据业务需求和技术发展持续优化架构。

示例架构

以下是一个智能驾驶系统的微服务架构示例:

  1. 感知服务:
    • 处理摄像头、雷达等传感器的数据。
  2. 定位服务:
    • 提供车辆的精确定位信息。
  3. 规划服务:
    • 根据感知和定位数据生成行驶路径。
  4. 控制服务:
    • 执行转向、加速、制动等操作。
  5. 人机交互服务:
    • 提供仪表盘、语音交互等功能。
  6. 数据服务:
    • 存储和分析车辆运行数据。

总结

在智能驾驶系统中搭建微服务架构需要结合业务需求和技术特点,合理拆分服务、选择技术栈、设计通信机制,并解决分布式系统的复杂性、数据一致性、安全性等问题。通过合理的架构设计和工具支持,可以实现高性能、高可靠性的智能驾驶系统。


【1】浅谈汽车SOA架构开发和实施过程中的微服务化

微服务架构 一.认识微服务技术栈 (1)服务集群:根据业务功能模块拆分成一个个独自的项目,每个项目完成独自的功能,每个项目又称为独自的服务,每个服务构成了一个服务集群; (2)注册中心:由于服务多,肯定要记录每个服务的信息(ip 端口 功能)就用到了注册中心。每个服务在注册中心中注册,当用户进行调用服务,它首先到注册中心拉取服务信息再去调用相对于的服务 (3)配置中心:每个服务都会有各自的配置信息,便于统一管理,使用到配置中心,如果想更改服务的配置中心,就在配置中心上进行更改,配置中心会通知相关的服务实现配置 阅读详情

相关推荐

微服务架构(一)

SpringCloud Alibaba 介绍 2 创建 SpringBoot 主类 3 加入配置文件 创建 application.yml 4 创建必要的接口和实现类(controller service dao) 创建商品微服务 重复用户创建步骤,注意修改端口,服务名 创建订单微服务 重复用户创建步骤,注意修改端口,服务名 微服

m0_56492261的博客 2876

SpringCloud溯源——从单体架构到微服务Microservices架构 & 分布式和微服务 & 为啥要用微服务_springcloud单体项目转微服务

1.分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,而实际上这些服务是通过背后的众多服务器组成的一个分布式系统,因此分布式系统看起来像是一个超级计算机一样。

2401_89323952的博客 4690

从单体架构到微服务架构&最佳实践: Monolithic to Microservices Architecture

概述微服务是一种将软件应用程序开发为独立设置的小模块的方法,其中每个服务运行独特的进程。它通过定义明确的机制进行通信以达到目的。2011 年 5 月,威尼斯附近的软件工程师使用“微服务”这个术语来表达他们中许多人正在探索的通用编程风格。James Lewis 在 2012 年 3 月的案例研究中提出了一些想法,并将其命名为“微服务”。微服务是许多行业想要采用的一种。Net.........

AI天才研究院 1万+

ES8311音频Codec避坑指南:从I2C通信、电平匹配到回环测试的保姆级调试笔记

本文详细解析了ES8311音频编解码芯片的调试全流程,涵盖I2C通信建立、电平匹配、主从模式配置等关键环节。通过真实案例和实用技巧,帮助工程师快速定位和解决音频Codec常见问题,提升硬件调试效率。特别针对回环测试、功耗分析等高频故障点提供了可复用的排查方法论。

weixin_42532938的博客 275

NVIDIA B300 vs B200:详细解析与性能对决

详细解析 NVIDIA B300 整机)的性能,并与前代的 B200 进行对比。它不仅在核心计算能力(FP8)上实现了飞跃,更重要的是通过革命性的第二代 Transformer Engine 和第五代 NVLink 技术,彻底重塑了大规模 AI 模型训练和推理的效率与规模上限。其显存容量和带宽的巨大提升也为处理超大型模型和数据提供了坚实基础。与 B200 相比,B300 是一次全面的、代际性的性能跃升,特别适合那些需要处理最前沿、最复杂 AI 和科学计算任务的用户和组织。

2401_89353317的博客 3054

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

你是否在STM32CubeIDE中遇到过这样的崩溃场景?——精心编写的中文注释在重新生成代码后变成“锟斤拷”乱码,不仅影响代码可读性,反复修改更是浪费大量时间!作为STM32开发者,我曾被这个问题困扰许久,试过修改软件设置、工程编码却始终治标不治本。直到发现这个基于Java环境变量的终极解决方案,才彻底解决了中文乱码难题。

smart_boy__的博客 2958

Unable to negotiate with XXXX port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

打开ssh_config此文件,滑动到最下面,新增自己git主机地址(这里我直接默认*)执行命令 git clone git@xxxxxxxxxxxxx.git。代码仓库已经添加了ssh公钥之后,克隆代码到本地时就报了这个问题。首先是找到git安装目录(根据自己安装时选项,找到这个目录)再进入ssh目录,找到 ssh_config 配置文件。配置完成后,保存配置文件后再次去clone代码。直接复制下面这一段到文件中最底部位置即可。然后进入 etc目录,找到ssh目录。终于可以克隆下来了。

萌兔兔MMQ!! 3356

ChipCamp探索系列 -- 7A. 开源CPU之BOOM的来龙去脉

本文梳理一下Berkeley的乱序超标量CPU项目----Berkeley Out of Order Machine (BOOM),作为探索7系的首篇(7A)。

ChipCamp的博客---https://chipcamp.blog.youkuaiyun.com/ 1558

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 273

华为HCIP的学习大纲和计划

HCIP(华为认证 ICT 高级工程师)核心围绕华为 ICT 技术体系,不同方向(如路由交换、云计算、安全等)课程目录不同,以下是最热门的。

迷逝 575

华为OD机试 - 商品推荐多属性排序 - 数组(Python/JS/C/C++ 双机位A卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。双十一来临,小王准备买某个购物平台买坚果。在输入坚果时,页面默认按照综合推荐列表。小王想知道这个综合排序时如何完成的,于是便开始思考算法题。经过一番操作后,完成它的多个关键词排序算法。希望你给小王提供一份正确的排序结果,验证其实现算法结果的准确性

学Java,找哪吒 622

计算机控制技术及应用

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 【开源分享】spdlog,一款非常容易上手的 C++ 日志工具
下一篇: C++,STL 简介:历史、组成、优势
智驾
博客等级 码龄11年 6671粉丝 574原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值