【专知-Deeplearning4j深度学习教程01】分布式Java开源深度学习框架DL4j安装使用: 图文+代码
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。继Pytorch教程后,我们推出面向Java程序员的深度学习教程DeepLearning4J。Deeplearning4j的案例和资料很少,官方的doc文件也非常简陋,基本上所有的类和函数的都没有解释。为此,我们推出来自中科院自动化所专知小组博士生Hujun创作的-分布式Java开源深度学习框架Deeplearning4j学习教程,第一篇,Deeplearning4j配置使用。
- Deeplearning4j开发环境配置
- ND4J(DL4J的矩阵运算库)教程
- 基于DL4J的CNN、AutoEncoder、RNN、Word2Vec等模型的实现
简介
Deeplearning4j是由SkyMind公司开源的分布式Java/Scala深度学习框架,支持在CPU或GPU上运行。
组件
Deeplearning4j提供了非常强大的生态,大致可以分为:
- DataVec: 支持数据(文本、图像、音频、视频)的清洗、拼接、归一化、转换等操作,是Deeplearning4j的数据预处理组件。类似Python的Pandas组件
- ND4J: 科学计算组件,主要是矩阵运算(支持CPU和GPU)。类似Python的numpy。
- Deeplearning4j: 深度学习组件,封装了各种深度学习模型,包括全连接层、卷积层、RBM层等。支持传统的多层网络(MultiLayerNetwork),也支持复杂网络的定制(Computation Graph)。
- Deeplearning4j UI: 可视化组件,类似Tensorflow的TensorBoard。可以用于可视化网络结构,以及网络训练中变量的监控。
实例
Deeplearning4j提供了非常便捷的深度模型定制功能,例如定制LeNet(一种卷积网络)的代码如下:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.iterations(1000)
.regularization(true).l2(0.0005)
.learningRate(.01)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.list()
.layer(0, new ConvolutionLayer.Builder(5, 5)
.nIn(nChannels)
.stride(1, 1)
.nOut(20)
.activation(Activation.IDENTITY)
.build())
.layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(2,2)
.stride(2,2)
.build())
.layer(2, new ConvolutionLayer.Builder(5, 5)
.stride(1, 1)
.nOut(50)
.activation(Activation.IDENTITY)
.build())
.layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(2,2)
.stride(2,2)
.build())
.layer(4, new DenseLayer.Builder().activation(Activation.RELU)
.nOut(500).build())
.layer(5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nOut(outputNum)
.activation(Activation.SOFTMAX)
.build())
.setInputType(InputType.convolutionalFlat(28,28,1))
.backprop(true).pretrain(false).build();
虽然相比于tensorflow、keras等Python深度学习框架中卷积网络的定制,上面的代码闲的略微繁琐,但在编写代码时,各种长变量名、函数名都会由IDE自动提示,所以在编写Deeplearning4j模型时,并不会感觉到工作量的增加。
选择Deeplearning4j的一个理由,是它对复杂网络的定制也有很好的支持,例如下图中的网络有两个输出:
Deeplearning4j对应的模型代码为:
ComputationGraphConfiguration conf = new NeuralNetConfiguration.Builder()
.learningRate(0.01)
.graphBuilder()
.addInputs("input")
.addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input")
.addLayer("out1", new OutputLayer.Builder()
.lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nIn(4).nOut(3).build(), "L1")
.addLayer("out2", new OutputLayer.Builder()
.lossFunction(LossFunctions.LossFunction.MSE)
.nIn(4).nOut(2).build(), "L1")
.setOutputs("out1","out2")
.build();
模型
Github上有许多现成的Deeplearning4j模型,如AlexNet、VGG、ResNet等,例如:
许多较新的模型由Tensorflow、Keras、Caffe等框架编写,Deeplearning4j提供了一种使用这些模型的机制。Tensorflow、Caffe等框架的模型都可以被转换为Keras模型,Deeplearning4j内置了Keras模型导入的支持,因此Deeplearning4j可以支持大部分流行深度学习框架模型的导入。
安装
Deeplearning4j的配置非常的简单,直接在Maven中加入deeplearning4j-core和对应版本的ndj4(CPU或GPU)的依赖即可:
- deeplearning4j-core: https://mvnrepository.com/artifact/org.deeplearning4j/deeplearning4j-core
- ndj4(CPU版): https://mvnrepository.com/artifact/org.nd4j/nd4j-native
- nd4j(GPU版):
- Cuda7.5: https://mvnrepository.com/artifact/org.nd4j/nd4j-cuda-7.5
- Cuda8.0: https://mvnrepository.com/artifact/org.nd4j/nd4j-cuda-8.0
最后
Deeplearning4j社区一直在努力地改进这款优秀的深度学习框架。我在很久之前用过Deeplearning4j,由于其当时不成熟的接口导致的不良的开发体验而放弃DL4J而转向其他框架,几个月后又重新使用了新版的Deeplearning4j,发现以前那些不成熟的接口(例如对于错误的提示、一些冗余的配置)都在新版本中被修复了,DL4J逐渐变成了一个非常成熟的产品,使得Java开发者可以在项目中真正使用基于Java的深度学习框架,而不是去利用微服务之类蹩脚的方法去调用那些Python深度学习框架。
最后配几张Deeplearning4j UI的截图,调试深度学习模型时,数据的可视化还是很重要的:
- 每天学一点Docker(3)(制作你的第一个容器)
- 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
- 1653: [Usaco2006 Feb]Backward Digit Sums
- 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场
- 1682: [Usaco2005 Mar]Out of Hay 干草危机
- 1637: [Usaco2007 Mar]Balanced Lineup
- AutoFac在项目中的应用
- 每天学一点Docker(5)——了解Docker架构
- 跨站请求伪造(CSRF/XSRF)
- 我这么玩Web Api(一)
- 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
- 点双连通分量与割点
- 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐
- 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释