DL4J源码分析

这篇博客介绍了ND4J库在深度学习中的作用,包括NDArray的多维数组操作,如形状、步幅和数据类型。工作间机制允许高效内存管理,特别是对于循环工作负载。此外,还提到了DL4J的层工作区管理器简化了内存分配。反向减法作为一元运算示例,展示了如何在数组上执行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

源码目录(部分)

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顺序数组的组合。大多数用户只能使用默认的数组排序,但请注意,如果需要,可以对给定的数组使用特定的排序。

C vs. F order

工作间

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值