dl4j-tutorials
deeplearning4j 教程
视频教程列表:Deeplearning4j - 入门视频
哔哩哔哩直达地址:https://space.bilibili.com/327018681/#/
- 交流群: 289058486
- 入群问题: Deeplearning4j 源码在 github的地址(mac 系统QQ看不到群问题,入群记得添加答案)
DeepLearning4J(DL4J)是一套基于Java语言的神经网络工具包,可以构建、定型和部署神经网络。DL4J与Hadoop和Spark集成,支持分布式CPU和GPU,为商业环境(而非研究工具目的)所设计。Skymind是DL4J的商业支持机构。
Deeplearning4j拥有先进的技术,以即插即用为目标,通过更多预设的使用,避免多余的配置,让非企业也能够进行快速的原型制作。DL4J同时可以规模化定制。DL4J遵循Apache 2.0许可协议,一切以其为基础的衍生作品均属于衍生作品的作者。
Give Me a Favor
注意
因为使用的maven管理项目,所以第一次使用的时候更改maven配置。更改仓库地址为国内的阿里云
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
使用maven把jar包导出为外部
mvn dependency:copy-dependencies -DoutputDirectory=target/lib
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
调参
lesson1 nd4j基础操作
参考资料:
lesson2 简易线性回归
参考资料:
- 深度神经网络简介
- 译-第四章 可视化证明神经网络可以计算任何函数
- A visual proof that neural nets can compute any function
- 神经网络中Epoch、Iteration、Batchsize相关理解和说明
lesson3 简易数据分类
参考资料:
lesson4 Minst手写数字分类
参考资料:
lesson5 模型保存与读取
参考资料:
lesson6 Minst手写数字模型改进-CNN
参考资料:
- 关于深度学习之CNN经典论文原文(1950~2018)简介
- Visualizing and Understanding CNNs.pdf
- deep learning for computer vision with python(3 本) 密码:vr0r
- 对ResNet本质的一些思考
- DL4J之CNN对今日头条文本分类
在使用 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模型
参考资料:
JStarCraft,一个涵盖核心编程,人工智能,推荐与搜索领域的轻量级框架
群友 @HongZhaoHua 实现
- JStarCraft Core:提供了缓存,ORM,编解码,资源管理,脚本,监控,通讯,事务8个方面的核心特性,是整个框架的核心。 https://github.com/HongZhaoHua/jstarcraft-core
- JStarCraft AI:包含了多种矩阵和向量计算的实现,支持硬件加速和并行计算,是目前最快最全的Java矩阵/向量计算库。 https://github.com/HongZhaoHua/jstarcraft-ai
- JStarCraft RNS:包含了70多种排序预测与评分预测算法,支持多种脚本语言,是覆盖范围最全的Java推荐与搜索引擎。 https://github.com/HongZhaoHua/jstarcraft-rns
- JStarCraft Example:一个基于JStarCraft RNS引擎,Spring Boot框架和MovieLens 100K数据集搭建的电影演示项目,包括个性化推荐与个性化搜索两个部分。系统会根据用户的行为记录,自动调整用户的推荐内容和搜索内容。https://github.com/HongZhaoHua/jstarcraft-example
作者 | 洪钊桦 |
---|---|
[email protected], [email protected] |
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<Integer,Double> scoreVsEpoch = result.getScoreVsEpoch();
List<Integer> 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
参考资料:
根据GRU前向公式推导反向公式,并在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
参考资料:
参数共享
- StackVertex,用它就能实现参数共享
数学方法参数证明:
与其类似的类为 MergeVertex
,与其的主要区别在于:
- Merge 的合并方式是沿着 dimension=1 合并,Stack 是沿着 dimension=0 合并
- 沿着 dimension=0 合并的好处是无论第 0 维的长度为多少,权重 w 的 shape 都不会变,而且在反向计算梯度恰好等于 n 个 input 的产生的梯度的和
- 所以只要使用 StackVertex 对 n 个输入进行合并,后面随意拼接神经网络层,诸如 DenseLayer, LSTM, ConvLayer 都能达到目的,最后用 UnstackVertex 拆分输出
数学推导 @Gerry 提供。其从矩阵运算角度说明 StackVertex 只做合并就能实现参数共享的原因
天池比赛-工业蒸汽量预测
群友 @冷血狂魔提供
背景
火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。
目标
经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。
推荐系统 - 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
- 如何用Deeplearning4j实现GAN
自制AI图像搜索引擎
群友 @射水鱼 攥写了一本使用 DeepLearning4j 实现的《自制AI图像搜索引擎》
按章节详细讲述了图像搜索引擎各主要组成部分的原理和实现,并在最后一章带领大家使用DL4J从零开始逐步构建了一个基于深度学习的Web图像搜索引擎,使读者能够更透彻地理解图像检索的理论并具有独立地实现一个在线图像搜索引擎的实际能力。每章都在对相关理论和方法进行阐述的同时,使用基于Java语言的实现代码和详实的代码注释来对相关理论和方法进行复述。
- 书籍地址:https://www.epubit.com/book/detail/30316
- 源码地址:https://box.lenovo.com/l/LHh2vR 密码: 1aaa
<dependency>
<groupId>be.tarsos</groupId>
<artifactId>TarsosLSH</artifactId>
<version>${tarsosLSH.version}</version>
</dependency>
如果导入项目中有依赖缺失,下载以下 jar 包:
使用 <scope> system </scope>
进行本地的 jar 包导入,或者使用以下命令安装在本地的 maven 仓库中:
mvn install:install-file -Dfile=/path/to/jar -DgroupId=be.tarsos -DartifactId=TarsosLSH -Dversion=0.9 -Dpackaging=jar
强化学习 RL4j
参考资料:
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)
参考资料:
配置 pom.xml
文件
<repositories>
<repository>
<id>snapshots-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy> <!-- Optional, update daily -->
</snapshots>
</repository>
</repositories>
自动获取 skymind 所提供的 jar 包编译更新
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
群友项目分享
- 基于dl4j的快三爬取和训练以及预测:https://github.com/awaymeet/lottery_kuai_san/tree/master
- 开源的学习SpringCloud和Deeplaring4j和IBMWaston知识的项目: https://github.com/JamesZow/Spring-Cloud-Project
- DL4J的CNN+RNN+CTC的文字识别的demo:https://github.com/WuWei1986/dl4j-ocr-demo
- 全连接层的神经网络框架的雏形:https://github.com/woshiyigebing/my_dl4j (只用了INDarray。给新手研究入门一些启发)
额外资源
- 机器学习高质量数据集大合辑
- 中文开放聊天语料整理
- gitxiv:只提供有复现开源代码的论文
- papers with code
- hadoop-winutils:提供 hadoop 工具在 windows 平台下的 hadoop.dll和winutils.exe。便于 windows 下运行 spark-local 模式
- hadoop-winutils for 3.+
- 深度学习理论与实战:提高篇
- tablesaw:Java dataframe and visualization library https://jtablesaw.github.io/tablesaw/ 提供类似于 Python 中的 Pandas 和 Matplot 的功能
- 让机器学习更具有可解释性:https://christophm.github.io/interpretable-ml-book/