目录
源码目录(部分)
NDArray
工作间
DL4J的层工作间管理器
沿维张量(TAD)
反向减法
源码目录(部分)
DeepLearning4J: 包含用于既在单个机器上,又在分布式上学习神经网络的所有代码。
ND4J: “Java的n维数组”。ND4J是建立DL4J的数学后端。所有的DL4J神经网络都是使用ND4J中的运算(矩阵乘法、向量运算等)来构建的。ND4J是DL4J实现在没有改变网络本身的情况化,即可以CPU又可以GPU训练网络的原因。 没有Nd4J,就不会有DL4J。
DataVec: DataVec处理管道侧的数据导入和转换。如果你 想将图像、视频、音频或简单CSV数据导入DL4J:你可能想要使用DataVec来实现。
Arbiter: Arbiter是一种用于神经网络超参数优化的软件包。超参数优化是指自动选择网络超参数(学习速率、层数等)以获得良好性能的过程。
NDArray
NDArray本质上是一个n维数组:即一个具有一定维数的数字矩形数组。
- NDArray的rank是维度数。二维数组的rank为2,三维数组的rank为3,依此类推。你可以创建具有任意rank的NDArrays。
- NDArray
的(shape)形状定义了每个维度的大小。假设我们有一个有3行5列的二维数组。这个
NDArray的形状是[3,5]
- NDArray的长度定义了数组中元素的总数。长度始终等于构成形状的值的乘积。
- NDArray的步幅定义为每个维度中相邻元素的间隔(在底层数据缓冲区中)。步幅是按维度定义的,因此一个rank 为 n的 NDArray有n个步幅值,每个维度一个。请注意,大多数情况下,你不需要了解(或关注)步幅-只需注意这是ND4J内部的运作方式。下一节有一个步幅的例子。
- NDArray的数据类型指的是一个NDArray的数据类型(例如, float 或 double 精度)。注意在nd4j中是全局的设置,所以所有的NDArrays应该有相同的数据类型。设置数据类型会在这个文档的后面再讨论。
就索引而言这里有一些事情需要知道。首先,维度0是行,维度1是列:因此INDArray.size(0)是行的数量,INDArray.size(1)是列的数量,索引是0开始的:因此行有从0到INDArray.size(0)-1的索引,对于其他维度,依此类推。
物理上,INDArray背后的数据是堆外存储的:也就是说,它存储在Java虚拟机(JVM)之外。这具有许多优点,包括性能、与高性能BLAS库的互操作性以及避免JVM在高性能计算中的一些缺点(例如,由于整数索引,Java数组限于2 ^ 31 - 1(21亿4000万)个元素)。
在编码方面,可以按C(行主要)或Fortran(列主要)顺序对NDArray进行编码。有关行与列主顺序的更多详细信息,请参阅维基百科。ND4J可以同时使用C和F顺序数组的组合。大多数用户只能使用默认的数组排序,但请注意,如果需要,可以对给定的数组使用特定的排序。
工作间
ND4J提供了一个额外的内存管理模型:工作间。这允许你在没有用于堆外内存跟踪的JVM垃圾回收器的情况下,重用循环工作负载的内存。换句话说,在工作间循环结束时,所有的数组内存内容都会失效。工作间被集成到DL4J中进行训练和推理。
基本思想很简单:你可以在工作间(或空间)内执行你需要的操作,并且如果你要从其去除一个INDArray(即,将结果移出工作空间),只需调用INDArray.detach(),你将获得一个独立的INDArray副本。
DL4J的层工作间管理器
DL4J的层API包含一个“层工作区管理器”的概念。
这个类的思想是,它允许我们在给定工作间的不同的可能配置的情况下,轻松且精确地控制给定数组的位置。例如,层外的激活可以在推理期间放置在一个工作间中,而在训练期间放置在另一个工作间中;这是出于性能原因。然而,使用层工作间管理器设计,层的实现者不需要为此而烦恼。
这在实践中意味着什么?通常很简单…
- 当返回 (
activate(boolean training, LayerWorkspaceMgr workspaceMgr)
方法),确保返回的数组已在ArrayType.ACTIVATIONS
(i.e., 使用 LayerWorkspaceMgr.create(ArrayType.ACTIVATIONS, …) 或类似)中定义 - 当返回激活梯度 (
backpropGradient(INDArray epsilon, LayerWorkspaceMgr workspaceMgr)
),类似的返回一个在ArrayType.ACTIVATION_GRAD 中定义的数组。
你还可以在适合的工作间使用一个在任何工作间定义的数组,例如:LayerWorkspaceMgr.leverageTo(ArrayType.ACTIVATIONS, myArray)
注意,如果你没有实现自定义层(而是只想对MultiLayerNetwork/ComputationGraph之外的层执行转发),那么可以使用LayerWorkspaceMgr.noWorkspaces()
。
沿维张量(TAD)
沿维张量背后的思想是得到一个低阶子数组,它是原始数组的视图。
“沿维张量”方法采用两个参数:
- 要返回的张量的索引(在0到numTensors-1的范围内)
- 执行TAD操作的维度(1个或多个值)
The simplest case is a tensor along a single row or column of a 2d array. Consider the following diagram (where dimension 0 (rows) are indexed going down the page, and dimension 1 (columns) are indexed going across the page):
最简单的情况是沿二维数组的单个行或列的张量。考虑下面的关系图(其中维度0(行)在页面下方被索引,维度1(列)在页面上方被索引):
反向减法
反向减法 (scalar - arr1): arr1.rsub(myDouble)