提升Maven构建效率:一招解决第三方插件无法skip的烦恼

Maven插件跳过技巧:如何用phase参数绕过不支持skip的第三方插件 本文深入探讨了Maven插件执行控制的进阶技巧,重点介绍了如何利用phase参数绕过不支持skip的第三方插件。通过动态修改phase绑定,开发者可以灵活控制插件执行,显著提升构建效率。文章详细解析了Maven生命周期机制,并提供了多环境构建的实战配置策略与高级技巧。 阅读详情

突破Maven构建瓶颈:巧用生命周期阶段实现插件动态管控

你是否经历过这样的场景:本地调试代码时,一个无关紧要的第三方插件却固执地消耗着你宝贵的几秒钟构建时间,而你却对它束手无策?对于追求极致效率的开发者而言,每一次不必要的构建延迟都是对工作流顺畅度的侵蚀。Maven作为Java生态中坚如磐石的构建工具,其插件生态庞大而复杂,但并非所有插件都贴心地提供了skip这个“紧急制动”按钮。当面对那些不支持跳过机制的第三方插件时,我们需要的不是妥协,而是一种更精巧、更符合工程思维的解决方案。

今天,我们将深入探讨一种基于Maven生命周期核心机制的技巧,它不仅能让你优雅地“绕过”插件的执行,更能让你建立起一套灵活、可控的构建策略。这种方法不依赖于任何外部工具或黑客手段,纯粹是利用Maven自身的设计特性,实现构建流程的精细化管控。无论你是独立开发者,还是需要维护复杂CI/CD流水线的团队负责人,掌握这项技巧都将显著提升你的构建体验和整体交付效率。

1. 理解Maven插件执行的底层逻辑

要解决问题,首先得理解问题产生的根源。Maven的构建过程本质上是一个由生命周期(Lifecycle)、阶段(Phase) 和目标(Goal) 构成的精密系统。

1.1 生命周期与阶段的绑定关系

Maven预定义了三个标准的生命周期:clean、default(构建)和site。每个生命周期由一系列有序的阶段组成。例如,default生命周期就包含了我们熟知的 validate、compile、test、package、install、deploy 等阶段。

插件目标(Goal)通过与特定阶段(Phase)绑定来执行。在pom.xml中,当你在插件的<execution>块内指定了<phase>,就意味着:“请在这个生命周期阶段到达时,执行此插件目标”。

<execution>
    <!-- 绑定到package阶段 -->
    <phase>package</phase>
    <goals>
        <goal>jar</goal>
    </goals>
</execution>

注意:如果一个插件执行没有指定<phase>,它可能通过其默认生命周期映射或通过命令行直接调用目标来触发。

1.2 为什么有些插件没有skip参数?

skip参数并非Maven核心的强制规范,而是插件开发者提供的一种约定俗成的便利特性。官方插件(如maven-compiler-plugin, maven-surefire-plugin)普遍遵循这一约定,通过检查skip属性来决定是否执行。

然而,第三方插件的开发者可能因为以下原因未实现skip参数:

  • 功能设计:认为该插件目标至关重要,不应被跳过。
  • 简化逻辑:减少配置的复杂性。
  • 疏忽或优先级:未将可跳过性视为高优先级功能。

这就导致了我们在使用某些代码质量检查、自定义打包、文档生成或部署插件时,即使在不必要的场景下(如本地快速构建),也无法通过简单的-DskipPlugin=true来规避其执行耗时。

2. 核心策略:利用不存在的阶段实现“软跳过”

既然无法从插件内部“关闭”它,我们可以换一个思路:从Maven调度层面“绕过”它。我们的核心策略是:动态地将插件绑定到一个不存在的生命周期阶段。

2.1 策略原理剖析

Maven在执行构建时,会按顺序遍历命令行指定的生命周期阶段(例如mvn clean package会执行到package阶段)。对于每个阶段,Maven会执行所有绑定到该阶段及之前阶段的插件目标。

关键点在于:如果一个插件目标被绑定到一个根本不存在的阶段(例如none、skip或never),那么在任何标准的生命周期运行中,这个目标都永远不会被触发。因为Maven永远不会去执行一个不存在的阶段。

我们可以利用Maven属性(Property)来实现绑定阶段的动态化:

  1. 在pom.xml中,使用一个属性(如${custom.plugin.phase})作为插件执行的<phase>值。
  2. 为该属性设置一个有效的默认阶段(如package),确保在常规构建(CI/CD)时插件能正常执行。
  3. 当需要跳过时,通过命令行参数为该属性赋予一个无效的阶段名(如none)。此时,插件被绑定到“none”阶段,而Maven生命周期中没有此阶段,故插件被跳过。

2.2 一个完整的配置示例

假设我们有一个名为third-party-generator-plugin的插件,它会在package阶段生成一些辅助报告,耗时约3秒,这在CI服务器上是必需的,但在本地开发时则希望跳过。

以下是如何在pom.xml中配置:

<project>
    ...
    <properties>
        <!-- 定义一个属性来控制插件阶段,默认值为‘package’ -->
        <generator.plugin.phase>package</generator.plugin.phase>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>com.example</groupId>
                <artifactId>third-party-generator-plugin</artifactId>
                <version>1.0.0</version>
                <executions>
                    <execution>
                        <id>generate-reports</id>
                        <!-- 关键:阶段由属性动态控制 -->
                        <phase>${generator.plugin.phase}</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <!-- 插件原有的配置 -->
                            <reportType>detailed</reportType>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

执行方式对比:

场景命令插件执行情况说明
CI服务器构建mvn clean deploy执行使用属性默认值package,插件在package阶段正常触发。
本地快速构建mvn clean package -Dgenerator.plugin.phase=none跳过属性被覆盖为none,插件绑定到不存在的阶段,被跳过。
仅编译mvn clean compile跳过即使属性默认值为package,但生命周期只执行到compile阶段,未到达package,插件自然不执行。

提示:选择无效阶段名时,避免使用可能在未来被Maven保留的词汇,简单的none、skip或noop都是不错的选择。

3. 高级应用与工程化实践

掌握了基础技巧后,我们可以将其融入更复杂的开发工作流和团队协作规范中,使其价值最大化。

3.1 多环境构建配置管理

在真实的项目开发中,我们通常面临本地开发、测试环境构建、生产环境构建等多种场景。我们可以将上述技巧与Maven的Profile(配置文件) 功能结合,实现环境感知的自动配置。

创建针对本地开发的Profile:

<profiles>
    <profile>
        <id>local-dev</id>
        <activation>
            <!-- 通过系统属性或文件是否存在自动激活 -->
            <activeByDefault>false</activeByDefault>
            <property>
                <name>env</name>
                <value>local</value>
            </property>
        </activation>
        <properties>
            <!-- 在local-dev profile中,自动将插件阶段设置为无效值 -->
            <generator.plugin.phase>skip-in-local</generator.plugin.phase>
            <!-- 可以同时控制多个此类插件 -->
            <docgen.plugin.phase>skip-in-local</docgen.plugin.phase>
        </properties>
    </profile>
</profiles>

这样,开发者在本地构建时,只需在IDE的Maven运行配置中或命令行设置-Denv=local,即可自动跳过所有非必要的耗时插件,无需记忆和输入一长串-D参数。

3.2 与CI/CD工具的优雅集成

在Jenkins、GitLab CI、GitHub Actions等CI/CD流水线中,确保插件被执行至关重要。我们可以在流水线脚本中,显式地覆盖属性,强制插件在正确的阶段运行。

以GitLab CI为例:

stages:
  - build
  - deploy

maven-build:
  stage: build
  script:
    # 使用有效的阶段名覆盖,确保插件执行
    - mvn clean verify -Dgenerator.plugin.phase=verify -Ddocgen.plugin.phase=site
  artifacts:
    paths:
      - target/*.jar

与“跳过测试”的协同:我们常使用-DskipTests来跳过单元测试。对于插件控制,我们可以设计更统一的命令,提升体验:

# 一个命令,同时跳过测试和不必要的插件
mvn clean install -DskipTests -Dgenerator.plugin.phase=none -DslowCheck.plugin.phase=none

3.3 处理多模块项目(Multi-Module Projects)

在多模块项目中,你可能只需要在某个或某几个子模块中应用此跳过策略。有几种方法:

  1. 父POM定义,子模块覆盖:在父POM的<properties>中定义通用的属性名和默认值。在特定的子模块POM中,可以重新定义该属性的值。
  2. 使用<pluginManagement>精细控制:在父POM的<pluginManagement>部分声明插件的配置和阶段绑定(使用属性)。子模块在引入该插件时,会自动继承此配置,但子模块仍然可以通过自己的<properties>来覆盖该属性的值。

这种方法确保了配置的一致性,同时为特定模块保留了灵活性。

4. 替代方案与利弊权衡

虽然“无效阶段绑定法”巧妙而有效,但它并非唯一选择。了解其他方案有助于你在不同场景下做出最佳决策。

4.1 主流方案对比

方案实现方式优点缺点适用场景
无效阶段绑定法动态修改<phase>为不存在的值。1. 无需修改插件代码。
2. 配置集中,易于管理。
3. 与Maven生命周期天然契合。
1. 对不熟悉生命周期的开发者有理解成本。
2. 需要预先在POM中配置好属性。
通用推荐方案,尤其适合需要区分环境(本地/CI)的团队。
Profile完全排除法将插件定义放在特定Profile(如ci-only)中。概念清晰,完全隔离。1. POM文件可能冗余。
2. 切换环境需要激活不同Profile,略显繁琐。
插件完全只在特定环境(如生产部署)需要,其他环境绝不需要。
命令行阶段控制法通过精确指定构建阶段来避免触发插件。例如,插件绑在package,本地只运行mvn compile。最简单,无需任何POM配置。1. 功能受限,如果插件绑在compile阶段就无法跳过。
2. 可能影响后续需要该阶段产物的操作。
插件绑定阶段较晚,且本地构建无需后续阶段时,可临时使用。
修改插件源码法Fork插件项目,为其添加skip参数支持。一劳永逸,行为最符合直觉。1. 技术门槛高,需维护分支。
2. 更新原插件版本困难。
团队内部高度定制化的核心插件,且有能力维护。

4.2 潜在风险与注意事项

在应用“无效阶段绑定法”时,有几点需要时刻留意:

  • 属性命名冲突:确保自定义的属性名(如generator.plugin.phase)在整个POM及父POM中唯一,避免意外覆盖。
  • 插件执行顺序:如果你的插件通过@phase注解在Mojo类中定义了默认生命周期阶段,并且在POM中没有显式配置<phase>,那么上述方法将失效。务必在POM中显式配置<phase>标签才能使用属性覆盖。
  • IDE集成:大多数IDE(如IntelliJ IDEA、Eclipse)能正确解析Maven属性。但在IDE的Maven工具窗口中,看到插件被绑定到一个“红色”(未知)的阶段时,不必惊慌,这是预期现象。
  • 团队沟通:这是一种“非标准”用法,务必在团队文档或POM注释中清晰说明这些自定义属性的用途,避免其他成员困惑。

5. 实战:构建一个可复用的“插件跳过”管理模板

为了让团队快速应用这一最佳实践,我们可以创建一个可复用的POM代码片段或项目模板。

5.1 定义统一的属性命名规范

建议在团队内部约定一个清晰的属性命名模式,例如: skip.[plugin-groupId].[plugin-artifactId].phase 或更简洁的: [plugin-artifactId].phase

在父POM或公司级BOM中预先定义好这些属性的默认值:

<!-- 公司级基础POM片段 -->
<properties>
    <!-- 代码生成类插件 -->
    <protobuf.generate.phase>generate-sources</protobuf.generate.phase>
    <openapi.generate.phase>generate-sources</openapi.generate.phase>
    <!-- 质量检查类插件 -->
    <spotbugs.check.phase>verify</spotbugs.check.phase>
    <checkstyle.check.phase>validate</checkstyle.check.phase>
    <!-- 打包部署类插件 -->
    <docker.build.phase>package</docker.build.phase>
    <asciidoctor.pdf.phase>prepare-package</asciidoctor.pdf.phase>
</properties>

5.2 创建本地开发辅助脚本

为团队成员创建便捷的脚本,简化命令行操作。例如,一个build-local.sh脚本:

#!/bin/bash
# build-local.sh - 用于本地快速构建,跳过所有非必要插件
MAVEN_OPTS_LOCAL="-Dprotobuf.generate.phase=none \
                  -Dopenapi.generate.phase=none \
                  -Dspotbugs.check.phase=none \
                  -Ddocker.build.phase=none \
                  -DskipTests"
echo "Starting local fast build..."
mvn clean compile $MAVEN_OPTS_LOCAL

或者,更灵活地使用Maven的.mvn/maven.config文件(Maven 3.3.1+)进行目录级别的默认参数配置。

5.3 性能提升效果量化

最后,让我们直观地感受一下这项优化带来的收益。假设一个中型项目,集成了以下插件:

插件功能默认执行阶段大致耗时本地构建是否必要?
生成Protocol Buffers代码generate-sources1.5s否(代码已生成)
运行SpotBugs静态分析verify4.0s否(CI中执行即可)
构建Docker镜像package3.0s否(仅部署需要)
生成AsciiDoc文档PDFprepare-package2.5s否

优化前本地构建(到package阶段)总耗时:基础编译打包时间 + 11秒 = ~XX秒。 优化后本地构建(到package阶段)总耗时:基础编译打包时间 = ~YY秒。

通过简单地应用本文介绍的方法,一次本地构建就能节省出超过10秒的等待时间。在一天数十次的编码-构建-测试循环中,节省下来的时间累积起来相当可观,它能让你更专注于代码逻辑本身,保持流畅的心流状态。

在我的团队中,我们将这套方法标准化后,新成员在入职第一天就能通过一个简单的命令享受到快速的本地构建。那种无需等待漫长检查过程的顺畅感,对于开发体验的提升是实实在在的。记住,好的工具链不应该成为思维的负担,而应该是隐形的助推器。

Maven插件跳过执行的黑科技:phase参数巧妙绕过skip限制 本文深入探讨了Maven插件跳过执行的黑科技,通过phase参数的巧妙运用解决第三方插件不支持skip参数的问题。详细解析了Maven插件执行机制,并提供了通过phase参数动态控制插件执行的实用方案,帮助开发者优化构建流程,显著提升持续集成效率。 阅读详情

相关推荐

【效率提升】maven 转 gradle 实战 | 京东云技术团队

gradle 是一个打包工具, 是一个开源构建自动化工具,足够灵活,可以构建几乎任何类型的软件,高性能、可扩展、能洞察等。其中洞察,可以用于分析构建过程中数据,提供分析参考,方便排查问题和不断优化构建性能,以下一次编译分析报告。

JDDTechTalk的博客 745

终极指南:Maven插件系统深度解析 - 扩展构建能力的核心机制

Apache Maven插件系统是Java项目构建自动化的核心引擎,为开发者提供了强大的扩展能力。通过插件机制,Maven能够将复杂的构建过程分解为可管理的任务单元,实现从代码编译到部署的全流程自动化。本文将深入解析Maven插件系统的核心机制,帮助您掌握如何利用插件扩展Maven的构建能力。 ## 📋 Maven插件系统架构概览 Maven插件系统基于**生命周期驱动**的设计理念,通过插

gitblog_00257的博客 631

Eclipse中Maven3插件的详解与应用

Maven3作为Java开发中广泛使用的构建自动化工具,其与Eclipse集成插件的作用不容小觑。通过Maven插件,Eclipse可以更高效地管理项目构建、依赖以及生命周期。开发者可以利用集成环境进行项目构建和管理,优化开发流程。虽然POM.xml本质上是一个XML文件,但Eclipse提供了一个图形化界面来编辑它。这使得编辑POM文件变得更加直观和便捷。不过,了解一些常用的XML编辑器也是有帮助的,特别是当你需要处理大型项目或直接编辑大量的XML文件时。

weixin_35973118的博客 1121

Maven 构建性能分析:瓶颈排查与优化建议

在使用 Maven 进行项目构建时,随着项目规模的扩大,构建时间可能逐渐变长,影响开发效率。:将构建过程集成到 CI/CD 工具中,使用自动化工具来管理构建任务,避免手动构建造成的时间浪费,并能通过并行构建进一步加快构建速度。:使用 Maven Wrapper 可以确保构建使用的是一致的 Maven 版本,避免因 Maven 版本差异导致构建不一致的问题。命令用于启用 Maven 的调试模式,可以输出详细的构建日志,帮助我们分析构建过程中的各个步骤和潜在问题。:通过排除不必要的依赖来减少构建的时间。

秋元的博客 958

Maven 3.3.9:Mac平台下的Java项目管理与构建实战

本文还有配套的精品资源,点击获取 简介:Maven 3.3.9是一个关键版本,适用于Mac用户,提供了Java项目的自动化构建、依赖管理和项目信息管理。本文将深入探讨Maven的核心概念、安装步骤、配置管理以及如何在Mac环境下使用Maven进行Java项目的构建和管理。包括对POM、依赖管理、生命周期、插件系统的介绍,以及如何在Mac上安装、配置Maven,并使用Mave...

weixin_42584586的博客 1436

别再手动续期SSL证书了!用acme.sh配合阿里云DNS API,实现全自动HTTPS证书管理

本文详细介绍了如何使用acme.sh配合阿里云DNS API实现SSL/TLS证书的全自动管理,彻底解决手动续期带来的风险与不便。通过自动化部署流程,包括环境准备、API集成、多域名证书申请等关键步骤,帮助运维人员构建高效、可靠的HTTPS证书管理体系,显著提升安全性和运维效率。

weixin_29200485的博客 271

终极Dockerfile-Maven插件使用指南:快速构建和部署Docker镜像 [特殊字符]

Dockerfile-Maven插件是Spotify开发的一款强大的Maven集成工具,专门用于简化Java项目的Docker镜像构建和发布流程。通过将Docker构建过程无缝集成到Maven生命周期中,这个插件让开发者能够更高效地管理容器化应用。无论你是Java开发新手还是经验丰富的DevOps工程师,掌握Dockerfile-Maven都能显著提升你的工作效率。 ## 🔥 为什么要使用Do

gitblog_00260的博客 840

音乐频谱灯的硬件艺术:从STM32到SK9822LED的工程美学

本文探讨了基于STM32微控制器和SK9822 LED的音乐频谱灯硬件设计与实现。通过ADC采集音频信号,利用FFT算法进行频谱分析,并驱动LED阵列呈现动态视觉效果,展现了硬件工程与艺术美学的完美融合。

Pepper的专栏 218

Dockerfile Maven 插件终极指南:5分钟学会构建和推送Docker镜像 [特殊字符]

想要在Maven项目中轻松构建和推送Docker镜像吗?Dockerfile Maven插件正是你需要的终极工具!这个强大的插件将Docker构建过程无缝集成到Maven生命周期中,让你用熟悉的Maven命令就能完成所有Docker操作。无论你是Java、Node.js还是Python开发者,这个插件都能帮你简化Docker镜像管理流程。 ## 为什么选择Dockerfile Maven插件?

gitblog_01170的博客 964

基于TDOA的chan算法(定位算法)

Chan算法原理 TDOA(TDOA,the time differences of arrival,到达时间差),Chan算法是TDOA定位方法的一个很好用的方法。 Chan算法是非递归双曲线方程组解法,具有解析表达式解,主要特点是:在测量误差服从理想高斯分布时,它的定位精度高、计算量小,并且可以通过增加已确定点的数量来提高算法精度。 该算法的推导前提是基于测量误差为零均值高斯随机变量,对于实际环境中误差较大的测量值,比如在有非视距误差的环境下,该算法的性能会有显著下降。二维情况下,可分为只有三个点参与定

优快云不再更新 2万+

Solidworks二次开发(C# .NET API):从零构建装配体与虚拟零件

本文详细介绍了使用C#进行Solidworks二次开发,从零构建装配体与虚拟零件的完整流程。通过.NET API实现设计自动化,涵盖环境搭建、核心对象模型、虚拟零件创建与外部化保存等关键技术,帮助工程师将重复性建模工作程序化,大幅提升设计效率与标准化水平。

alice7model的博客 607

Maven生命周期:构建流程深度解析

Maven生命周期是构建过程的核心框架,包含三个独立生命周期:clean(清理)、default(核心构建)和site(文档生成)。每个生命周期由有序阶段组成,执行命令时会自动触发前置阶段。default生命周期涵盖从validate到deploy的完整流程,包括编译、测试、打包和部署。关键特性包括阶段顺序执行、插件绑定机制和多模块构建支持。掌握生命周期可优化构建流程,常用命令如mvn install会执行全部前置阶段,而参数如-DskipTests可跳过测试。通过合理配置插件绑定和模块化构建,能显著提升开

2301_80215285的博客 1016

逆向工程实战:手把手教你破解药监局网站的动态数据加载机制(Python+Chrome开发者工具)

本文详细介绍了如何利用Python和Chrome开发者工具逆向破解药监局网站的动态数据加载机制。通过分析Ajax请求、解析JSON响应数据以及处理动态参数,帮助开发者高效采集动态加载内容,适用于爬虫开发与数据分析场景。

weixin_30832143的博客 68

idea maven vm options_IntelliJ Idea下Maven插件使用技巧

IntelliJ Idea下Maven插件使用技巧标签:Idea MavenIntelliJ Idea下Maven插件使用技巧,对于开发人员快速上手,并可能有效提高开发效率,特将此整理分享给大家。1、Idea下在右侧菜单可打开Maven操作面板,以及maven的设置窗口。2、可在如下设置栏修改为本地安装的Maven软件、配置文件和本地仓库。3、配置跳过测试代码的编译命令,效果同: -Dmaven....

weixin_39756192的博客 2575

旋转因子量化仿真

在单bit接收机中,通过量化FFT核函数来简化计算,将复数坐标中旋转因子单位圆上的点近似到正方形四个边上,就能够用累加实现复数乘法,从而避免使用DSP乘法器。通过仿真查看不同阶的核函数简化效果。

CyberInversion的博客 3105

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1305

Maven常见错误解决方案以及常用技巧

1、运行Maven是报错:No goals have been specified for this build 详细报错信息: No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format &lt;plugin-prefix&gt;:&l...

huxiutao的博客 1万+

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

有数据的地方就有存储, 内存是谁都离不开的产品。而动态随机存取存储器(DRAM)作为一种常见的内存。本博客将介绍DRAM的基本概念、工作原理、优缺点以及应用领域等方面。

串起点滴 3923

深入解析spotify/dockerfile-maven插件的使用指南

在现代Java应用开发中,容器化部署已成为标准实践。spotify/dockerfile-maven插件作为Maven生态中的重要工具,能够无缝地将Docker镜像构建过程集成到Maven构建生命周期中。本文将全面解析该插件的使用方法,帮助开发者高效完成容器化部署。 ## 插件核心功能概述 该插件提供了三个主要目标(Goal),每个目标都与Maven构建生命周期阶段紧密绑定: 1. **构建...

gitblog_00397的博客 435

深度学习工具包 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电路设计。

JavaFX Maven插件完整配置与使用指南

JavaFX Maven插件是由OpenJFX社区维护的官方插件,专门用于在Maven环境中运行和管理JavaFX 11+应用程序。该插件极大地简化了JavaFX项目的构建、运行和打包流程,支持模块化和非模块化项目结构。 ## 环境准备 ### 系统要求 - JDK 11或更高版本 - Maven 3.6.0或更高版本 - 支持的操作系统:Windows、Linux、macOS ### 获取

gitblog_01043的博客 1249

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IntelliJ Idea下Maven插件使用技巧

IntelliJ Idea下Maven插件使用技巧 标签:Idea Maven IntelliJ Idea下Maven插件使用技巧,对于开发人员快速上手,并可能有效提高开发效率,特将此整理分享给大家。 1、Idea下在右侧菜单可打开Maven操作面板,以及maven的设置窗口。 2、可在如下设置栏修改为本地安装的Maven软件、配置文件和本地仓库。 3、配置跳过测试代码的编译命令,效果同: -Dmaven.test.skip=true; 4、如下图进行项目的打包操作,按Ctrl按键可选择多个操作项。

软件攻城狮 1020

pscad IEEE标准系统搭建说明

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

[面试题]Maven

由于myapp-1.2 有新的主要功能的添加和变化,在发布测试前,它会变得不稳定,而 myapp-1.1 是一个比较稳定的版本,现在的问题是,我们在myapp-1.1中 发现了一些 BUG(当然在 1.2 中也存在),为了能够在一段时间内修复 BUG 并仍然发布稳定的版本,我们就会用到分支(branch),我们基于 1.1 开启一个分支 1.1.1 ,在这个分支中修复 BUG ,并快速发布。而在使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,Maven 会自动从镜像服务器上下载最新的快照版本。

春暖花开的日子 947

换掉 Maven?全新一代 Java 项目构建工具来了 —— **Maven-mvnd**,性能炸裂![特殊字符]

mvnd 不是取代 Maven,而是让 Maven 更快!对于仍在忍受 Maven 慢构建的团队——👉今天就可以尝试切换mvnd,5 分钟配置,立竿见影提速!项目地址:https://github.com/mvndaemon/mvnd官方文档:https://maven.apache.org/mvnd/让构建飞一会儿,开发快乐多十分 🚀。

weixin_44058951的博客 1682

Maven构建加速

Maven构建加速

兮动人 1179

【VSCode Java Maven 高效开发秘籍】:揭秘项目构建慢的5大元凶及优化方案

解决VSCode Java Maven目标构建慢难题,系统分析依赖解析、插件配置等5大瓶颈。涵盖日常开发典型场景,提供可落地的优化策略,显著提升编译效率与开发体验。值得收藏的高效开发指南。

SimProceed的博客 640
上一篇: 导航页总被墙?试试这个Docker+内网穿透方案,永久免费域名稳如老狗
下一篇: Git合并冲突急救指南:遇到‘MERGE_HEAD‘错误怎么办?(附真实案例解析)
寂静夜空35
博客等级 码龄3年 59粉丝 1797原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值