作者:寒沧
链接:https://www.jianshu.com/p/566fc3db676b
来源:简书
DeepLearning4J(DL4J)是一套基于Java语言的神经网络工具包,可以构建、定型和部署神经网络。DL4J与Hadoop和Spark集成,支持分布式CPU和GPU,为商业环境(而非研究工具目的)所设计。Skymind是DL4J的商业支持机构。
Deeplearning4j拥有先进的技术,以即插即用为目标,通过更多预设的使用,避免多余的配置,让非企业也能够进行快速的原型制作。DL4J同时可以规模化定制。DL4J遵循Apache 2.0许可协议,一切以其为基础的衍生作品均属于衍生作品的作者。
注:ND4J (N-Dimensional for java),类似Numpy的功能。
- 【教程】Deeplearning4j入门(一)- 寒沧
- 【教程】Deeplearning4j入门(二)ND4J基本操作- 寒沧
- 【教程】Deeplearning4j入门(三)- 简易一元线性回归-寒沧
- 【教程】Deeplearning4j入门(四)- 非线性回归-寒沧
- 【教程】Deeplearning4j入门(五)- 简易数据分类 - 寒沧
- 【教程】Deeplearning4j入门(六)- MNIST手写数字分类 - 寒沧
- 【教程】Deeplearning4j入门(七)- 模型训练可视化 - 寒沧
- 【教程】Deeplearning4j入门(八)- 模型保存和读取 - 寒沧
- 【教程】Deeplearning4j入门(九)- 卷积神经网络 - 寒沧
- 【教程】Deeplearning4j入门(十)- GPU加速训练 - 寒沧
- 【教程】Deeplearning4j入门(十一)- 使用模型预测手写数字 - 寒沧
- 【教程】Deeplearning4j入门(十二)- 理解LSTM - 寒沧
- 【教程】Deeplearning4j入门(十三)- LSTM源码阅读 - 寒沧
- 【教程】Deeplearning4j入门 -(十四)初用LSTM - 寒沧
- 【教程】Deeplearning4j入门 - (十五)构建非MAVEN的dl4j项目 - 寒沧
- 【教程】Deeplearning4j入门 - (十六)数据准备和内存管理 - 寒沧
- 【教程】Deeplearning4j入门 - (十七)早停法训练模型 - 寒沧
- 【教程】Deeplearning4j入门 - (十八)迁移学习 - 寒沧
所有代码示例均放置在github上面,地址为:https://github.com/sjsdfg/dl4j-tutorials
强化学习 RL4j
参考资料:
- 简书文章:https://www.jianshu.com/p/4d7f23395e92
- gitee代码:https://gitee.com/re6g3y/DL4J-with-LIBGDX
dl4j概览
- dl4j快速索引:网络层,功能和类
- dl4j-example 概览
- dl4j 神经网络评估
- dl4j 版本发布日志
- Java api文档
- skymind 官方博客
- Quickstart with Deeplearning4J
- 旧版本官网github
- skymind ai wiki
- skymind开源数据集集合
- Java Deep Learning Projects: Implement 10 real-world deep learning using Deeplearning4j and opensource APIs
调参
- 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误
- nd4j 和 DeepLearning4j 性能调优 debug
- 神经网络训练问题排查
lesson1 nd4j基础操作
参考资料:
- 一天搞懂深度学习
- Deep Learning A Practitioner’s Approach
- https://nd4j.org/userguide
- nd4j方法快速索引
lesson2 简易线性回归
参考资料:
- 深度神经网络简介
- 译-第四章 可视化证明神经网络可以计算任何函数
- A visual proof that neural nets can compute any function
- 神经网络中Epoch、Iteration、Batchsize相关理解和说明
lesson3 简易数据分类
参考资料:
- ETL用户指南
- MNIST基础教程,包含一些分类知识
- Deeplearning4j Smote 样本均衡实现
lesson4 Minst手写数字分类
参考资料:
- MINST数据集
- 神经网络学习的可视化、监测及调试方法
lesson5 模型保存与读取
参考资料:
- HDFS模型保存
- SparkDl4jMultiLayer模型存储
lesson6 Minst手写数字模型改进-CNN
参考资料:
- 关于深度学习之CNN经典论文原文(1950~2018)简介
- Visualizing and Understanding CNNs.pdf
- deep learning for computer vision with python(3 本) 密码:vr0r
- 对ResNet本质的一些思考
在使用 GPU 加速之前请务必确认一下几点:
- 电脑是否为 英伟达 GPU,即 GTX 系列,使用 AMD 显卡无法使用 GPU 加速
- 电脑是否安装了 cuda ,如果安装了 cuda 请确认安装的 cuda 版本和你 pom 中引入的
nd4j.backend
版本是否对应
- 电脑安装 cuda 之后请确保你的 IDE 已经感知到环境变量的变化,在 IDE 中的
terminal
使用 nvcc -V
命令查看。如不确定直接重启电脑即可
以下为 GPU 安装和使用教程:
- Deeplearning4j-使用Cuda 9.1和 Cudnn7.1 加速模型训练
- 在Deeplearning4j中使用cuDNN
- 【视频】Deeplearning4j入门 - (十)GPU加速训练 - 寒沧
如想确定 DeepLearning4j 已经支持的 cuda 和 cudnn 的配套版本,请打开如下链接:
- Using Deeplearning4j with cuDNN :搜索
CUDA Version
字眼
lesson7 RNN循环神经网络
参考资料
- 理解LSTM网络:https://www.jianshu.com/p/9dc9f41f0b29
- 循环网络和LSTM教程:https://deeplearning4j.org/cn/recurrentnetwork
- DL4J中的循环网络:https://deeplearning4j.org/cn/usingrnns
- DeepLearning4j: LSTM Network Example
ObjectDetection 目标检测
参考资料:
- DeepLearning4j-使用Java训练YOLO模型
- Java构建汽车无人驾驶:汽车目标检测
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
- 【中文】Yolo v1全面深度解读 目标检测论文
- 【中文】Mask R-CNN 深度解读与源码解析 目标检测 物体检测 RCNN object detection 语义分割
- 目标检测自定义数据集:https://pan.baidu.com/s/1u5yYv5SmK_vgd1zq1PsteQ
tensorflow 导入tf模型
参考资料:
- https://blog.csdn.net/u011669700/article/details/80025161
baidudianshi 百度点石比赛 baseline demo
参考资料:
- 比赛地址:http://dianshi.baidu.com/dianshi/pc/competition/22/rule
- 防止比赛结束,数据寻回链接:https://pan.baidu.com/s/1_M0yPejFTvxDFOn4780OPA
- Baseline 0.83 得分模型:https://pan.baidu.com/s/1i-v02HnMPQwjtm32fPp67A (已经保存 Updater 信息,可用于增量训练)
- 内存管理官方文档:https://deeplearning4j.org/docs/latest/deeplearning4j-config-memory
- 迁移学习官方文档:https://deeplearning4j.org/docs/latest/deeplearning4j-nn-transfer-learning
- 迁移学习推荐阅读博客:https://blog.csdn.net/wangongxi/article/details/75127131
- 早停法训练模型官方文档:https://deeplearning4j.org/docs/latest/deeplearning4j-nn-early-stopping
- 百度点石-“探寻地球密码”天宫数据利用大赛.md
- 百度点石-“探寻地球密码”天宫数据利用大赛.pdf
模型训练早停法
1. 创建 ModelSaver
用于在模型训练过程中,指定最好模型保存的位置:
- InMemoryModelSaver:用于保存到内存中
- LocalFileModelSaver:用于保存到本地目录中,只能保存
MultiLayerNetwork
类型的网络结果
- LocalFileGraphSaver:用于保存到本地目录中,只能保存
ComputationGraph
类型的网络结果
2. 配置早停法训练配置项
- epochTerminationConditions:训练结束条件
- evaluateEveryNEpochs:训练多少个epoch 来进行一次模型评估
- scoreCalculator:模型评估分数的计算者
- org.deeplearning4j.earlystopping.scorecalc.RegressionScoreCalculator 用于回归的分数计算
- ClassificationScoreCalculator 用于分类任务的分数计算
- modelSaver:模型的存储位置
- iterationTerminationConditions:在每一次迭代的时候用于控制
3. 获取早停法信息
//Conduct early stopping training:
EarlyStoppingResult result = trainer.fit();
System.out.println("Termination reason: " + result.getTerminationReason());
System.out.println("Termination details: " + result.getTerminationDetails());
System.out.println("Total epochs: " + result.getTotalEpochs());
System.out.println("Best epoch number: " + result.getBestModelEpoch());
System.out.println("Score at best epoch: " + result.getBestModelScore());
//Print score vs. epoch
Map scoreVsEpoch = result.getScoreVsEpoch();
List list = new ArrayList<>(scoreVsEpoch.keySet());
Collections.sort(list);
System.out.println("Score vs. Epoch:");
for( Integer i : list){
System.out.println(i + "\t" + scoreVsEpoch.get(i));
}
迁移学习
1. 获取原有的网络结构
// 构造数据模型
ZooModel zooModel = VGG16.builder().build();
ComputationGraph vgg16 = (ComputationGraph) zooModel.initPretrained();
2. 修改模型的训练部分超参数
- updater
- 学习率
- 随机数种子:用于模型的复现
FineTuneConfiguration fineTuneConf = new FineTuneConfiguration.Builder()
.updater(new Nesterovs(0.1, 0.9))
.seed(123)
.build();
3. 修改网络架构
3.1 setFeatureExtractor
用于指定那个层以下为非 frozen 层,非冻结层。
3.2 结构更改
- 一般只有不同网络层之间才会出现 shape 异常:需要根据异常信息调整我们的网络层结构和参数
removeVertexKeepConnections
和 addLayer
或者是 addVertex
进行网络结构的更改
自定义网络层实现GRU
参考资料:
- https://github.com/Gerry-Pan/pan-dl4j
根据GRU前向公式推导反向公式,并在dl4j中实现。
JStarCraft
群友 @HongZhaoHua 实现
- JStarCraft Core:JStarCraft Core是一个面向对象的轻量级框架,遵循Apache 2.0协议。
- JStarCraft AI:JStarCraft AI是一个机器学习的轻量级框架.遵循Apache 2.0协议.
- JStarCraft Recommendation:JStarCraft Recommendation是一个面向推荐系统的轻量级引擎.遵循Apache 2.0协议。JStarCraft Recommendation引擎基于JStarCraft AI框架重构了所有LibRec引擎的推荐算法。
机器学习算法底层均使用 Nd4j 实现。代码可以参考迁移到使用 dl4j 框架的代码中。
整合DL4J训练模型与Web工程
参考资料:
- 博文地址:https://my.oschina.net/u/1778239/blog/1648854
- 源码地址:https://gitee.com/lxkm/dl4j-demo/tree/master/digitalrecognition
深度学习】图像矫正、dl4j yolo和tesseract ocr
参考资料:
- 视频地址:https://tianchi.aliyun.com/forum/videoStream.html#postsId=5312
- 视频代码所在github:https://github.com/awaymeet/tesseract
人脸识别 - FaceRecognition
参考资料:
- https://github.com/fradino/FaceRecognition
- https://gitee.com/xshuai/FaceRecognition
推荐系统 - Recommend
参考资料:
- lib-rec:https://github.com/guoguibing/librec/tree/3.0.0/core/src/main/java/net/librec/recommender/nn
- inception:https://github.com/inception-project/inception/tree/master/inception-imls-dl4j/src/main/java/de/tudarmstadt/ukp/inception/recommendation/imls/dl4j/pos
Deeplearning4j 实现 Attention
参考资料:
- 直播实现视频 youtube(自备梯子)
- Implementing NLP Attention Mechanisms with DeepLearning4j(搬运到国内bilibili)
- attention 实现源码
- Attention Mechanisms (Enterprise AI Virtual Meetup).pdf
GAN
- GAN 使用 MNIST 实例。群友 @城枫林 和 @liweigu 提供
- gan_deeplearning4j
自制AI图像搜索引擎
群友 @射水鱼 攥写了一本使用 DeepLearning4j 实现的《自制AI图像搜索引擎》
按章节详细讲述了图像搜索引擎各主要组成部分的原理和实现,并在最后一章带领大家使用DL4J从零开始逐步构建了一个基于深度学习的Web图像搜索引擎,使读者能够更透彻地理解图像检索的理论并具有独立地实现一个在线图像搜索引擎的实际能力。每章都在对相关理论和方法进行阐述的同时,使用基于Java语言的实现代码和详实的代码注释来对相关理论和方法进行复述。
- 书籍地址:https://www.epubit.com/book/detail/30316
- 源码地址:https://box.lenovo.com/l/LHh2vR 密码: 1aaa
be.tarsos
TarsosLSH
${tarsosLSH.version}
如果导入项目中有依赖缺失,下载以下 jar 包:
- TarsosLSH-0.9 下载地址 提取码:88qv
- TarsosLSH github地址,也可以自行编译
使用 system
进行本地的 jar 包导入,或者使用以下命令安装在本地的 maven 仓库中:
mvn install:install-file -Dfile=/path/to/jar -DgroupId=be.tarsos -DartifactId=TarsosLSH -Dversion=0.9 -Dpackaging=jar
强化学习 RL4j
参考资料:
- 简书文章:https://www.jianshu.com/p/4d7f23395e92
- gitee代码:https://gitee.com/re6g3y/DL4J-with-LIBGDX
Deeplearning4j 经典开源项目
- ScalphaGoZero:An independent implementation of DeepMind's AlphaGoZero in Scala, using Deeplearning4J (DL4J 实现阿尔法狗)
- https://github.com/tahaemara/yolo-custom-object-detector : 使用 YOLO 检测实时检测自定义数据集 - 魔方
- https://github.com/mccorby/PhotoLabeller : 安卓客户端实现分布式训练。 使用 Kotlin 实现
- https://github.com/tahaemara/real-time-sudoku-solver : 使用 dl4j 解决数独
- https://github.com/kaiwaehner/kafka-streams-machine-learning-examples : kafka 流训练
- https://github.com/fra82/textdigester : dl4j 实现文档总结
获取最新的Deeplearning4j(Snapshots And Daily Builds)
参考资料:
- https://deeplearning4j.org/docs/latest/deeplearning4j-config-snapshots
配置 pom.xml
文件
snapshots-repo
https://oss.sonatype.org/content/repositories/snapshots
false
true
daily
自动获取 skymind 所提供的 jar 包编译更新
Spark 读取数据
- https://github.com/deeplearning4j/dl4j-examples/issues/689
- Spark Data Pipelines Guide
- Spark 训练指南
ok, so there's 2 ways (a) use SparkContext.parallelize (that's a standard spark op) - easy but bad performance (all preprocessing happens on master) (b) write a better data pipeline that does the proper reading + conversion in parallel
额外资源
- 机器学习高质量数据集大合辑
- 中文开放聊天语料整理
- gitxiv:只提供有复现开源代码的论文
- hadoop-winutils:提供 hadoop 工具在 windows 平台下的 hadoop.dll和winutils.exe。便于 windows 下运行 spark-local 模式
- 深度学习理论与实战:提高篇