查看: 341|回复: 3

DL4J核心概念

[复制链接]
论坛徽章:
16
JVM徽章
日期:2014-12-24 15:14:33Hadoop研习者中级
日期:2017-11-09 17:09:09HBase徽章
日期:2017-09-19 10:55:54storm徽章
日期:2017-09-19 10:54:59spring徽章
日期:2017-08-10 15:30:59神经网络徽章
日期:2017-07-27 17:24:31Java徽章
日期:2017-06-09 15:42:20Hive徽章
日期:2017-03-10 11:59:24Java徽章
日期:2015-07-29 15:04:13R研习者中级
日期:2015-04-15 15:28:59R研习者中级
日期:2015-04-10 15:21:17树莓派
日期:2015-04-10 15:20:01
发表于 2019-3-30 12:49 | 显示全部楼层 |阅读模式

网络 模型 机器学习 深度学习 ETL

https://deeplearning4j.org/cn/core-concepts

机器学习应用程序由两个部分组成。一个部分负责加载数据并对其进行预加工,以供网络学习。我们将这一部分称为ETL(提取、转换、加载)流程。 我们建立了名为DataVec 的库来简化这一流程。另一个部分则是实际的机器学习系统——这是DL4J的核心。

所有机器学习都以向量的数学运算为基础,因此DL4J需要依赖名为ND4J的计算库。ND4J让我们能进行任意N维数组(亦称张量)的运算,而在各类后端的支持下,这一计算库甚至能同时使用CPU和GPU资源。

与其他机器学习和深度学习框架不同,DL4J将数据加载和网络定型分为两套不同的流程。您不能直接将模型指向磁盘上某处存储的数据,而是需要使用DataVec来加载数据。这种模式更加灵活,同时也让数据加载流程保持简单,为用户带来方便。

在开始学习之前,您必须对数据进行预加工,即使模型已定型完毕也一样。数据预加工即加载数据并将其转换至合适的形态和取值区间。用户自行实现的预加工流程非常容易出现错误,所以请尽可能使用DataVec。

深度学习兼容多种数据类型,包括图像、csv、arff、纯文本等;而未来与Apache Camel集成后,几乎所有已知的数据类型都可以用于深度学习。

回复

使用道具 举报

论坛徽章:
16
JVM徽章
日期:2014-12-24 15:14:33Hadoop研习者中级
日期:2017-11-09 17:09:09HBase徽章
日期:2017-09-19 10:55:54storm徽章
日期:2017-09-19 10:54:59spring徽章
日期:2017-08-10 15:30:59神经网络徽章
日期:2017-07-27 17:24:31Java徽章
日期:2017-06-09 15:42:20Hive徽章
日期:2017-03-10 11:59:24Java徽章
日期:2015-07-29 15:04:13R研习者中级
日期:2015-04-15 15:28:59R研习者中级
日期:2015-04-10 15:21:17树莓派
日期:2015-04-10 15:20:01
 楼主| 发表于 2019-3-30 12:49 | 显示全部楼层
神经网络使用取值范围限于-1到1之间的数据时表现较佳。原因在于网络的定型采用梯度下降,而此类算法的激活函数的取值区间通常在-1到1的范围之内。即便您采用的是不会迅速饱和的激活函数,理想的做法仍然是将数据的取值区间限制于这一范围;而这样做通常可以提高网络性能。

DL4J中的数据标准化很容易操作。您只需要决定数据标准化的方式,将相应的DataNormalization类设置为DataSetIterator的预处理器即可。目前您可以选择的标准化方法包括ImagePreProcessingScaler、 NormalizerMinMaxScaler和NormalizerStandardize。 ImagePreProcessingScaler显然适合用于图像数据;对其他数据而言,如果输入数据在所有维度上的范围相同,那么NormalizerMinMaxScaler是比较好的选择,其他情形下通常可以使用NormalizerStandardize。

假如您需要进行其他类型的标准化,也可以自行实现DataNormalization接口。

若您最终使用的是NormalizerStandardize,那么应当会发现这一标准化器依靠从数据中提取的统计信息。所以我们必须把这些统计信息与模型一同保存,以便在还原模型时也一并还原这些信息。
回复 支持 反对

使用道具 举报

论坛徽章:
16
JVM徽章
日期:2014-12-24 15:14:33Hadoop研习者中级
日期:2017-11-09 17:09:09HBase徽章
日期:2017-09-19 10:55:54storm徽章
日期:2017-09-19 10:54:59spring徽章
日期:2017-08-10 15:30:59神经网络徽章
日期:2017-07-27 17:24:31Java徽章
日期:2017-06-09 15:42:20Hive徽章
日期:2017-03-10 11:59:24Java徽章
日期:2015-07-29 15:04:13R研习者中级
日期:2015-04-15 15:28:59R研习者中级
日期:2015-04-10 15:21:17树莓派
日期:2015-04-10 15:20:01
 楼主| 发表于 2019-3-30 12:49 | 显示全部楼层
DataSetIterator即数据集迭代器;顾名思义,它返回的是DataSet(数据集)对象。DataSet对象只是容纳数据的特征和标签的容器,但它并非每次只能存放单个样例。一个DataSet可以按需要容纳任何数量的样例。

实现方法是将数据的值保存到多个INDArray实例中:一个用于保存样例的特征,一个用于标签,另外两个用于时间序列数据的掩膜(详情参见使用循环网络/掩膜)。

INDArray是ND4J提供的N维数组(或称张量)之一。存放特征的INDArray是一个大小为样例数量 x 特征数量的矩阵。即便只有一个样例,矩阵的形状也是如此。

为什么不把所有样例都放在一个DataSet内呢?这就要引出深度学习的另一个重要概念:微批次(mini-batch)的划分。为了产生准确率较高的结果,网络经常需要借助大量实际数据来定型。而这样的数据量经常会超过可用的内存,所以有时不可能将其存储在单个DataSet中。但即使有足够的数据存储空间,还有另一个重要原因导致我们不会一次使用全部数据。划分微批次后,可以增加每个epoch周期内模型更新的次数。

那为什么不让每个DataSet只包含一个样例呢?因为模型定型采用的是梯度下降算法,需要良好的梯度才能正常进行。一次只使用一个样例,产生的梯度就只会考虑当前样例中的误差。这会导致学习行为出现错误,大幅降低学习速度,甚至可能无法收敛至有用的结果。

微批次应当足够大,能够形成可代表实际数据情况的样本(或者至少能代表您使用的数据)。这意味着微批次应该始终包含所有您希望预测的类别,而且各个类别的样例数量应和总体数据中的分布情况大体保持一致。
回复 支持 反对

使用道具 举报

论坛徽章:
16
JVM徽章
日期:2014-12-24 15:14:33Hadoop研习者中级
日期:2017-11-09 17:09:09HBase徽章
日期:2017-09-19 10:55:54storm徽章
日期:2017-09-19 10:54:59spring徽章
日期:2017-08-10 15:30:59神经网络徽章
日期:2017-07-27 17:24:31Java徽章
日期:2017-06-09 15:42:20Hive徽章
日期:2017-03-10 11:59:24Java徽章
日期:2015-07-29 15:04:13R研习者中级
日期:2015-04-15 15:28:59R研习者中级
日期:2015-04-10 15:21:17树莓派
日期:2015-04-10 15:20:01
 楼主| 发表于 2019-3-30 12:49 | 显示全部楼层
模型定型完毕后,您会需要了解它的表现情况。为此,您应当事先分出一部分数据,不在定型中使用,而是仅仅用于模型表现的评估。这部分数据应当和模型在未来实际应用中遇到的数据具有相同的分布形式。不能直接用定型数据来进行评估的原因是机器学习方法在大到一定程度后会倾向于出现过拟合的问题。

模型评估通过Evaluation类来实现。普通前馈网络采用的评估方法和循环网络略有不同。更多使用方法的细节参见相应的示例。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-8-18 06:32 , Processed in 0.116628 second(s), 32 queries .