使用 IntelliJ IDEA 搭建并运行 MXNet Java 示例项目Maven 全流程指南【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mxnet1/mxnet本篇技术指南以 MXNet 官方 Java 教程为骨架带你从零开始在 IntelliJ IDEA 中创建 Maven 项目、引入 MXNet 官方 Java 依赖、运行第一个 NDArray 计算程序并深入讲解仓库内 Java Demo 项目的源码结构、平台/GPU 依赖切换与命令行构建方式。读完本文你将掌握在 macOS/Linux 上搭建 MXNet Java 开发环境、在 IDE 中调试运行以及脱离 IDE 用 Maven 命令行编译执行的完整实战能力。前置条件在开始之前需要准备以下软件环境Java 8 JDKMXNet Java API 依赖 JDK 8请确保java -version输出的主版本为 8Maven用于管理依赖与构建项目OpenCVMXNet Java 包在图像读写Image.imRead、Image.imResize等操作中依赖 OpenCV 原生库IntelliJ IDEA社区版Community Edition即可满足本教程的全部需求。版本说明MXNet 官方 Java 包随 MXNet 1.4 正式发布本文教程使用1.4.0版本坐标进行演示当前仓库内的 java-demo 演示项目 则采用[1.6.0-SNAPSHOT, )的范围版本二者用法一致读者可根据自己拉取的依赖版本灵活调整。macOS 安装前置依赖macOS 推荐使用 Homebrew 安装全部依赖依次执行/usr/bin/ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) brew update brew tap caskroom/versions brew cask install java8 brew install maven brew install opencv其中brew cask install java8会安装 Oracle Java 8brew tap caskroom/versions是为了让java8cask 可用。Ubuntu 安装前置依赖Ubuntu 下使用apt一条命令即可完成 JDK 与 Maven 的安装sudo apt-get install openjdk-8-jdk mavenOpenCV 在 Ubuntu 上通常随 MXNet 依赖被拉取若运行期遇到 OpenCV 原生库缺失问题可参考本文末尾故障排查一节的解决方案如安装libopencv-imgcodecs3.4。在 IntelliJ IDEA 中创建 Maven 项目Step 1.安装并启动 IntelliJ IDEA。Step 2.创建新项目在 IntelliJ 欢迎界面点击Create New Project左侧选择Maven项目类型勾选Create from archetype并从列表中选择org.apache.maven.archetypes:maven-archetype-quickstart这是 Maven 官方的快速开始骨架会生成标准的src/main/java目录结构与示例App.java点击Next进入项目元数据配置页。Step 3.填写项目元数据Project Metadata本教程使用以下取值GroupIdmxnetArtifactIdjavaMXNetVersion1.0-SNAPSHOT点击Next项目属性Project Properties保持默认即可随后设置项目存放位置Project Location其余设置同样保持默认点击Finish完成创建。创建完成后IDEA 会打开项目主视图并自动在编辑器中展示项目的pom.xml文件——下一步我们就通过它引入 MXNet Java 依赖。添加 MXNet Java 依赖MXNet 的 Java 包已发布到 Maven 中央仓库坐标前缀为org.apache.mxnet。在pom.xml的dependencies标签内添加以下依赖dependency groupIdorg.apache.mxnet/groupId artifactIdmxnet-full_2.11-osx-x86_64-cpu/artifactId version1.4.0/version /dependency理解 artifactId 的命名规则mxnet-full_2.11-osx-x86_64-cpu这个 artifact 名称由四部分拼接而成理解它才能在换平台、换硬件时正确调整坐标片段含义可选值mxnet-full完整发行包内含原生库与 Scala/Java 绑定mxnet-full_2.11Scala 二进制版本Java API 基于 Scala 2.11 编译2.11osx-x86_64目标操作系统与 CPU 架构osx-x86_64、linux-x86_64cpu计算后端cpu、gpu使用时注意两点在Linux上运行请把osx-x86_64改为linux-x86_64若本机配备 NVIDIA GPU 且希望使用 GPU 加速请把cpu改为gpuGPU 包内置 CUDA 运行时当前 Maven 包基于 CUDA 9.2 构建。仓库演示项目的自动化做法手工拼写平台名容易出错当前仓库的 java-demo pom.xml 提供了一个更优雅的方案用 Maven Profile 按操作系统自动激活对应的依赖后缀。其核心片段如下properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target mxnet.version[1.6.0-SNAPSHOT, )/mxnet.version mxnet.scalaprofile2.11/mxnet.scalaprofile /properties profiles profile idosx-x86_64/id activation os familymac/family /os /activation properties mxnet.profileosx-x86_64-cpu/mxnet.profile /properties /profile profile idlinux-x86_64/id activation os familyunix/family nameLinux/name /os /activation properties mxnet.profilelinux-x86_64-cpu/mxnet.profile /properties /profile /profiles dependencies dependency groupIdorg.apache.mxnet/groupId artifactIdmxnet-full_${mxnet.scalaprofile}-${mxnet.profile}/artifactId version${mxnet.version}/version /dependency /dependencies依赖坐标通过${mxnet.scalaprofile}-${mxnet.profile}动态拼接macOS 自动选择osx-x86_64-cpuLinux 自动选择linux-x86_64-cpu。需要 GPU 时只需在命令行覆盖属性-Dmxnet.profilelinux-x86_64-gpu无需改动 pom 文件。该 pom 同时声明了 Apache Snapshot 仓库便于拉取 1.6.0-SNAPSHOT 系列的每日构建版本。导入依赖并构建项目Step 4.完成依赖添加后注意 IDE 右下角会出现Maven projects need to be imported的提示气泡若未出现点击右下角的绿色气球图标。点击其中的Import ChangesMaven 会自动解析并下载org.apache.mxnet依赖及其传递依赖。Step 5.构建项目从顶部菜单选择Build → Build Project等待编译完成。写入 HelloWorld 代码并运行Step 6.在项目树中找到 Maven 骨架生成的App.java类位于src/main/java下将main方法中的内容替换为仓库内 HelloWorld.java 的示例代码package mxnet; import org.apache.mxnet.javaapi.*; import java.util.Arrays; public class HelloWorld { static NDArray$ NDArray NDArray$.MODULE$; public static void main(String[] args) { System.out.println(Hello World!); NDArray nd new NDArray(new float[]{2.0f, 3.0f}, new Shape(new int[]{1, 2}), Context.cpu()); System.out.println(nd.shape()); NDArray nd2 NDArray.dot(new dotParam(nd, nd.T()))[0]; System.out.println(Arrays.toString(nd2.toArray())); } }这段代码演示了 MXNet Java API 的三类核心操作创建 NDArraynew NDArray(new float[]{2.0f, 3.0f}, new Shape(new int[]{1, 2}), Context.cpu())在 CPU 上创建一个形状为(1, 2)、取值为[2.0, 3.0]的张量Shape描述维度Context.cpu()指定计算设备打印形状nd.shape()返回该张量的维度信息矩阵点积NDArray.dot(new dotParam(nd, nd.T()))[0]计算nd与其转置nd.T()的点积——一个(1,2)向量与(2,1)向量点积结果形状为(1,1)数值为2.0*2.0 3.0*3.0 13.0。注意 dot 类运算返回的是NDArray[]数组因此取下标[0]获取结果。为什么需要static NDArray$ NDArray NDArray$.MODULE$;org.apache.mxnet.javaapi包是基于 Scala 对象编译生成的 Java 接口其中的NDArray是 Scala 伴生对象。Java 侧若要通过静态风格调用NDArray.dot、NDArray.ones等伴生对象方法必须先声明static NDArray$ NDArray NDArray$.MODULE$;这一行把 Scala 伴生对象的MODULE$单例暴露为 Java 静态字段使后续NDArray.dot(...)这类调用可以正常编译执行。java-demo README 明确指出使用 Param 对象与伴生对象 API 时必须保留这行前置声明。Step 7.右键点击App.java选择Run App.main()运行程序。若一切正常控制台输出应与以下结果类似Hello World! (1,2) Process finished with exit code 0第一行是main方法直接打印的字符串第二行(1,2)是nd.shape()的输出点积结果[13.0]通过Arrays.toString打印不同依赖版本下该行输出格式可能略有差异。Process finished with exit code 0表示进程正常结束、原生库加载成功。进阶仓库内的完整 Java Demo 示例本次创建的项目是一个最小验证环境。当前仓库的 java-demo 目录 提供了五个可直接运行的示例类可作为后续学习的扩展材料示例类演示内容HelloWorld.javaNDArray 创建、形状查询与点积运算NDArrayCreation.java多种 NDArray 构造方式float/double 数组、ones全 1 张量、random_uniform随机张量NDArrayOperation.java转置T()、类型转换asType、逐元素相加elemwise_add、L2 范数normImageClassification.java基于 Predictor API 的 ResNet-18 图像分类推理ObjectDetection.java基于 ObjectDetector API 的 ResNet-50 SSD 目标检测其中 NDArrayCreation.java 展示了更多 NDArray 构造技巧// 创建 Double 类型 NDArray NDArray ndDouble new NDArray(new double[]{2.0d, 3.0d}, new Shape(new int[]{2, 1}), Context.cpu()); // 创建全 1 张量形状 (1, 2, 3) NDArray ones NDArray.ones(Context.cpu(), new int[] {1, 2, 3}); // 在 [0, 2) 区间生成 10x10 均匀分布随机张量 NDArray random NDArray.random_uniform( new random_uniformParam() .setLow(0.0f) .setHigh(2.0f) .setShape(new Shape(new int[]{10, 10})) )[0];可以看到MXNet Java API 中的算子如random_uniform统一采用Param 对象 返回数组的调用约定参数通过xxxParam的链式setXxx方法配置结果以NDArray[]返回后取[0]。而 ImageClassification.java 则演示了完整的推理链路下载 ResNet-18 模型与测试图片 → 用DataDesc(data, new Shape(new int[]{1, 3, 224, 224}), DType.Float32(), NCHW)声明输入描述 →Image.imRead读取图片 →imResize缩放到 224x224 →transpose将 HWC 转为 CHW →expand_dims增加 batch 维 →predictor.predict得到分类概率并读取synset.txt打印最大概率类别。更多细节可参考 java-demo README 与 Java API 文档索引。故障排查如果运行报错首先回头核对前置条件是否齐全。一个典型错误是 OpenCV 原生库缺失错误信息中部会出现类似下面的片段x.x为库版本号... Library not loaded: /usr/local/opt/opencv/lib/libopencv_calib3d.x.x.dylib ...该错误说明系统未安装 OpenCV 或版本不匹配解决方案是安装/升级 OpenCVmacOS 使用brew install opencv。在 Ubuntu 上若遇到 OpenCV 问题可尝试安装 OpenCV 3.4 的运行时库1.2.0 及之后的 MXNet Java 包要求 OpenCV 3.4sudo add-apt-repository ppa:timsc/opencv-3.4 sudo apt-get update sudo apt install libopencv-imgcodecs3.4其余依赖JDK 8、Maven的安装校验命令java -version # 应输出 1.8.x mvn -version # 应正常打印 Maven 版本命令行构建与运行可选除了在 IntelliJ 中运行也可以完全在命令行完成编译与执行。切换到项目的根目录即pom.xml所在目录执行mvn clean install dependency:copy-dependenciesclean install完成清理、编译与安装dependency:copy-dependencies会把所有依赖 jar 复制到target/dependency目录便于后续用通配符指定 classpath。命令成功时输出以如下片段结尾[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.475 s [INFO] Finished at: 2018-11-08T05:06:31-08:00 [INFO] ------------------------------------------------------------------------构建完成后target目录下会生成javaMXNet-1.0-SNAPSHOT.jarjar 名由 ArtifactId 与 Version 拼接而成。在项目根目录执行以下命令运行App.java假设主类为mxnet.Appjava -cp target/javaMXNet-1.0-SNAPSHOT.jar:target/dependency/* mxnet.App输出应与在 IntelliJ 中运行时一致。若直接运行仓库内的 java-demo 项目可参考其 READMEmvn package构建后用bash bin/java_sample.sh运行 NDArray 示例GPU 环境则添加-Dmxnet.profilelinux-x86_64-gpu参数。其他辅助命令包括mvn clean清理构建产物mvn eclipse:eclipse将 Maven 项目转换为 Eclipse 工程。下一步查看 Java API 文档 了解完整 API 清单阅读 Java 教程索引 与 SSD 推理教程 学习更多推理场景参考仓库内 java-demo 演示项目 的五个示例类依次跑通 NDArray 运算、图像分类与目标检测即可全面掌握 MXNet Java 编程。【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mxnet1/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
