【Java高级架构必修课】:掌握requires transitive,构建高内聚低耦合系统

第一章:Java 9模块化系统的演进与意义

Java 9引入的模块化系统(Project Jigsaw)是自Java平台诞生以来最重大的架构变革之一。它通过将JDK分解为一组相互依赖的模块,解决了长期以来的“类路径地狱”问题,并增强了大型应用的可维护性与安全性。

模块化系统的核心目标

  • 提升代码的封装性,允许开发者明确声明哪些包对外可见
  • 构建可扩展的运行时镜像,支持更小、更高效的JVM部署
  • 增强平台的安全性和稳定性,避免非法访问内部API

模块声明示例

一个模块通过module-info.java文件进行定义。以下是一个简单模块的声明:

// module-info.java
module com.example.mymodule {
    requires java.base;           // 依赖基础模块
    requires java.logging;        // 使用日志功能
    exports com.example.service;  // 对外暴露服务包
}
上述代码中,requires关键字声明了模块依赖,exports则指定了哪些包可以被其他模块访问,实现了精细的访问控制。

模块化带来的优势对比

特性Java 8及之前Java 9+模块化系统
封装性仅靠public/protected控制,内部API可随意调用模块内未导出的包默认不可见
依赖管理基于类路径,易产生冲突或冗余显式声明依赖,编译和运行时验证
启动性能加载整个JRE按需加载模块,支持定制运行时
graph TD A[应用程序模块] --> B[java.base] A --> C[java.logging] B --> D[java.lang] C --> E[java.util.logging]
模块化不仅改变了JDK自身的结构,也为企业级应用提供了更强的工程化支持,使Java在微服务和云原生时代依然保持竞争力。

第二章:深入理解requires transitive关键字

2.1 模块依赖的传递性机制解析

在现代软件构建系统中,模块依赖的传递性是指当模块A依赖模块B,而模块B又依赖模块C时,模块A将自动继承对模块C的依赖关系。这种机制简化了依赖声明,提升了构建效率。
依赖传递的工作流程
构建工具(如Maven、Gradle)在解析依赖树时会递归扫描每个模块的依赖项,并将其合并到全局依赖图中。若未显式排除,传递性依赖将被纳入编译路径。
<dependency>
    <groupId>org.example</groupId>
    <artifactId>module-b</artifactId>
    <version>1.0</version>
    <!-- module-b 内部依赖 module-c,将自动传递 -->
</dependency>
上述配置中,即使未直接声明 module-c,它仍会作为传递依赖加入项目。
依赖冲突与仲裁策略
  • 路径最短优先:选择依赖树中路径更短的版本
  • 声明顺序优先:先声明的依赖优先保留
  • 可使用 <exclusions> 显式排除传递依赖

2.2 requires与requires transitive的对比分析

在Java模块系统中,requires和requires transitive用于声明模块间的依赖关系,但语义存在关键差异。
基本语法与作用域
module com.example.core {
    requires java.logging;
    requires transitive com.example.api;
}
上述代码中,requires java.logging;表示当前模块仅内部使用日志模块;而requires transitive com.example.api;则表明该API不仅被当前模块使用,还向所有依赖本模块的其他模块公开暴露。
传递性行为对比
  • requires:依赖仅限当前模块可见,下游模块需显式声明依赖才能使用。
  • requires transitive:依赖自动传播,下游模块可直接访问被导出的包,无需重复声明。
此机制有助于构建清晰的依赖链,避免包泄露或重复引入,提升模块化系统的封装性与可维护性。

2.3 何时使用requires transitive的设计原则

在模块化设计中,`requires transitive`用于声明一个模块不仅依赖另一个模块,还将该依赖暴露给所有使用者。这种设计适用于构建公共基础库的场景。
典型使用场景
当你的模块封装了某个通用API(如日志接口),并希望引入该模块的其他模块能自动访问该API时,应使用`transitive`。
module com.example.core {
    requires transitive java.logging;
}
上述代码表示任何`requires com.example.core`的模块将自动可访问`java.logging`,无需显式声明。
依赖传递性对比
声明方式对下游模块可见?
requires否
requires transitive是

2.4 避免过度传递依赖的陷阱与最佳实践

在复杂系统中,依赖关系容易层层传递,导致模块耦合度高、维护困难。过度传递依赖会使一个微小变更引发连锁反应,显著增加系统风险。
依赖传递的常见问题
  • 间接引入不必要库,增大构建体积
  • 版本冲突:不同路径依赖同一库的不同版本
  • 测试困难:难以隔离单元进行验证
最佳实践示例

type Service struct {
    repo    UserRepository
    logger  Logger
}

func NewService(repo UserRepository, logger Logger) *Service {
    return &Service{repo: repo, logger: logger}
}
该代码采用显式依赖注入,避免通过全局变量或隐式加载传递依赖。构造函数明确声明所需组件,提升可测试性与可维护性。
依赖管理策略对比
策略优点缺点
直接注入清晰可控初始化逻辑复杂
服务注册器简化构建隐藏依赖关系

2.5 编译期与运行时的依赖可视性验证

在模块化开发中,依赖的可视性控制是保障封装性和安全性的关键。编译期通过访问修饰符(如 private、export)静态检查符号可见性,确保仅公开接口可被引用。
编译期检查示例
package internal

var privateVar = "不可导出"
该变量因首字母小写,在编译期即被标记为包内私有,跨包引用将导致编译错误。
运行时动态验证
某些语言在运行时进一步验证访问合法性。例如 Java 模块系统(JPMS)通过 module-info.java 显式声明导出:
module com.example.api {
    exports com.example.service;
}
未导出的包即使在类路径中,也无法被其他模块反射或调用。
  • 编译期:语法与符号可见性静态分析
  • 运行时:模块图解析与访问权限动态拦截

第三章:构建高内聚低耦合的模块架构

3.1 基于接口与服务的模块解耦设计

在现代软件架构中,模块间的低耦合是系统可维护性与扩展性的关键。通过定义清晰的接口,各服务可独立演进,仅依赖抽象而非具体实现。
接口契约示例
type UserService interface {
    GetUser(id int) (*User, error)
    CreateUser(u *User) error
}
上述 Go 接口定义了用户服务的核心行为,上层模块无需知晓其实现细节。只要遵循该契约,底层可自由切换数据库或远程调用方案。
依赖注入实现解耦
  • 通过工厂模式或依赖注入框架实例化具体服务
  • 运行时动态绑定接口与实现,提升测试灵活性
  • 避免硬编码依赖,降低模块间直接引用
这种设计使系统更易于横向扩展,并支持微服务架构下的独立部署与版本管理。

3.2 利用requires transitive实现API暴露策略

在模块化设计中,requires transitive 提供了一种精细的API暴露机制,允许模块将依赖自动传播给其使用者。
transitive关键字的作用
当模块A对模块B使用requires transitive,则任何需要模块A的模块也会隐式读取模块B,形成依赖传递。
module com.example.library {
    requires transitive java.logging;
    requires com.fasterxml.jackson.databind;
}
上述代码中,java.logging 被标记为可传递依赖,所有引用该库的模块均可访问日志API。而jackson.databind仅限库内部使用,外部不可见。
暴露策略对比
依赖类型是否传递适用场景
requires否内部依赖
requires transitive是公共API依赖

3.3 模块边界控制与封装强度优化

在大型系统架构中,模块边界控制是保障系统可维护性与扩展性的关键。合理的封装能有效降低耦合度,提升代码复用能力。
接口隔离与访问控制
通过定义清晰的公共接口并隐藏内部实现细节,可增强模块的封装强度。例如,在 Go 中利用包级私有(首字母小写)控制可见性:

package datastore

type client struct {
  conn string
}

func NewClient(connStr string) *client {
  return &client{conn: connStr}
}

func (c *client) Query(sql string) []byte {
  // 内部实现逻辑
  return []byte("result")
}
上述代码中,client 结构体对外不可见,仅暴露 NewClient 和 Query 方法,实现封装。
依赖注入提升解耦
使用依赖注入可动态配置模块依赖,避免硬编码。常见方式如下:
  • 构造函数注入:在实例化时传入依赖
  • 接口注入:通过方法注入满足接口的实现
  • 配置中心驱动:从外部加载模块配置

第四章:真实场景中的应用与优化

4.1 在公共库模块中合理导出依赖

在构建大型 Go 项目时,公共库模块的依赖管理直接影响项目的可维护性与版本兼容性。合理导出依赖能避免下游模块引入不必要的传递依赖。
显式声明导出依赖
通过 go.mod 文件中的 require 指令明确指定所依赖的模块版本,并使用 // indirect 注释区分直接与间接依赖:
module example.com/lib

go 1.21

require (
    github.com/pkg/errors v0.9.1
    golang.org/x/sync v0.2.0 // indirect
)
上述代码中,errors 是直接依赖,而 sync 被标记为间接依赖,表示其由其他依赖引入。开发者应定期清理无用的间接依赖,减少攻击面。
使用 replace 控制依赖路径
在多模块协作开发中,可通过 replace 指令临时指向本地或测试分支,提升调试效率:
replace example.com/internal/auth => ./local/auth
该机制避免频繁发布版本,同时确保最终构建时依赖可被正确解析。

4.2 多层架构系统中的模块依赖管理

在多层架构中,模块间的依赖关系直接影响系统的可维护性与扩展能力。合理的依赖管理能降低耦合度,提升组件复用率。
依赖注入示例

type UserService struct {
    repo UserRepository
}

func NewUserService(r UserRepository) *UserService {
    return &UserService{repo: r}
}
上述代码通过构造函数注入数据访问层实例,实现控制反转。UserRepository 接口抽象了数据操作,使 UserService 不依赖具体实现,便于单元测试和替换底层存储。
依赖层级规范
  • 表现层可依赖业务逻辑层
  • 业务逻辑层不可反向依赖表现层
  • 数据访问层仅被业务层调用
该规则确保调用方向单向流动,避免循环依赖,保障编译顺利进行。

4.3 使用jdeps工具分析传递依赖关系

Java 9 引入的 jdeps 工具是分析类依赖的强大命令行工具,尤其适用于识别项目中的传递依赖和模块间耦合。
基本使用方式
jdeps MyApplication.jar
该命令输出所有直接依赖的包和 JAR 文件。每一行显示一个类所依赖的外部包,帮助快速定位不必要的引入。
分析模块依赖
使用 --module 参数可查看特定模块的依赖:
jdeps --module java.sql
输出结果展示 java.sql 模块依赖的核心 API,如 java.base、java.logging 等。
生成依赖报告
结合 -dotoutput 可输出依赖图文件:
(需配合 Graphviz 处理 .dot 文件生成可视化图表)
这有助于在大型系统中识别循环依赖与冗余路径。

4.4 模块循环依赖的识别与重构方案

模块间的循环依赖会破坏系统的可维护性与测试能力。识别此类问题通常可通过静态分析工具,如 Go 的 `import cycle` 检测或 Webpack 的构建警告。
常见循环依赖示例

// module/user.go
package user
import "project/order"
func GetUser() { order.GetOrder() }

// module/order.go
package order
import "project/user"
func GetOrder() { user.GetUser() }
上述代码形成 user → order → user 的导入环路,编译器将报错。
重构策略
  • 提取公共接口到独立模块
  • 使用依赖注入解耦具体实现
  • 引入事件机制实现异步通信
通过将共享逻辑下沉至 internal/service 层,并定义抽象契约,可有效打破循环依赖结构。

第五章:未来架构趋势与模块化展望

微服务向细粒度演进
随着云原生生态的成熟,微服务正从粗粒度向更细粒度的函数级架构演进。Serverless 框架如 AWS Lambda 和 Google Cloud Functions 允许开发者以事件驱动的方式部署独立逻辑单元。例如,在电商系统中,订单创建可触发库存扣减、积分更新等多个无状态函数:
func HandleOrderCreated(ctx context.Context, event OrderEvent) error {
    go DeductInventory(event.ProductID, event.Quantity)
    go AwardLoyaltyPoints(event.UserID, event.Amount)
    return nil
}
模块化设计的工程实践
现代应用通过模块化实现高内聚、低耦合。Go 的 module 机制和 Java 的 JPMS(Java Platform Module System)支持显式依赖声明。在大型项目中,模块划分通常遵循业务域边界,如下表所示:
模块名称职责依赖项
user-core用户身份管理auth-service
payment-gateway支付通道集成user-core, audit-log
可插拔架构的实现路径
通过接口抽象与依赖注入,系统可支持运行时模块热插拔。Kubernetes 的 CRD(Custom Resource Definition)机制允许扩展集群能力而无需修改核心代码。典型实现方式包括:
  • 定义标准化插件接口
  • 使用 sidecar 模式隔离模块运行环境
  • 通过配置中心动态加载模块元数据
[图表:模块间通信拓扑] user-service → API Gateway → auth-plugin, logging-plugin
YOLOv8作物病害检测实战源码 这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

【Java平台架构升级必读】:掌握transitive传递性,构建高内聚模块系统

掌握Java 9模块化设计精髓,解决模块间依赖管理难题。通过合理使用requires transitive传递性,明确模块导出边界,提升系统高内聚与可维护性,适用于大型项目架构升级,值得收藏。

codeink的博客 1037

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Java模块化转型迫在眉睫:requires transitive让你领先一步掌握未来架构

掌握Java 9模块化设计关键技巧,解决依赖管理难题。深入解析Java 9模块的 requires transitive 机制,涵盖适用场景与核心优势,提升模块间依赖传递效率。构建高内聚低耦合系统架构更轻松,值得收藏。

ProceShoal的博客 664

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【Java 9模块化深度解析】:requires transitive关键字的5大核心用途与陷阱规避

掌握Java 9模块化关键技巧,深入解析requires transitive的5大应用场景与避坑指南。涵盖模块依赖传递、API暴露控制、编译运行时行为差异等核心要点,提升模块设计安全性与灵活性。Java开发者值得收藏的深度指南,点击了解最佳实践。

LearnPlex的博客 822

PX4环境git submodule update --init --recursive失败的解决办法

最近开始搭建PX4环境,搭建是需要从github下载工程,然后使用语句git submodule update --init --recursive更新工程子模块,但往往由于网络原因这一步需要很久,甚至会失败。因为github是外网,在上面下载代码会受到很大限制,往往会出现下面的问题: 即无法连接到github,查阅了相关资料后,我发现了解决更新子模块失败的方法: 1.打开你下载的PX4源码,即Firmware文件夹,找到其中的.gitmodules,如下图: 2…gitmodules有以上格式,path

qq_36903625的博客 1万+

揭秘Java 9模块requires transitive:为何你的模块暴露了不该暴露的包?

掌握Java 9模块requires transitive传递性原理,避免模块意外暴露内部包。详解其在依赖传递中的作用机制与典型应用场景,揭示如何精准控制API可见性,提升封装性与安全性。理解关键字差异,构建清晰模块边界,值得收藏。

FuncInk的博客 265

ST MCSDK V6.2.0实战:手把手教你配置HSO-ST观测器,体验500ms收敛的电机无感控制

本文详细介绍了ST MCSDK V6.2.0中HSO-ST观测器的配置方法,实现500ms内电流收敛的无感电机控制。从环境搭建、核心参数解析到无感启动优化,提供实战技巧和性能调优策略,帮助开发者快速掌握高效电机控制技术。

weixin_28720767的博客 580

基于 MATLAB 的综合能源系统建模案例 

电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。

qq_57128262的博客 1395

requires transitive到底何时该用?资深架构师告诉你4种最佳实践

掌握Java 9模块化设计精髓,深入解析requires transitive传递性适用场景。涵盖接口抽象、公共工具、框架扩展与版本兼容4种最佳实践,明确依赖暴露边界,提升模块封装性与维护性。架构设计关键技巧,值得收藏。

Instrustar的博客 407

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6458

模块化项目踩坑实录,requires transitive你真的用对了吗?

解决Java模块化依赖难题,深入解析Java 9 模块 requires transitive 传递性机制。涵盖适用场景、依赖导出原理与常见误区,帮助开发者正确设计模块间可见性。掌握核心用法,提升项目结构清晰度与维护性,值得收藏。

FuncTide的博客 354

Oracle Scheduler任务故障诊断 实战指南

当基础环境无异常时,需聚焦任务本身的配置与状态。定义(JOB)→ 调度(SCHEDULE)→ 执行(SLAVE进程)→ 日志(LOG),每个环节都可能存在卡点。Oracle Scheduler任务的“隐性故障”看似棘手,实则是环境配置、资源竞争、时间逻辑等问题的集中体现。通过本文的诊断工具和排查思路,你可以构建从“基础环境→任务配置→执行链路→日志追踪”的全维度分析体系,让每一个“消失”的任务都无所遁形。

Nuzbb的博客 1074

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

本示例演示如何在 Gazebo 物理模拟器中设置 Universal Robotics UR10 机械臂和仿真环境。您需要配置一个机器人从树上摘苹果的仿真环境。本示例演示如何利用这些工具箱,使用 Universal Robotics UR10 机械手模拟机器人检测并从树上摘取苹果。Robotics System Toolbox™ - 在 Simulink® 和 Gazebo 中对机械手进行建模、规划和模拟。Navigation Toolbox™ - 生成三维环境的占用图。

机器人控制与仿真应用 4182

模块间依赖管理混乱?深入理解requires transitive的传递性机制,一文搞定

解决模块依赖混乱难题,深入解析Java 9模块requires transitive传递性机制。涵盖适用场景、依赖传递原理与模块封装优势,帮助开发者精准控制API暴露范围,提升项目可维护性,一文掌握核心实践方法,值得收藏。

ByteChat的博客 457

2025年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++初中组试卷1:带解析)(7月6日试卷)

2025年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++初中组试卷1:带解析)(7月6日试卷)

王老师青少年编程 1960

【Java高级架构师必备技能】:彻底搞懂Java 25模块依赖管理机制

掌握Java 25模块导入声明的依赖管理,解决大型项目模块化难题。详解模块间依赖声明、适用场景与编译优化,提升系统可维护性与加载效率。架构设计更清晰,值得收藏。

FastDebug的博客 622

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 25发布后必学:模块依赖管理的5个关键最佳实践

掌握Java 25模块导入声明的依赖管理,提升项目构建效率与模块化设计。本文详解适用微服务与大型应用的五大最佳实践,涵盖声明优化、依赖隔离与版本控制等核心方法,助力开发者实现清晰、可维护的模块结构。值得收藏

CompiGlow的博客 785

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

Java模块化实战:从module-info.java解析到项目迁移指南

模块化是现代软件开发中的核心架构思想,它通过将系统拆分为高内聚、低耦合的独立单元来提升代码的可维护性和复用性。其原理在于定义清晰的接口契约和依赖关系,确保各模块边界明确。在Java生态中,Java 9引入的模块系统(JPMS)通过module-info.java文件实现了这一理念,解决了长期存在的“JAR地狱”和依赖管理混乱问题。该技术显著提升了大型应用的可维护性,并支持通过jlink创建定制化运行时镜像以优化部署。在实际应用场景中,模块化特别适用于微服务架构、库开发和大型企业级系统。本文聚焦于Java模块

weixin_34284188的博客 497

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

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

模块化开发困局如何破?,深度解读Java 9 module-info.java设计原理与最佳实践

破解模块化开发难题,深度解析Java 9模块系统module-info.java配置原理与实战技巧。涵盖模块封装、依赖管理与服务发现机制,提升项目可维护性与安全性,适用大型应用架构设计,值得收藏。

LogicNest的博客 961

【Java平台演进关键一步】:彻底搞懂模块化下第三方库的正确使用姿势

掌握Java模块化下第三方库的集成方案,解决依赖冲突与类路径难题。涵盖module-info配置、自动模块使用及常见适配技巧,提升项目稳定性与可维护性,Java模块格第三方库应用全解析,值得收藏。

ProceShoal的博客 701

Java Class文件版本与模块化开发实战指南

Java字节码版本控制是保证跨版本兼容性的关键技术,class文件的主版本号与JDK版本严格对应。理解这一机制对于解决常见的UnsupportedClassVersionError等运行时问题至关重要。从Java 9开始引入的模块系统(JPMS)通过requires/exports等关键字实现了强封装性和可靠配置,大幅提升了大型项目的可维护性。开发实践中,通过--release编译参数和多版本JAR(MRJAR)技术可以实现向后兼容,而jlink工具则能创建精简化的定制运行时环境。这些技术在微服务架构和云原

weixin_30431445的博客 154

Java核心概念与编程实践指南

Java作为面向对象编程语言的代表,其核心概念包括数据类型系统、运算符原理和控制结构设计。数据类型分为基本类型和引用类型,直接影响内存使用和程序性能。运算符包含算术、关系和位运算等,理解其底层机制能避免常见陷阱。控制结构如if-else和循环的优化写法能提升代码可读性。面向对象三大特性(封装、继承、多态)是构建健壮系统的基石,而集合框架与泛型则提供了高效的数据处理能力。在并发编程领域,线程池和并发工具类的合理使用能显著提升系统吞吐量。掌握这些Java基础核心概念,是进行Spring框架开发和微服务架构设计的

weixin_33728708的博客 309
上一篇: url_prefix嵌套难题全解析,彻底搞懂Flask蓝图路由优先级与加载机制
下一篇: 【Java并发编程进阶】:corePoolSize动态调优实践,提升系统稳定性300%
SimTrans
博客等级 码龄1年 158粉丝 2004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值