概述
每一个机器学习工作流至少由两部分组成。第一部份是加载你的数据并准备它用于学习。我们将此部分称为ETL(提取、转换、加载)过程。DataVec是我们为让构建数据管道更容易而构建的库。第二部分是实际的学习系统本身。这是DL4J的算法核心。
所有的深层学习都是基于向量和张量的,DL4J依赖于一个叫做ND4J的张量库。它为我们提供了处理n维数组(也叫做张量)的能力。由于其不同的后端,它甚至使我们能够同时使用CPU和GPU。
为学习和预测准备数据
与其他机器学习或深度学习框架不同,DL4J将加载数据和训练算法的任务视为单独的过程。你不只是把模型指向在磁盘上保存的数据,而是使用DataVec加载数据。这为您提供了更大的灵活性,并保留了简单数据加载的便利性。
在算法开始学习之前,你必须准备好数据,即使你已经有了一个经过训练的模型。准备数据意味着加载数据并将其置于正确的形状和值范围(例如,归一化、零均值和单位方差)。从头开始构建这些过程是容易出错的,因此尽可能使用DataVec。
Deeplearning4j可以处理许多不同的数据类型,比如图像、CSV、ARFF、纯文本,并且通过Apache Camel集成,可以处理几乎任何其它可以想到的数据类型。
要使用DataVec,需要连同RecordReaderDataSetIterator一起使用一个RecordReader接口的实现。
一旦你有了一个DataSetIterator, 它是一个描述顺序访问数据的模式,你可以使用它得到适合训练神经网络模型的格式的数据。
归一化数据
当它们被馈送的数据被归一化时,神经网络工作得最好,数据被限制在1到1之间。这样做有几个原因。一个是使用梯度下降训练网络,并且它们的激活函数通常在-1和1之间的某个范围。即使使用不会很快饱和的激活函数,将你的值限制到这个范围以提高性能仍然是很好的实践。
在DL4J中归一化数据相当简单,取决于你想要怎样归一化你的数据,并为你的DataSetIterator设置相关的DataNormalization作为预处理器。
ImagePreProcessingScaler显然是图像数据的不错的选择。如果你在输入数据的所有维度上具有统一的范围,那么NormalizerMinMaxScaler是一个不错的选择,并且NormalizerStandardize是你在其他情况下通常使用的工具。
如果你需要其他类型的归一化,你也可以自由地实现DataNormalization接口。
如果你使用NormalizerStandardize,请注意这是一个取决于从数据中提取的统计信息的一个归一化器,所以你必须同模型一起保存这些统计信息,以便你可以在恢复模型时恢复它们。
DataSets, INDArrays 和 Mini-Batches
顾名思义,DataSetIterator会返回DataSet对象。DataSet对象是数据的特征和标签的容器。但它们并不局限于一次只持有一个实例。数据集可以包含需要的多个实例。
它通过在几个INDArray实例中保存这些值:一个用于实例的特性,一个用于标签,以及另外两个用于屏蔽,如果你正在使用时间序列数据(参见使用RNN/Masking,了解更多信息)。
INDArray是ND4J中使用的n维数组或张量之一。在特征的情况下,它是实例大小数x特征数量的矩阵。即使只有一个实例,它也会有这种形状。
为什么它不同时包含所有的数据实例?
这是深入学习的另一个重要概念:迷你批处理。为了产生准确的结果,经常需要大量真实世界的训练数据。通常,这是比在可用内存中拟合的数据更多,所以有时将其存储在单个数据集中是不可能的。但是,即使有足够的数据存储,还有一个重要的原因不立即使用所有的数据。那就是使用小批量,您可以在一次训练中获得更多的更新。
那么,为什么要在数据集中有一个以上的例子呢?由于模型是使用梯度下降训练,它需要一个良好的梯度学习如何最小化误差。一次只使用一个示例将创建只考虑当前示例产生的错误的梯度。这会使学习行为不稳定,减慢学习,甚至可能导致不可用的结果。
一个小批量应该足够大,以提供真实世界(或者至少是你的数据)的代表性样本。这意味着它应该始终包含你想要预测的所有类,并且这些类的计数应该以与总体数据中的类分布大致相同。
构建一个神经网络模型
DL4J为数据科学家和开发人员提供了工具,用于在一个高层使用的概念上构建一个深度神经网络,例如 layer。它使用一个构建器模式来声明性地构建神经网络,正如您在这个(简化的)示例中可以看到的:
MultiLayerConfiguration conf =
new NeuralNetConfiguration.Builder()
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.updater(new Nesterovs(learningRate, 0.9))
.list(
new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes).activation("relu").build(),
new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).activation("softmax").nIn(numHiddenNodes).nOut(numOutputs).build()
).backprop(true).build();
如果你熟悉其他的深度学习框架,你会注意到这有点像Keras。
与其他框架不同,DL4J从更新器算法中分离优化算法。这允许灵活性,当你寻求一个优化器与更新器来为你的数据和问题最好的工作。
除了上面示例中看到的DenseLayer和OutputLayer之外,还有其他几种层类型,如GravesLSTM、卷积层、RBM、EmbeddingLayer等。使用这些层,你不仅可以定义简单的神经网络,还可以定义递归和卷积网络。
训练一个模型
在你配置你的神经网络之后,你必须训练你的模型。最简单的情况是在模型上简单的调用.fit()方法,并用你的DataSetIterator作为配置参数。这将在你所有的数据上一次性训练你的模型。在整个数据集上传递一次叫做一次训练。DL4J 有多个不同的方法来多次传递数据。
最简单的方法,是重置你的DataSetIterator并在fit的调用上循环你想要的次数。这种方法可以训练你的模型一直到你认为你的训练有良好的拟合。
然而还有一种方法是使用EarlyStoppingTrainer。只要你喜欢,你可以配置这个训练器用于你想要的训练次数。它将在每个训练之后评估你的网络性能(或者你 所配置的任何阶段),并保存性能最好的版本供以后使用。
还要注意的是,DL4J不仅支持多层次网络的训练,而且还支持更灵活的计算图
评估模型性能
当你训练你的模型时,你会想测试它的性能。对于该测试,您将需要一个专用的数据集,该数据集将不用于训练,而是仅用于评估模型。这些数据应该与你想用模型进行预测的真实世界数据有相同的分布。不能简单地将训练数据用于评估的原因是因为机器学习方法容易过拟合(擅长对训练集进行预测,但在较大的数据集上表现不佳)。
评价类用于评价。略有不同的方法适用于评估一个正常的前馈网络或循环网络。有关使用它的更多细节,请查看相应的示例。
神经网络模故障排查
建立神经网络来解决问题是一个经验过程。也就是说,它需要反复试验。因此,你必须尝试不同的设置和体系结构,以便找到性能良好的神经网络配置。
DL4J提供了一个监听器工具,帮助你直观地监视网络的性能。你可以为你的模型设置监听器,在每个小批量处理之后调用。DL4J最常用的监听器之一是ScoreIterationListener。检查更多的Listeners。
虽然ScoreIterationListener将简单的打印你的网络的当前错误分数,HistogramIterationListener将启动一个网页界面来提供你一组可以用来微调网络配置的不同信息。查看 Visualize, Monitor and Debug Network Learning来知道如何解释这些数据
查看 Troubleshooting neural nets 获取如何改进结果的更多信息。
有任何问题请联系微信
相关推荐
不过,在被Imagination公司收购后,MIPS开始加强生态系统建设,其未来的发展也被看好。 除了上述两个概念之外,文章还涉及了其他三个被误解的CPU/GPU概念。尽管具体内容未在摘录中给出,但我们可以根据标题推测,...
### Java NIO 核心概念详解 #### 一、Java NIO 基本介绍 Java NIO(New IO 或 NonBlocking IO)是 Java 1.4 版本开始引入的一种全新的 I/O API,旨在提高 I/O 吞吐量。与传统的阻塞 I/O 相比,NIO 的设计思想更为...
使用场景及目标:① 初学者可以从头开始系统学习Java的基础语法和核心概念;② 中级开发者可以通过进阶内容进一步巩固和扩展技能;③ 实战案例部分帮助读者理解和应用Java在实际项目中的使用技巧。 其他说明:本文...
这篇文章深入讲解了聚类算法的核心概念及其应用。文章从聚类的基本定义和算法类型开始,阐述了不同类型的聚类算法,包括K-means、层次聚类、DBSCAN以及高斯混合模型(GMM)的工作原理及其优缺点。文章通过多个实际...
Vue的核心概念包括响应式数据、组件化开发、虚拟DOM和单文件组件。响应式数据利用数据绑定使得UI和数据实时同步,而组件化开发则通过将应用拆分成可复用的小块来提高代码维护性。虚拟DOM技术提高了性能,只更新实际...
本文将深入解析其核心概念,并通过案例进行详细讲解。 首先,理解 `webpack-dev-server` 的工作原理至关重要。它会监听项目文件的变化,一旦检测到变动,便自动重新构建并更新页面。默认情况下,它会以运行 `...
在营销领域,了解基本概念是至关重要的。"你不可不知道的13个行销入门概念"涵盖了一...无论是初创企业还是大型公司,掌握这些核心概念都能帮助他们更有效地连接市场,满足客户需求,并在竞争激烈的市场环境中脱颖而出。
树莓派开始玩转Linux,高清pdf+epub “内容简介 本书以树莓派为基础...读者不仅能体验到玩树莓派的乐趣,而且能全面了解操作系统的核心概念和原理。” 摘录来自: Vamei. “树莓派开始,玩转Linux。” Apple Books.
本文将深入探讨webpack的四个核心概念之一——Entry,以及与之相关的module.exports和exports的用法。 首先,我们了解下module.exports和exports的关系。在Node.js环境中,每个模块都有一个module对象,其中module....
OECD在1997年开始的"素养的界定与遴选:理论和概念基础"研究项目并未直接使用“核心素养”一词,但在后续的报告中,如2003年的"核心素养促进成功的生活和健全的社会",这一概念逐渐被明确。核心素养的框架旨在提高其...
本书从介绍内存和实时内存概念开始,然后讲述了指针变量的概念和它重要的操作(引用和解引用)、指针运算和一维数组、使用指针处理字符串、指针访问多维数组的用法、使用指针访问结构体与成员字段、函数指针概念的...
该课程或文章不仅覆盖了基础知识,如环境搭建、基本应用创建,还深入探讨了游戏开发的核心概念,如动画、碰撞检测、地图设计等。 ### 搭建开发环境 在正式开始编写代码之前,搭建一个完善的开发环境至关重要。这一...
委托是C#中一个非常重要的概念,从C# 1开始就有了委托这个核心概念,在C# 2和C# 3中委托又有了很多改进。 通过委托,我们可以将一个方法当作对象封装起来,并且在运行时,我们可以通过这个对象来完成方法的调用。 ...
- **核心概念**: 日历功能是通过数字逻辑电路实现年、月、日的显示。 - **实现方法**: - 使用计数器来表示日期,并通过时钟信号进行递增。 - 需要考虑月份天数的不同,以及闰年的特殊处理。 **知识点2:计时功能...
职业教育是以“职业”和“技术”为核心概念的教育活动,它的概念界定是职业教育领域中的一个重要问题。在本文中,我们将从分析职业教育的几个关键词开始,试图对职业教育概念作初步探讨。 一、“职业教育”的几个...
事务是LoadRunner性能测试中的核心概念,它用于度量一个特定操作或一系列操作的性能。事务可以看作是测试中的一个时间窗口,从事务开始到结束,LoadRunner会记录这段时间内的响应时间。通过在Action中设置开始和...
在这个"javascript核心讲解"中,我们将深入探讨JavaScript的核心概念,包括数组、对象、日期以及Math模块的使用,并通过实例来加深理解。 1. **数组**:JavaScript中的数组是一种特殊的数据结构,可以存储多个值。...
"C语言程序设计基本概念习题" C语言程序设计是计算机科学的基础课程,本节习题涵盖了C语言程序设计的基本概念,包括...函数和模块是C语言程序设计的核心概念,可以帮助读者深入了解C语言程序设计的基本概念和应用。