keytool-importkeypair:Java密钥库导入外部密钥对的完整指南

YOLOv11改进 | 损失函数改进篇 | MPDIoU、InnerMPDIoU助力细节涨点(二次创新 + 代码解析) 本文为读者详细介绍了YOLOv11模型的最新改进,带来的改进机制是最新的损失函数MPDIoU和融合了最新的Inner思想的InnerMPDIoU(效果打爆之前的所有的损失函数提升检测精度和处理细节方面的作用。通过深入探讨MPDIoU和InnerMPDIoU(全网首发)的工作原理和实际代码实现,本文旨在指导读者如何将这些先进的损失函数技术应用到YOLOv11模型中,以提高其性能和准确性。文章内容涵盖从理论基础、代码实现,到实际教你如何添加本文的机制到你的模型中。 阅读详情

1. 项目概述:为什么你需要掌握 keytool-importkeypair?

如果你在Java开发、Android应用签名或者处理HTTPS证书时,曾经在命令行里和 keytool 工具打过交道,那你大概率遇到过这个场景:手头有一对现成的、由OpenSSL或其他工具生成的RSA密钥对(一个 .key 私钥文件和一个 .crt 或 .pem 证书文件),需要把它们导入到Java的密钥库(Keystore,通常是JKS或PKCS12格式)里。这时候,你打开 keytool 的文档,发现它只支持导入完整的证书链或者生成新的密钥对,对于“导入一个已有的私钥并关联一个证书”这种看似简单的操作,却束手无策。于是,你开始在网上搜索,最终找到了一个名为 keytool-importkeypair 的脚本或工具。这个项目,就是专门为解决这个痛点而生的。

简单来说, keytool-importkeypair 是一个Shell脚本(也有Python等语言的实现),它充当了 keytool 和OpenSSL等工具之间的“桥梁”。它的核心功能是,将你已有的、非Java标准格式的私钥和证书,经过一系列转换和打包,最终导入到指定的Java密钥库中,并生成一个可用的密钥条目。这对于需要复用现有密钥对、迁移证书系统或者自动化构建流程(比如为Android应用签名)的开发者来说,是一个不可或缺的利器。没有它,你可能需要手动进行一系列繁琐的格式转换和临时文件操作,既容易出错,又难以集成到CI/CD流水线中。

2. 核心需求与场景解析:谁在什么情况下会用到它?

2.1 典型应用场景

这个工具的应用场景非常集中且刚需,主要围绕Java生态下的安全认证和代码签名展开。

场景一:Android应用签名密钥迁移与自动化 这是最经典的应用场景。一个Android应用在发布时,需要使用一个固定的密钥库(Keystore)和别名(Alias)进行签名。假设你的团队最初使用OpenSSL生成了签名密钥对,或者从其他渠道获得了一对密钥。现在你需要将这对密钥导入到一个标准的JKS或 .keystore 文件中,以便Android Studio或Gradle构建脚本能够使用。手动操作几乎不可能,而 keytool-importkeypair 可以一键完成。

场景二:Java Web服务(如Tomcat, Spring Boot)的HTTPS证书部署 当你为内部服务或公有云服务申请了SSL/TLS证书(例如从Let‘s Encrypt获取的证书),证书颁发机构(CA)通常会给你一个私钥文件( privkey.pem )和一个证书文件( fullchain.pem )。Tomcat等Java应用服务器通常要求将私钥和证书链导入到一个PKCS12或JKS格式的密钥库中。虽然 keytool 可以导入证书,但它无法直接关联一个外部的私钥。此时, keytool-importkeypair 就能派上用场,帮你生成一个包含私钥和完整证书链的密钥库文件。

场景三:自动化构建与持续集成(CI/CD) 在DevOps流程中,一切讲究自动化。如果你的构建管道需要在某个环节动态创建或使用特定的密钥库(例如,为不同环境的应用包签名),手动交互式的 keytool 命令是不可接受的。 keytool-importkeypair 作为一个命令行工具,可以完美地集成到Shell脚本、Makefile或CI/CD平台的脚本步骤中,实现无人值守的密钥库管理。

2.2 工具链中的定位

理解 keytool-importkeypair 的定位,需要先了解Java标准工具链的“能力缺口”。

  • keytool (Java Key and Certificate Management Tool) :JDK自带的瑞士军刀,用于创建和管理密钥库与证书。但它主要设计用于处理X.509证书和由它自己生成的密钥对。其 -importcert 命令只能导入证书(公钥), -genkeypair 命令只能生成新的密钥对。它缺少一个“ -importkeypair ”的原生命令。
  • OpenSSL :功能强大的密码学工具箱,可以生成各种格式的密钥对和证书,是行业事实标准。
  • keytool-importkeypair :正是填补了上述缺口。它内部调用OpenSSL(或 openssl 命令)将PEM格式的私钥和证书打包成PKCS12格式的中间文件,然后再利用 keytool 将这个PKCS12文件导入到目标密钥库中。可以说,它是一个精巧的“胶水脚本”。

注意 :使用 keytool-importkeypair 的前提是系统环境中必须安装有OpenSSL。这也是为什么你有时会在网上看到“warning: ‘keytool‘ is not available, so the ca can‘t be automatically installed”这类错误,它可能源于OpenSSL的缺失或路径问题,虽然报错信息提到了 keytool ,但根因往往在OpenSSL。

3. 环境准备与工具获取

在开始实操之前,我们需要确保工作环境就绪。这个过程本身也是理解工具依赖关系的好机会。

3.1 系统环境检查

首先,打开你的终端(Linux/macOS)或命令提示符/PowerShell(Windows),检查两个核心依赖是否可用。

1. 检查Java JDK与keytool keytool 是JDK的一部分。运行以下命令检查其版本和可用性:

keytool -version

如果命令未找到,你需要安装Java Development Kit (JDK)。建议安装OpenJDK 8或11及以上版本,它们是长期支持(LTS)版本,兼容性最广。安装后,请确保JDK的 bin 目录(例如 /usr/lib/jvm/java-11-openjdk-amd64/bin 或 C:\Program Files\Java\jdk-11\bin )已添加到系统的PATH环境变量中。

2. 检查OpenSSL keytool-importkeypair 脚本的核心转换工作依赖OpenSSL。运行以下命令检查:

openssl version

如果未安装,你需要根据操作系统进行安装:

  • Ubuntu/Debian : sudo apt update && sudo apt install openssl
  • CentOS/RHEL : sudo yum install openssl
  • macOS : 通常已预装,或可通过Homebrew安装: brew install openssl
  • Windows : 可以从 OpenSSL官方网站 下载安装包,或者如果你安装了Git for Windows,它自带了一个可用的 openssl 。安装后同样需要将OpenSSL的 bin 目录加入PATH。

3.2 获取 keytool-importkeypair 脚本

这个工具本身只是一个脚本文件,没有复杂的安装过程。最经典的版本是一个Bash Shell脚本。你可以通过多种方式获取:

方式一:从GitHub直接下载(推荐) 该工具的一个流行版本托管在GitHub上。你可以使用 curl 或 wget 下载:

# 使用curl
curl -O https://raw.githubusercontent.com/douglascrockford/JSON-java/master/tools/keytool-importkeypair

# 或者使用wget
wget https://raw.githubusercontent.com/douglascrockford/JSON-java/master/tools/keytool-importkeypair

下载后,你需要赋予脚本执行权限:

chmod +x keytool-importkeypair

方式二:克隆相关仓库 有些项目将这个工具作为其代码库的一部分。你也可以克隆整个仓库然后找到它。

git clone https://github.com/douglascrockford/JSON-java.git
cd JSON-java/tools
chmod +x keytool-importkeypair

方式三:使用包管理器(部分Linux发行版) 在某些发行版的仓库中,可能有打包好的版本。例如,在Arch Linux的AUR中,可以搜索 keytool-importkeypair 。但通过GitHub下载是最通用、最直接的方式。

实操心得 :我建议将下载好的 keytool-importkeypair 脚本放在一个固定的目录,比如 ~/bin/ ,并确保该目录在PATH中。这样你可以在任何位置直接调用它,就像使用系统命令一样方便。在Windows上,如果你使用Git Bash或WSL,同样可以这样操作;如果使用纯Windows命令行,可能需要一个Python或PowerShell版本的脚本,或者通过WSL来运行这个Bash脚本。

4. 核心参数详解与命令结构

拿到脚本后,先别急着运行。花几分钟理解它的参数,能让你在后续使用中游刃有余,避免因参数错误导致密钥库损坏。我们可以通过 --help 参数查看其用法:

./keytool-importkeypair --help

典型的输出会包含所有可用参数。下面我们来逐一拆解这些核心参数,并解释其背后的逻辑。

4.1 输入文件参数:你的“原料”是什么?

  • -k <keystore> : 目标密钥库文件路径 。这是最终要写入的JKS或PKCS12文件。如果文件不存在,脚本会尝试创建它(需要提供 -p 参数指定新密钥库的密码)。
  • -p <keystore-password> : 目标密钥库的密码 。这是访问整个密钥库的密码,非常重要。如果密钥库是新建的,这个密码将被设置;如果密钥库已存在,则必须提供正确的密码。
  • -pk8 <pk8-file> : PKCS#8格式的私钥文件 。这是关键输入之一。通常我们手中的私钥是PEM格式( -----BEGIN PRIVATE KEY----- ),脚本内部需要PKCS#8格式。别担心,如果给的是PEM私钥,脚本会调用OpenSSL自动转换。
  • -cert <certificate-file> : X.509证书文件 。这是另一个关键输入,通常是 .crt 或 .pem 格式,内容以 -----BEGIN CERTIFICATE----- 开头。证书中包含了公钥和主体信息。
  • -key <key-file> : (可选)PEM格式的私钥文件 。如果你提供的是传统的PEM私钥( -----BEGIN RSA PRIVATE KEY----- ),可以使用这个参数,脚本会将其转换为PKCS#8格式( -pk8 参数所需)。 注意 : -pk8 和 -key 参数通常二选一,如果已经有了PKCS#8文件,就优先用 -pk8 。
  • -alias <alias> : 密钥库中条目的别名 。这是你在密钥库内部识别这个密钥对的唯一名称。例如,在Android签名中,常见的别名是 mykey 或 release 。

4.2 控制与输出参数:如何控制这个过程?

  • -cacert <ca-certificate> : (可选)CA根证书文件 。如果你导入的证书是一个由中间CA签发的证书,并且你希望将根证书也一并导入到密钥库的信任链中,可以使用这个参数。
  • -noprompt : 非交互模式标志 。加上这个参数,脚本在执行过程中不会弹出任何确认提示(例如是否信任此证书)。这在自动化脚本中至关重要,否则脚本会挂起等待输入。
  • -keypass <key-password> : (可选)私钥条目的密码 。在密钥库中,除了库密码,每个密钥条目还可以有自己的密码。如果省略,脚本默认会使用和密钥库密码( -p 参数)相同的密码。
  • -storetype <type> : (可选)密钥库类型 。默认为 jks 。如果你希望生成PKCS12格式( .p12 或 .pfx )的密钥库,可以指定 -storetype pkcs12 。PKCS12是更新的标准,跨平台兼容性更好, keytool 从JDK 9开始也将其设为默认类型。

命令结构示例 : 一个完整的命令看起来是这样的:

./keytool-importkeypair -k my-release.keystore -p keystore_password -pk8 my_private.pk8 -cert my_certificate.crt -alias my_app_alias -noprompt

这条命令的意思是:使用PKCS8私钥 my_private.pk8 和证书 my_certificate.crt ,在(或创建)密钥库文件 my-release.keystore (密码为 keystore_password )中,创建一个别名为 my_app_alias 的条目,过程中不要询问我。

5. 完整实操流程:从一对密钥到可用的Keystore

理论说再多,不如动手做一遍。下面我们模拟一个最常见的场景:你从某个证书服务商那里获得了一个SSL证书,现在需要为你的Spring Boot应用制作一个PKCS12格式的密钥库。

5.1 准备原料文件

假设你的工作目录下有如下文件:

  • private.key : 标准的PEM格式RSA私钥文件。
  • fullchain.crt : 包含服务器证书和中间CA证书的完整证书链文件。

首先,我们检查一下私钥的格式:

head -n 1 private.key

如果显示 -----BEGIN PRIVATE KEY----- ,那已经是PKCS#8格式,可以直接用作 -pk8 参数。但更常见的是显示 -----BEGIN RSA PRIVATE KEY----- (PKCS#1格式),这时我们就需要用 -key 参数,或者手动将其转换为PKCS#8。

步骤一(可选):手动转换私钥格式 如果你喜欢更可控的方式,可以先用OpenSSL转换:

openssl pkcs8 -topk8 -inform PEM -outform PEM -in private.key -out private_pk8.key -nocrypt

-nocrypt 参数表示输出的PKCS8私钥不加密,这是 keytool-importkeypair 所要求的。执行后你会得到 private_pk8.key 文件。

5.2 执行导入命令

现在我们有了PEM私钥(或转换好的PKCS8私钥)和证书链。我们决定创建一个PKCS12格式的密钥库,因为Spring Boot原生支持它。

方案A:使用PEM私钥(脚本自动转换)

./keytool-importkeypair -k server.p12 \
                        -p changeit \
                        -key private.key \
                        -cert fullchain.crt \
                        -alias tomcat \
                        -storetype pkcs12 \
                        -noprompt
  • -k server.p12 : 指定输出的密钥库为 server.p12 。
  • -p changeit : 设置密钥库密码为 changeit (请在生产环境中改为强密码)。
  • -key private.key : 提供原始的PEM私钥,脚本会处理转换。
  • -cert fullchain.crt : 提供证书链。
  • -alias tomcat : 在密钥库中,这个条目的别名是 tomcat 。
  • -storetype pkcs12 : 指定生成PKCS12格式的库。
  • -noprompt : 非交互模式。

方案B:使用已转换的PKCS8私钥

./keytool-importkeypair -k server.jks \
                        -p changeit \
                        -pk8 private_pk8.key \
                        -cert fullchain.crt \
                        -alias tomcat \
                        -noprompt

这个命令会生成一个JKS格式的 server.jks 文件。

5.3 验证导入结果

命令执行成功后,不会有太多花哨的输出,通常只有一两行信息。我们必须验证密钥库是否被正确创建和填充。

使用 keytool 的 -list 命令查看密钥库内容:

# 查看PKCS12库
keytool -list -v -keystore server.p12 -storetype pkcs12 -storepass changeit

# 查看JKS库
keytool -list -v -keystore server.jks -storepass changeit

输入密码后,你将看到详细的密钥库信息。重点关注以下几点:

  1. 库类型 :是否正确显示为 Keystore type: PKCS12 或 JKS 。
  2. 条目数量 :应该至少有一个条目。
  3. 别名 :找到你指定的别名(如 tomcat )。
  4. 条目类型 :应该是 PrivateKeyEntry ,这证明私钥被成功导入。
  5. 证书链 :展开该条目,应该能看到证书链,包含你的服务器证书和可能的中间CA证书。

如果看到了 PrivateKeyEntry ,那么恭喜你,导入成功了!这个密钥库现在就可以被用于配置Tomcat的HTTPS连接器或者Spring Boot的 server.ssl 属性了。

实操心得 :在自动化脚本中,建议在 keytool-importkeypair 命令后紧跟一个验证命令。如果验证失败(例如 keytool -list 返回非零退出码),则让脚本报错退出,这样可以及早发现处理过程中的问题,避免使用一个损坏的密钥库。

6. 高级用法与场景延伸

掌握了基础操作后,我们来看几个更复杂但同样常见的场景,这些场景能充分发挥 keytool-importkeypair 的威力。

6.1 处理分离的证书链

有时你拿到的证书文件是分离的: server.crt (你的服务器证书)和 intermediate.crt (中间CA证书)。你需要将它们合并成一个证书链文件,或者分别导入。

方法:合并证书链后再导入 最稳妥的方式是创建一个包含完整链的PEM文件:

cat server.crt intermediate.crt > fullchain.crt

然后使用 fullchain.crt 作为 -cert 参数的值。这样能确保整个信任链被完整地放入密钥库条目中。

方法:分别导入证书(不推荐用于此工具) keytool-importkeypair 设计用于导入一个密钥对及其直接关联的证书。对于复杂的多级证书链管理,更标准的做法是:

  1. 用 keytool-importkeypair 导入私钥和服务器证书。
  2. 使用 keytool -importcert -alias ca -file intermediate.crt -keystore ... 命令将中间CA证书作为受信任的证书条目单独导入到同一个密钥库(但使用不同的别名)。不过,这通常用于配置信任库(Truststore),而非包含私钥的密钥库。对于服务器密钥库,合并链文件是更通用的做法。

6.2 为Android应用签名准备Keystore

这是 keytool-importkeypair 的“杀手级”应用。假设你有一个用于Android应用签名的RSA私钥( release.key )和自签名证书( release.crt ),需要制作一个JKS格式的Keystore。

流程和之前类似,但有一些Android生态的特定约定:

# 假设你的私钥是PKCS#1 PEM格式
./keytool-importkeypair -k android-release.keystore \
                        -p your_strong_password \
                        -key release.key \
                        -cert release.crt \
                        -alias your_key_alias \
                        -keypass your_key_password \ # 通常设置与库密码不同以增加安全性
                        -noprompt

关键点 :

  • 别名(alias) :记住你设置的别名,在 build.gradle 中配置 signingConfigs 时会用到。
  • 密码 :建议为密钥库( -p )和密钥条目( -keypass )设置不同且强壮的密码,并妥善保管。
  • 验证 :生成后,用 keytool -list -v 查看,确保类型是 PrivateKeyEntry ,并且证书的指纹(SHA1/SHA256)与你预期的相符。这个指纹就是你在Google Play Console中注册应用签名密钥时需要的。

6.3 集成到自动化脚本与CI/CD中

在CI/CD流水线(如Jenkins, GitLab CI, GitHub Actions)中,你不可能手动执行这些命令。你需要将整个过程脚本化。

一个简单的Shell脚本示例 prepare_keystore.sh :

#!/bin/bash
set -e # 遇到错误立即退出

KEYSTORE_FILE="$1"
KEYSTORE_PASS="$2"
ALIAS_NAME="$3"
PRIVATE_KEY_PEM="$4"
CERTIFICATE_CRT="$5"

# 检查依赖
command -v openssl >/dev/null 2>&1 || { echo >&2 "OpenSSL is required but not installed. Aborting."; exit 1; }
command -v keytool >/dev/null 2>&1 || { echo >&2 "Java keytool is required but not installed. Aborting."; exit 1; }

# 检查 keytool-importkeypair 脚本是否存在
IMPORT_SCRIPT="./tools/keytool-importkeypair"
if [ ! -f "$IMPORT_SCRIPT" ]; then
    echo "Downloading keytool-importkeypair..."
    curl -s -o "$IMPORT_SCRIPT" https://raw.githubusercontent.com/douglascrockford/JSON-java/master/tools/keytool-importkeypair
    chmod +x "$IMPORT_SCRIPT"
fi

echo "Importing keypair into keystore..."
"$IMPORT_SCRIPT" -k "$KEYSTORE_FILE" \
                 -p "$KEYSTORE_PASS" \
                 -key "$PRIVATE_KEY_PEM" \
                 -cert "$CERTIFICATE_CRT" \
                 -alias "$ALIAS_NAME" \
                 -noprompt

echo "Verifying keystore..."
keytool -list -v -keystore "$KEYSTORE_FILE" -storepass "$KEYSTORE_PASS" | grep -A5 "Alias name: $ALIAS_NAME"

echo "Keystore '$KEYSTORE_FILE' prepared successfully with alias '$ALIAS_NAME'."

在CI/CD中,你可以将私钥和证书作为机密变量(Secrets)注入,然后在构建阶段调用此脚本。 务必确保机密文件在构建后被安全清理 。

7. 常见问题排查与实战技巧

即使按照步骤操作,也可能会遇到各种问题。下面是我在多年使用中总结的一些典型错误和解决方法。

7.1 错误与解决方案速查表

错误现象或问题 可能原因 解决方案
./keytool-importkeypair: line X: openssl: command not found 系统未安装OpenSSL,或OpenSSL不在PATH中。 安装OpenSSL,并确保其 bin 目录在系统的PATH环境变量里。
keytool: command not found JDK未安装或未配置PATH。 安装JDK(如OpenJDK),并将JDK的 bin 目录添加到PATH。
Unable to load certificate ... java.io.IOException: Invalid keystore format 提供给 -cert 参数的文件不是有效的X.509证书,或者文件已损坏。 使用 openssl x509 -in your.crt -text -noout 命令检查证书文件是否有效。确保证书是PEM格式(文本格式)。
Failed to establish chain from reply... 证书链不完整或顺序错误。服务器证书必须放在文件开头,后面跟着中间CA证书。 按正确顺序合并证书: cat server.crt intermediate1.crt intermediate2.crt > fullchain.crt ,然后使用 fullchain.crt 。
脚本执行无报错,但 keytool -list 显示条目类型是 trustedCertEntry 而非 PrivateKeyEntry 私钥导入失败 。这是最隐蔽的问题。可能原因:1) 私钥文件损坏;2) 私钥与证书不匹配;3) 脚本转换PKCS8格式时出错。 1. 用 openssl rsa -in your.key -check 验证私钥。
2. 用 openssl x509 -noout -modulus -in your.crt 和 openssl rsa -noout -modulus -in your.key 分别计算模数,比对是否一致。
3. 尝试手动转换私钥为PKCS8( openssl pkcs8 -topk8 -nocrypt ... )并使用 -pk8 参数。
在Windows PowerShell中执行脚本报语法错误 脚本是Unix/Linux格式的Bash脚本,与PowerShell不兼容。 1. 在Git Bash或WSL中运行。
2. 寻找Python或PowerShell版本的 keytool-importkeypair 实现。
导入后,应用(如Tomcat)仍报错“No certificate or key found” 密钥库类型、别名或密码在应用配置中填写错误。 仔细检查应用配置文件(如 server.xml 或 application.properties )中的 keystoreType , keystoreFile , keystorePass , keyAlias , keyPass 等属性,确保与创建时完全一致。使用 keytool -list 确认别名。

7.2 关键技巧与避坑指南

  1. 始终先备份 :在对已有的密钥库进行操作前,尤其是使用 -k 参数指向一个已存在的文件时, 务必先备份 。这个操作会修改原文件,一旦出错可能无法恢复。
  2. 密码安全 :不要在命令行中直接使用明文密码,尤其是在共享的脚本或终端历史中。对于自动化脚本,可以从环境变量或加密的密码文件中读取密码。例如:
    KEYSTORE_PASS=${ENV_KEYSTORE_PASSWORD}
    ./keytool-importkeypair ... -p "$KEYSTORE_PASS" ...
    
  3. 验证匹配性 :私钥和证书必须匹配。在导入前,用上面提到的 openssl 命令计算并对比两者的模数(Modulus),这是避免后续各种诡异问题的最有效方法。
  4. 关于PKCS12与JKS的选择 : 优先选择PKCS12(.p12) 。JKS是Java独有的老旧格式,而PKCS12是行业标准,兼容性更好。从JDK 9开始, keytool 的默认库类型已经是PKCS12。新项目没有理由再使用JKS。
  5. 处理“Bag Attributes”警告 :在使用 keytool -list 查看PKCS12库时,可能会看到“Bag Attributes”行,这通常是正常的,不影响使用。它包含了一些元数据。
  6. 脚本的局限性 :这个脚本主要处理RSA密钥。对于ECC(椭圆曲线)密钥,虽然较新版本的OpenSSL和 keytool 支持,但 keytool-importkeypair 脚本的某些版本可能需要进行调整才能兼容。如果使用ECC密钥遇到问题,可能需要查看脚本源码或寻找其他支持ECC的工具。

掌握 keytool-importkeypair ,本质上就是掌握了在Java生态中自由“搬运”密钥对的能力。它将一个原本需要多步手动操作、容易出错的过程,压缩成一条可靠、可自动化的命令。无论是为了应对紧急的证书部署,还是构建稳健的自动化发布流程,这个工具都值得你放入自己的工具箱。

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

相关推荐

【Unity】Unity性能分析解决方案——UPR

由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。

Davidorzs的博客 1004

从0-1体验大数据开发

觉得裸用MaxCompute(原ODPS)门槛较高?想做数据开发,却苦于没有好的管理工具? 想体验下数加(阿里云大数据)推出的Data IDE,却苦于: 开通云账号—实名认证—购买MaxCompute—创建AK—创建/绑定项目, 经过5步,最后终于能开始体验了,是不是瞬间; 想从开通云账号后立即进入体验吗...

weixin_34355559的博客 120

pe卸载win10更新补丁_禁用Win10系统更新

众所周知,最近WIN10的强制更新导致了很多问题。如:(部分专业软件系统更新后无法使用,硬件中键盘、鼠标、指纹之类的硬件,更新补丁后失灵等问题)。而之前的禁用WindowsUpdate的方法已经失效。下面我们另辟蹊径,利用系统权限的方法使Win10无法更新,达到禁用更新的目的。1.计算机管理-服务中禁用Windows Update服务。2.打开C:\Windows\softwareDistribu...

weixin_39702479的博客 1万+

0-1背包问题(knapsack problem)

c[i][w]表示背包容量为w时,i个物品导致的最优解的总价值。递归定义如下              0                                                              i=0或w=0 c[]i[w]= c[i-1][w]                                                    wi>w

skillart的专栏 7159

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6188

不用U盘也能装Ubuntu?手把手教你用EasyUEFI搞定双系统(附企业版资源)

本文详细介绍了无需U盘即可安装Ubuntu双系统的方法。通过使用EasyUEFI工具,在Windows环境下创建虚拟启动分区并配置UEFI引导,即可直接从硬盘启动Ubuntu安装程序。该方法特别适合开发者或技术爱好者快速搭建Linux开发环境,操作安全便捷,无需额外物理介质。

weixin_29215391的博客 275

大数据时代:0和1生活里的那些事

本文讲的是大数据时代:0和1生活里的那些事,大数据所带来的商业机会被越来越多具有技术前瞻性的厂商所重视。商业利润的分布也有了很大变化,据市调机构测算:今年预计总价值50亿美元的大数据市场目前有44%的份额来自服务类产品,31%源于硬件销售,而软件支持则占去了另外25%。这导致传统的IT企业凭借多年的技术积累和客户资源在向大数据领域转型,这个市场也为具有独...

weixin_34252686的博客 240

【异常】飞书OpenClaw机器人 HTTP 401: Invalid Authentication 报错排查与解决方案

HTTP 401 是HTTP协议标准定义的未授权(Unauthorized)状态码,核心含义为请求方身份认证无效,服务端拒绝执行本次请求。飞书开放平台服务端对自建机器人的全链路鉴权校验失败。无论是机器人接收飞书事件推送的上行请求,还是机器人主动调用飞书开放平台API的下行请求,只要身份凭证无效、鉴权逻辑校验不通过,飞书服务端就会返回该报错,并最终透传到飞书客户端会话窗口中。

奶爸的编程之路,也就一周冷个三天 3744

解密keytool-importkeypair:shell脚本实现Java密钥库导入的原理分析

🔐 **keytool-importkeypair** 是一个简单而强大的shell脚本工具,专门用于将密钥/证书对导入到现有的Java密钥库中。对于需要处理Android平台证书、Java应用安全配置或SSL/TLS证书管理的开发者来说,这个工具提供了一种快速、高效的解决方案。本文将深入解析这个shell脚本的工作原理,帮助你理解如何通过命令行工具实现Java密钥库的自动化管理。 ## 为什

gitblog_01077的博客 962

DeerFlow 系列教程 第三篇 | 核心技术深度剖析:Skills、Memory 与 Context Engineering

摘要化是 Context Engineering 中最关键的组件——它直接决定了长对话的可用性。Skills 技能系统通过渐进式加载的三层模型,在保持系统提示词轻量的同时,支持无限数量的技能扩展。从发现到执行的 10 个生命周期阶段,配合 AI 驱动的安全扫描和多层缓存,构成了一个生产级的技能管理框架。Memory 长期记忆系统通过文件系统持久化、LLM 驱动的信息提取和防抖动异步更新,实现了跨会话的认知持久化。六类事实分类体系和修正信号检测机制,让 Agent 能够从交互中持续学习和改进。

weixin_43674738的博客 279

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 137

3步搞定Java密钥库导入:keytool-importkeypair完全指南

在Java开发和Android应用签名过程中,密钥管理是一个关键但复杂的环节。你是否曾为将私钥和证书导入Java密钥库而烦恼?传统的keytool命令操作繁琐,容易出错,而keytool-importkeypair正是为解决这个问题而生的强大工具。这个简洁的Shell脚本工具让密钥对导入变得异常简单,特别适合Android开发者处理系统签名证书。 ## 工具的核心价值与应用场景 🔑 keyt

gitblog_00816的博客 869

如何理解下一代ERP 即:华为MetaERP

如何理解下一代ERP 即:华为MetaERP 华为的 MetaERP核心定位: 华为MetaERP是华为公司自主研发的下一代企业核心商业管理系统。它不仅仅是一个传统的ERP(企业资源规划)系统,更是一个面向未来、基于云原生、AI驱动、安全可信的企业核心管理平台。

金牌架构师 1128

keytool-importkeypair 完整使用指南:快速导入证书到Java密钥库的终极教程

在Android开发和Java应用部署过程中,**keytool-importkeypair** 是一个极其实用的工具,它能帮助开发者快速将密钥和证书对导入现有的Java密钥库。如果你曾经为Android应用签名证书的导入问题而烦恼,那么这个工具将成为你的得力助手! ## 🔑 keytool-importkeypair 是什么? **keytool-importkeypair** 是一个功能

gitblog_00913的博客 1053

计算机控制技术及应用

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

老版QQ原生表情gif动态

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

keytool-importkeypair 密钥导入工具全面指南

keytool-importkeypair 是一款专为 Java 开发者设计的 Shell 脚本工具,主要用于将密钥/证书对高效导入到现有的 Java 密钥库中。该工具在 Android 系统应用开发领域具有不可替代的价值,能够大幅简化系统级签名的管理流程。 **核心优势**: - 自动化密钥转换过程,减少人工操作错误 - 支持标准 PK8 和 X509 证书格式 - 兼容现有的 Java 密钥

gitblog_00088的博客 902

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java密钥库管理终极方案:keytool-importkeypair实战指南

在Java安全体系中,密钥库(Keystore)和信任库(Truststore)是管理数字证书和私钥的核心组件,广泛应用于HTTPS通信、API认证等场景。其原理基于公钥基础设施(PKI),通过非对称加密确保数据传输的安全性和身份验证的可靠性。传统JDK自带的keytool工具虽然功能完备,但在处理外部证书导入时步骤繁琐、易出错,降低了工程效率。keytool-importkeypair作为社区开发的辅助工具,通过封装OpenSSL和keytool命令,实现了将已有私钥和证书链一键导入JKS或PKCS12格

cuxiong8996的博客 586

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

keytool-importkeypair 终极指南:破解Java密钥库导入难题

想象一下这个场景:你正在为Android应用生成系统级签名,手头有平台私钥(platform.pk8)和X.509证书(platform.x509.pem),但Java的keytool工具却无法直接导入这种密钥对格式。你陷入了困境——要么重新生成整个密钥库,要么寻找复杂的转换工具。这正是keytool-importkeypair诞生的背景,这个精巧的Shell脚本解决了Java开发者长期面临的密钥

gitblog_00660的博客 569

解决Java密钥库导入痛点:keytool-importkeypair常见问题与解决方案

你是否在Java开发中遇到过密钥库导入的困扰?🤔 特别是在Android开发、SSL证书配置或企业级应用部署时,将PK8私钥和X.509证书正确导入Java密钥库(keystore)往往让人头疼。今天,我将为你详细介绍keytool-importkeypair这个强大的Shell脚本工具,它专门解决Java密钥库导入的各种难题,让你的证书管理变得简单高效! ## 🔑 什么是keytool-i

gitblog_00585的博客 509

终极指南:如何使用keytool-importkeypair轻松管理Java密钥库

如果你正在开发Android应用或Java项目,是否曾经为管理密钥和证书而烦恼?传统的Java keytool工具功能有限,无法直接导入私钥/证书对,每次都需要复杂的转换步骤。今天,我将为你介绍一个简单而强大的解决方案——keytool-importkeypair,这个Shell脚本工具能彻底改变你的密钥管理方式。 **核心关键词**:Java密钥库管理、Android系统签名、密钥证书导入、S

gitblog_00733的博客 458

Java密钥库导入工具终极指南:keytool-importkeypair完整教程

Java密钥库导入工具keytool-importkeypair是一款专为开发者设计的Shell脚本工具,能够高效地将密钥/证书对导入到现有的Java密钥库中。对于Android系统应用开发和Java证书管理而言,这款工具提供了自动化解决方案,显著简化了复杂的签名流程,是提升开发效率的必备利器。🔑 ## 为什么需要专业的密钥导入工具? 在Java和Android开发中,密钥库管理是一个至关重

gitblog_00897的博客 243

开发者必备:keytool-importkeypair高效管理Java密钥对的5个技巧

在Java开发和Android应用构建过程中,**keytool-importkeypair** 是一个不可或缺的密钥管理工具,它能帮助开发者快速导入密钥/证书对到Java密钥库中。对于需要处理Android平台证书、SSL/TLS配置或数字签名验证的开发人员来说,这个Shell脚本工具能显著简化工作流程,提高开发效率。本文将分享5个实用技巧,助您掌握这个强大的密钥管理工具。 ## 📋 什么是

gitblog_00289的博客 309

keytool-importkeypair:Java密钥库导入工具的终极指南 [特殊字符]

想要轻松管理Java密钥库中的证书和密钥对吗?**keytool-importkeypair**就是你的得力助手!这款强大的Shell脚本工具专门为Java开发者设计,能够快速将PK8私钥和X509证书对导入到现有的Java密钥库中。无论你是Android开发者需要处理系统签名,还是企业应用需要管理多个证书,这个工具都能大大简化你的工作流程。✨ ## 📋 为什么你需要这个工具? 在Java和

gitblog_00563的博客 333

如何高效管理Java密钥库:keytool-importkeypair完整实战指南

还在为Java密钥库管理而头疼吗?每次手动导入密钥对都像在走钢丝,一个不小心就可能导致证书混乱、应用签名失败?今天我要为你介绍一款能够彻底改变Java密钥库管理体验的神器——**keytool-importkeypair**。这款专业的Shell脚本工具专为简化Java密钥库管理而生,能够自动化完成密钥/证书对的导入过程,让你告别繁琐的手动操作,专注于真正的开发工作。 ## 🔥 痛点分析:为什

gitblog_00615的博客 293

keytool-importkeypair:3分钟搞定Java密钥库导入难题的终极方案

你是否曾经为繁琐的Java密钥库管理而头疼?😫 面对复杂的证书导入流程,开发者们常常需要花费大量时间在openssl和keytool之间来回切换。今天,我要为你介绍一个能够彻底改变这种局面的神器——keytool-importkeypair!这个简洁而强大的Shell脚本工具,专门为Java开发者设计,能够将密钥/证书对高效导入到现有的Java密钥库中,让你的证书管理变得前所未有的简单。 ##

gitblog_00658的博客 265

快速导入密钥对的终极指南:keytool-importkeypair 完整教程

还在为 Android 系统签名和 Java 密钥库管理而烦恼吗?每次手动处理密钥和证书对是否让你感到效率低下?本文将为你介绍一个专业的 Shell 脚本工具——keytool-importkeypair,它能让你在几分钟内完成密钥对的导入操作,大幅提升 Java 密钥管理和 Android 签名的工作效率。 ## 为什么需要专业的密钥导入工具? 在 Java 开发和 Android 应用签名

gitblog_01120的博客 475

keytool-importkeypair:Java密钥库私钥证书导入实战

在Java服务端开发中,HTTPS与TLS证书配置始终绕不开密钥库操作。面对CA签发的私钥和证书链,原生keytool命令无法直接导入私钥,导致开发者不得不手工组合openssl与keytool,稍有不慎便容易踩中格式或证书链顺序的坑。keytool-importkeypair正是为解决这一痛点而生,它通过封装openssl与keytool的标准调用,将私钥、证书链一次性转换为JKS或PKCS12密钥库,让Tomcat、Spring Boot、微服务双向TLS等场景下的证书配置效率大幅提升。本文从密钥库格式

weixin_29323365的博客 189
上一篇: Java实现FF1格式保持加密:原理、实战与生产部署指南
下一篇: DeepSeek V4深度解析:从刷分到稳态的模型工程范式升级
chengli1824
博客等级 码龄11年 4粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值