精华内容
下载资源
问答
  • 原文链接:http://www.52ml.net/16157.html Deeplearning4j is the first commercial-grade deep learning library written in Java. It is meant to be used in business environments, ra...

    原文链接:http://www.52ml.net/16157.html

         Deeplearning4j is the first commercial-grade deep learning library written in Java. It is meant to be used in business environments, rather than as a research tool for extensive data exploration. Deeplearning4j is most helpful in solving distinct problems, like identifying faces, voices, spam or e-commerce fraud.

         Deeplearning4j aims to be cutting-edge plug and play, more convention than configuration. By following its conventions, you get an infinitely scalable deep-learning architecture. The framework has a domain-specific language (DSL) for neural networks, to turn their multiple knobs.

         Deeplearning4j includes a distributed deep-learning framework and a normal deep-learning framework; i.e. it runs on a single thread as well. Training takes place in the cluster, which means it can process massive amounts of data. Nets are trained in parallel via iterative reduce.

         The distributed framework is made for data input and neural net training at scale, and its output should be highly accurate predictive models.


    项目地址:http://deeplearning4j.org/

    简单介绍一下项目发起者 Gibson:

            谷歌微软等科技巨头都在进军人工智能领域。谷歌有语音识别服务,直接向手机说话就可以进行搜索;微软最近发布的新版Skype中加入了即时翻译功能;Facebook最近也成立了一个新部门,探索人脸识别技术。所有这些技术都可以称为深度学习(deeping learning),通过模仿人脑加工信息的方式,让机器拥有“学习”的能力。

            人工智能技术似乎如此高端,只能是科技巨头们的游戏,但Adam Gibson,旧金山的一名独立软件工程师,希望解除巨头对这一新技术的封锁。他认为任何有兴趣的网站,公司和开发者都应该能接触深度学习技术,并因此成立了一家创业公司Skymind。

             “我们希望不需要雇一位数据专家就能使用机器学习技术”,Gibson表示,他24岁,中途退学后通过研究学术论文自学了深度学习,曾在多个公司担任机器学习顾问,并在一些教育机构讲课。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------————————————————————我是华丽的分割线——————————————————————————————-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    转到主页:http://deeplearning4j.org/

             Deeplearning4j is the first commercial-grade deep-learning library written in Java. It is meant to be used in business environments, rather than as a research tool for extensive data exploration. Deeplearning4j is most helpful in solving distinct problems, like identifying faces, voices, spam or e-commerce fraud.

             Deeplearning4j是一个使用Java书写的商业级的深度学习库。有意思. 一定要完整的看看....

    转载于:https://www.cnblogs.com/wishchin/p/9200256.html

    展开全文
  • Deeplearning4j(DL4J)是专门为JVM编写的一个开源深度学习框架,主要用于商业级需求。该框架完全使用Java编写,因此名称中包含了4j”。因为是使用流行的Java语言编写的,所以Deeplearning4j开始受到更多的人和从业...

    Deeplearning4j(DL4J)是专门为JVM编写的一个开源深度学习框架,主要用于商业级需求。该框架完全使用Java编写,因此名称中包含了4j”。因为是使用流行的Java语言编写的,所以Deeplearning4j开始受到更多的人和从业者的欢迎。
    该框架基本上是由Hadoop和Spark集成的分布式深度学习库组成的。在Hadoop和Spark的帮助下,我们可以轻松地分发模型和大数据集,并运行多个GPU和CPU来执行操作。Deep learning4j主要在图像、声音、文本、时间序列数据等的模型识别中取得了巨大成功。除此之外,它还可以用于各种客户用例,如面部识别、欺诈检测、业务分析、推荐引擎、图像和语音搜索,以及传感器数据的预测维护。下图显示了Deeplearning4j的通用高级框架图。

    Deeplearning4j的主要特性

    Deeplearning4j具有以下引人注目的功能,因而完全不同于现有的其他深度学习工具(如Theano、Torch等)
    1.分布式架构。Deeplearning4j中的训练可以通过两种方式进行:一种是分布式的、多线程的深度学习,另一种是传统的、普通的单线程深度学习技术。训练是在商用节点的集群中进行的。因此,Deeplearning4j能够快速处理任意数量的数据。神经网络使用迭代Reduce方法进行并行训练,该方法适用于Hadoop YARN和Apache Spark。它还与Cuda内核集成,以进行纯GPU操作,并与分布式GPU配合使用。
    Deeplearning4j操作可以在Hadoop YARN或Apache Spark中作为一项作业运行。在Hadoop中,迭代Reduce节点在HDFS的每个块上工作,同时并行处理数据。处理完成后,它们将变换后的参数推送到主节点,并在主节点获得参数的平均值,接着更新每个工作者的模型。
    在Deeplearning4j中,分布式运行是可互换的,它们在一个庞大的模块化架构中充当目录角色,可以进行互换。
    2.数据并行性。神经网络能够以两种方式进行分布式训练:一种是数据并行,另一种是模型并行。Deeplearning4j遵循数据并行训练。在数据并行时,可以将大型数据集拆分成较小的数据集,并将它们分布到在不同服务器上运行的并行模型上,可以将大型数据集拆分成较小的数据集,并将它们分布到在不同服务器上运行的并行模型上,以并行方式进行训练。
    3.JVM的科学计算能力。对Java和Scala中的科学计算来说,Deeplearning4j包含了一个使用Java N维数组(N-Dimensional Arrays for Java,ND4J)的N维类。ND4J的功能比Numpy提供给Python的功能要快得多,而且主要是用C++编写的。在生产环境中,它基于一个矩阵操作和线性操作代数库。ND4J的大多数程序都被设计为以最低RAM需求来运行。
    4.机器学习的矢量化工具。为了矢量话各种文件格式和数据类型,Canova已经与Deeplearning4j合并。Canova使用一个输入/输出系统执行矢量化,就像Hadoop使用Map-Reduce一样。Canova主要用于通过命令行界面(command line interface,CLI)来矢量化文本、CSV、图像、声音、视频等。

    Deeplearning4j功能总结

    Deeplearning4j具有以下功能。
    1.Deeplearning可谓是目前最完整的、可用于生产的开源深度学习库。
    2.与基于Theano的工具相比,Deeplearning4j具有更多专门为深度网络设计的特性。
    3.Deeplearning4j易于使用,即使非专业人士也可以应用其惯例来解决计算密集型问题。
    4.这些工具具有广泛的适用性,因此网络对于图像、声音、文本、和时间序列同样适用。
    5.Deeplearning是完全分布式的,而且可以并行运行多个GPU,这不同于非分布式的Theano,也不同于还没像DL4J一样执行自动化分配的Torch7。

    在Hadoop YARN上配置Deeplearning4j

    Deeplearning4j主要作用于多层神经网络。想要使用Deeplearning4j,首先需要熟悉一些前提条件,以及如何安装所有相关软件。大部分文档都可以在Deeplearning4j的官方网站https://deeplearning4j.org/上找到。
    本期将帮助你熟悉Deeplearning的代码。首先展示使用Deeplearning4j的多层神经网络的一个简单操作和实现。接着讨论Deeplearning4j库的分布式深度学习。deeplearning4j使用Apache Spark在多个分布式GPU上训练分布式深度神经网络。最后介绍如何为Deeplearning4j设置Apache Spark。

    熟悉Deeplearning4j

    下面主要介绍使用了Deeplearning4j的“Hello World”程序。我们将借助两个简单的深度学习问题来解释Deeplearning4j库的基本功能。
    在Deeplearning4j中,MultiLayerConfiguration是Deeplearning4j库的一个类,可以当作构建块的基础,负责组织神经网络的层和相应的超参数。可以认为这个类是神经网路的Deeplearning核心组件。我们将使用这个类来配置不同的多层神经网络。
    超参数是确定神经网络学习过程的主要支柱,主要包括如何初始化模型的权值、应该更新多少次、模型的学习速率、使用的优化算法等。
    第一个示例将展示如何使用Deeplearning4j对多层感知机分类器的数据模式进行分类。
    以下是此程序中使用的训练数据集示例:

    首先需要初始化网络的各种超参数。下面的代码将为程序设置ND4J环境:

    Nd4j.ENFORCE_STABILITY = true;
    int batchSize = 50;
    int seed = 123;
    double learningRate = 0.005

    将迭代次数设置为30:

    int nEpochs = 30;
    int numInputs = 2;
    int numOutputs = 2;
    int numHiddenNodes = 20

    下面的代码将训练数据加载到网络中:

    RecordReader rr = new CSVRecordReader();
    rr.inttialize	(new FileSplit(new File(“saturn_data_train.csv”)));
    DataSetIterator trainIter = new RecordReaderDataSetIterator
    (rr,batchSize,0.2);
    

    随着训练数据的加载,使用以下代码将测试数据加载到模型中:

    RecordReader rrTest = new CSVRecordReader();
    rrTest.initialize(new FileSplit(new File(“saturn_data_eval.csv”)));
    DataSetIterator trainIter = new RecordReaderDataSetIterator
    (rrTest,batchSize,0,2);
    

    网络模型的所有层的组织结构以及超参数的设置都可以通过以下代码来完成:

    MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
    .seed(seed)
    .iterations(l)
    .opimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
    .learningRate(learningRate)
    .updater(Updater.NESTEROVS).momentum(0.9)
    .list()
    .layer(0,new DenseLayer.Builder().nIn(numInputers).nOut(numHiddenNodes)
    .weightInit(WeightInit.XAVIER)
    .activation(“relu”)
    .build())
    .layer(1,new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD)
    .weightInit(WrightInit.XAVIER)
    .activation(“softmax”)
    .nIn(numHiddenNodes).nOut(numOutputs).build())
    .presrain(false)
    .backprop(true)
    .buile();
    

    现在,训练集和测试集已经全部加载完成,可以调用init()方法来初始化模型。下面通过给定的输入对模型进行训练:

    MultiLayerNetwork model = new MultiLayerNetwork(conf);
    model.init();
    

    为了在一定时间间隔后检查输出,可以每更新5个参数就打印分数:

    model.setListeners(new ScoreIterationListener(5));
    for(int n = 0; n<nEpochs; n++)
    

    最后,调用.fit()方法来训练网络:

    {
    model.fit(trainIter);
    }
    
    System.out.println(“Evaluating the model...);
    Evaluation eval = new Evaluation(numOutputs);
    while(testIter.hasNext())
    {
    DataSet t = testIter.next();
    INDArray features = t.getFeatureMatrix();
    INDArray labels = t.getLabels();
    INDArray predicted = model.output(features,false);
    eval.eval(labels,predicted);
    }
    System.out.println(eval.stats));
    

    至此,模型的训练就完成了。

    展开全文
  • Deeplearning4j是第一个为 Java和 Scala编写的商业级、开源、分布式神经网络库,它是 Gitter上最活跃的社区之一。 Gitter采访了 Deeplearning4j的创始人Adam和 Chris,分享了他们在开源社区建设方面的想法、经验和...

    Deeplearning4j是第一个为 Java和 Scala编写的商业级、开源、分布式神经网络库,它是 Gitter上最活跃的社区之一。 Gitter采访了 Deeplearning4j的创始人Adam和 Chris,分享了他们在开源社区建设方面的想法、经验和教训。本访谈内容可以在 Gitter上的 deeplearning4j频道观看。

    Gitter的数字战略和成长顾问 Ola Kohut日前写了这篇采访录,经Gitter授权, InfoQ翻译并分享。

    能否为我们介绍一下您自己和 Deeplearning4j社区?还有社区是怎么起步的?

    我们在2013年年底就开始构建 Deeplearning4j。那时 Adam已经参与机器学习大约有四年左右,当时,深度人工神经网络看上去前景一片光明。 Deeplearning4j的第一个网络是受限玻尔兹曼机,这是 Geoff Hinton在2006年提出的网络,这个领域的转折点。当时我正在另一家创业公司负责公关和招聘。以前我曾做过记者,因此我负责维护文档的工作(现在仍然也在做),因为我们相信,让开源代码具有价值的关键就是适当的沟通。

    他们在 Deeplearning4j频道中讨论的主要问题是什么?

    以前主要问题是关于安装方面。社区的工程师教会了我们很多东西,比如关于如何编写更清晰的指令以及如何使代码和体验变得更好,如果我们没有反馈环路的话, Deeplearning4j的情况就会变得更糟。作为质量控制,开源社区真的很了不起!你解决问题越早,那么这个问题从社区被提到的要求就越少。这极大地激励着我们迅速行动。

    现在主要问题是关于数据的加载和神经网络的优化。我们正在努力进行更好的沟通,并使框架做得更好,以便使 ETL和优化变得更加容易。最后,很多都是关于机器学习和深度学习的基本问题。许多软件工程师已经意识到,深度学习和机器学习是真正强大的工具,因此他们努力领会这些新想法。为此,我们编写了许多介绍性材料,并链接到解释这些想法的网页。

    作为一个社区,有什么共同目标吗?

    现在社区主要围绕 Deeplearning4j和我们的科学计算库( ND4J,用于神经网络的一个库)为中心目标。因此我们要回答如何使用这些库的问题,其间我们还帮助人们更多地了解深度学习。然而这并不是关于深度学习的热线,遗憾的是,有些问题我们不予回答。但我们会帮助 DL4J社区的工程师构建应用并了解神经网络如何工作。

    共同目标就是学习深度学习,并创造出一些酷玩意儿。深度学习能够做什么,我们只看到了冰山一角。到目前为止,人们已经目睹图像识别、机器翻译、机器转录、时间序列预测取得了巨大的进步。许多指标表明,机器感知能力或已超过人类。这将给社会带来令人难以想象的改变。只不过这些改变尚未实施。因此,社区的次要目标是将狭义上的AI带到这个世界,以期它能改变世界。

    在创建和维护社区时,您已经考虑哪些最重要的因素?哪些因素有助于社区的成功?

    创建和维护社区需要付诸巨大的时间和精力。你必须可以被别人联系上,还必须尝试了解其他人来自哪里。他们并不总知晓所提出问题的精准术语,因此你必须有耐心搞清楚他们想要问什么,或者他们遇到了什么困难。我们应该一直保持耐心。

    保持联系,为之努力,并为强大的工具提供支持是社区建立的好方法。当大项目的创建者可以回答它如何工作的那些深奥问题时,这就得到了很多信任。因为人们知道你所言是权威的。如果事情真的坏了,它将会得到解决。社区和项目创建者之间有一条紧密的反馈环路。

    管理社区的主要挑战是什么?

    其中的挑战是:我们关心什么问题,以及人们需要为自己回答什么问题?如果有人对 Java有一些基础问题,像 IntelliJ这样的 IDE,或者像 Maven一样的构建工具,大多时候他们需要自己去解决。我们的 Gitter频道并非讨论问题之处,但在特殊情况下还是会提供帮助,因为有时你因工作需要为神经网络扩展堆空间。

    您还必须在建立社区和构建产品之间找到平衡点。理想情况下,您应有一支配备全职支持工程师的大型团队,而团队其他成员则负责代码库。但是,大多开源项目都有很小的团队。只有少数人能够提供支持,他们同时也是修复错误并添加功能的那群人。

    你如何鼓励参与者对社区的承诺和贡献?

    您在社区中营造一个敏捷、友好的环境。你要让他们知道你很感激他们的贡献,并要尽可能引导他们知晓需要做什么。我们创建了识别贡献者的顶层文件,展示如何做出贡献,并制定了社区的规则。我们还写了一本开发人员指南,现在,我们将所有问题标记为“错误”、“增强”或“文档”,以便人们可以快速扫视列表并探索他们可以为之添加什么。

    告诉我们一些关于社区建立所需的时间承诺。社区持续发展需要多少维护?

    Skymind是一支分布式团队,工程师分布在澳大利亚、欧洲和美国, Deeplearning4j社区成员几乎遍布全球。平日Skymind工程师查看 Gitter队列可能要耗上12~16个小时。这是相当认真的承诺,因为我们团队不到10个人。这不是他们的专职工作,但也许他们会在休息的时间来进行单元测试并回答 Gitter上的问题。

    根据您的经验,您认为开源社区在过去几年中是否发生了改变?如果是这样,情况又如何?

    开源越来越受企业青睐,因此它比以前更为重要。世界上最大的机构正在使用开源软件。 Linux赢得了操作系统 ,而Hadoop赢得了大数据存储。开源之所以取得胜利,是因为当你以正确的方式来做时,你会得到更好的代码。吸引更多的眼球意味着正常运行时间会更多。因此, OSS社区的规模以及软件工程师对开源项目的关注质量,都在逐年增加。

    对于想从零开始创建在线开源社区的人们,您会给出什么建议?

    首先,创建一个精良的、你所关心的项目。专注于构建一个有用的项目。然后与人们分享。他们会帮助你改进它,并可以帮助你思考接下来要做什么。在开发前期不要做太多事。尝试了解这个项目以便你在合理的时间将它推向市场。一般来说需要几个星期。开源之所以有价值,是因为它是一个会话,这个会话会引领你到正确的地方,因此,你的项目将以无法预料的方式演进。此外,在开源的早期,你提高了曝光率,因此你就获取了得到帮助的机会。我们有厉害的开发人员加入了社区和 Skymind团队。

    您使用哪些数字化工具来帮助管理和壮大社区?

    我们的代码存放在 Github上,会话则在 Gitter上。目前, Gitter频道大约有1360名开发人员,所以它可能是这个星球上神经网络更活跃的会话之一。我们的网站由 Github托管,因此内容也在那里。我们使用 Javadoc来生成大量的自动文档。我们要求人们使用 Maven作为他们的自动构建工具。任何软件最大的问题之一就是安装, Maven帮助人们更容易进行安装。你需要不断尝试清除障碍,好让人们可以使用你的代码,而不必担心其他东西。

    因为他们参与了您的频道,您能分享一名社区成员的成功故事吗?

    很多数据科学家和Java工程师都加入了社区,他们使用 DL4J开发各自的项目。之后他们表示:“当我们使用 DL4J作为推荐系统的一部分时,广告覆盖率增长了200%。”另一位开发人员表示使用 DL4J开发了一个应用,然后被投资者看上了,于是他筹集到了资金。所有这一切,都非常酷。使用开源,就好比你将一块石头扔到海里,你未必能听到石头击水的声音,甚至都看不到泛起的涟漪。因此,当人们向我们表示感谢,并告诉我们的项目为他们提供了什么样的帮助时,这一刻是令人鼓舞的,因为他们的感谢,使得这个项目的存在有了更大的意义。

    本文转自d1net(转载)

    展开全文
  • Deeplearning4j 快速入门

    千次阅读 2019-07-02 03:04:19
    课程亮点 机器学习经典案例基于 DL4J 的实现 Spark 分布式场景下的模型训练及调优 ...Deeplearning4j 是基于 Java/JVM 的深度学习开源库,课程内容涵盖了 Deeplearning4j 生态圈中核心框架的使用(如 N...

    课程亮点

    • 机器学习经典案例基于 DL4J 的实现
    • Spark 分布式场景下的模型训练及调优
    • 多 GPU 环境下的并行建模
    • 迁移和强化学习的模型训练
    • 搭建在线服务环境实战演练

    本课程是关于 Eclipse Deeplearning4j 的基础课程。Deeplearning4j 是基于 Java/JVM 的深度学习开源库,课程内容涵盖了 Deeplearning4j 生态圈中核心框架的使用(如 ND4J/DataVec/RL4J),介绍了深度神经网络在 CV/NLP 领域的建模、训练、部署、上线一站式开发流程,以及单机/并行/分布式(Apache Spark)场景下的模型训练过程,异构计算框架(CPU+GPU)硬件架构下的加速优化步骤等内容。

    大咖推荐

    作为最早一批加入到开源平台社区的技术人员,万老师也是在社区对 Deeplearning4j 最有经验的人之一,期间他也很努力地帮助其他社区的人。课程内容涵盖全面,完全满足入门级学员们对于 Deeplearning4j 的学习需求。

    ——吴书卫博士,Skymind 大中华区负责人&CTO

    作者介绍

    万宫玺,苏宁易购高级算法工程师。现任职于苏宁易购搜索研发中心,对机器学习/深度学习在自然语言处理、机器视觉等领域的应用开发有着丰富的经验,先后参与部门反作弊系统、智能问答机器人、Query 语义挖掘与分析系统等机器学习项目的开发。

    课程大纲

    enter image description here

    * 实际更新文章题目可能与框架略有出入

    适宜人群

    • 对 Deeplearning4j 入门感兴趣的初学者
    • 希望转型 AI 开发的 Java 工程师
    • 有科学计算背景的高校/企业工作人员

    课程内容

    推荐序:《Deeplearning4j 快速入门》课程,深度学习必备秘籍

    从 1956 年 Dartmouth 学会上提出的“人工智能”一词,到时下火热的人脸识别技术、车牌识别技术、智能语音应答,再到未来汽车发展趋势的自动驾驶技术,“人工智能”已然成为了科技未来的发展大势。对于广大 IT 行业从业人员而言,单纯地掌握 Java 等软件编程技术是远远不够的,学习 Deeplearning4j 技术就成为了进军“人工智能”行业的敲门砖。作为 Skymind 在亚洲的 CTO,我要为广大对 Deeplearning4j 入门感兴趣的初学者、希望转型 AI 开发的 Java 工程师、有科学计算背景的高校/企业工作人员推荐一门名为《Deeplearning4j 快速入门》的课程。

    推荐理由之授课教师

    担任本次课程的主讲老师是苏宁易购高级算法工程师的万宫玺工程师,现任职于苏宁易购搜索研发中心,对机器学习/深度学习在自然语言处理、机器视觉等领域的应用开发有着丰富的经验,先后参与部门反作弊系统、智能问答机器人、Query 语义挖掘与分析系统等机器学习项目的开发。过硬的技术能力水平,让万老师在授课的过程中能够深入浅出的将 Deeplearning4j 的理论呈现给学员。此外,因为万老师拥有多年的行业从业经验,所以在实践方面的授课中可以让学员进一步了解 Deeplearning4j 的具体应用技巧。此外,作为最早一批加入到开源平台社区的技术人员,万老师也是在社区对 Deeplearning4j 最有经验的人之一,期间他也很努力地帮助其他社区的人。

    推荐理由之课程涵盖的具体内容及课程亮点

    课程内容涵盖全面,完全满足入门级学员们对于 Deeplearning4j 的学习需求。

    《Deeplearning4j 快速入门》课程是关于 Eclipse Deeplearning4j 的基础课程。而课程内容中的 Deeplearning4j 是基于 Java/JVM 的深度学习开源库,课程内容涵盖了 Deeplearning4j 生态圈中核心框架的使用(如 ND4J/DataVec/RL4J),用浅显易懂的授课言语介绍了深度神经网络在 CV/NLP 领域的建模、训练、部署、上线一站式开发流程,以及单机/并行/分布式(Apache Spark)场景下的模型训练过程,异构计算框架(CPU+GPU)硬件架构下的加速优化步骤等内容,让学员们在学习的过程中感受到知识的由浅入深,技术能力的不断提高。课程的最大亮点包含以下几个方面:

    • 机器学习经典案例基于 DL4J 的实现
    • Spark 分布式场景下的模型训练及调优
    • 多 GPU 环境下的并行建模
    • 迁移和强化学习的模型训练
    • 搭建在线服务环境实战演练

    推荐理由之耐心细致的引导

    众所周知,学习 Deeplearning4j 的过程中会不可避免地接触并学习数学和编程概念,而对于对这方面比较头痛的学员也大可放心,万宫玺老师在讲解的过程中采用了循序渐进的讲解过程,从授课伊始便能保证学员们可以对数学与代码一直保持着极高的学习热情。

    推荐理由之获得更多收获

    学习本门课程不仅可以让广大学员们掌握对 Deeplearning4j 基本理论及技术的应用,更可以在实际操作过程中获得顺利完成的满足感,以此刺激大脑中的多巴胺的分泌。

    结语

    学习是一门修行,而学习 Deeplearning4j 技术可谓是一场苦行,但有了万宫玺老师主讲的《Deeplearning4j 快速入门》课程,就可以让学员们不再畏惧 Deeplearning4j 中晦涩难懂的知识及术语,更可以让我们在之后从事的“人工智能”工作呈现出“长风破浪会有时”的气魄!

    开篇词:DL4J——让 Java 开发人员在机器学习领域披荆斩棘

    随着深度学习在语音、图像、自然语言等领域取得了广泛的成功,越来越多的企业、高校和科研单位开始投入大量的资源研发 AI 项目。同时,为了方便广大研发人员快速开发深度学习应用,专注于算法应用本身,避免重复造轮子的问题,各大科技公司先后开源了各自的深度学习框架,例如:TensorFlow(Google)、Torch/PyTorch(Facebook)、Caffe(BVLC)、CNTK(Microsoft)、PaddlePaddle(百度)等。

    以上框架基本都是基于 Python 或者 C/C++ 开发的。而且很多基于 Python 的科学计算库,如 NumPy、Pandas 等都可以直接参与数据的建模,非常快捷高效。

    然而,对于很多 IT 企业及政府网站,大量的应用都依赖于 Java 生态圈中的开源项目,如 Spring/Structs/Hibernate、Lucene、Elasticsearch、Neo4j 等。主流的分布式计算框架,如 Hadoop、Spark 都运行在 JVM 之上,很多海量数据的存储也基于 Hive、HDFS、HBase 这些存储介质,这是一个不容忽视的事实。

    有鉴于此,如果有可以跑在 JVM 上的深度学习框架,那么不光可以方便更多的 Java/JVM 工程师参与到人工智能的浪潮中,更重要的是可以与企业已有的 Java 技术无缝衔接。无论是 Java EE 系统,还是分布式计算框架,都可以与深度学习技术高度集成。Deeplearning4j 正是具备这些特点的深度学习框架。

    Deeplearning4j 是什么

    Deeplearning4j 是由美国 AI 创业公司 Skymind 开源并维护的一个基于 Java/JVM 的深度学习框架。同时也是在 Apache Spark 平台上为数不多的,可以原生态支持分布式模型训练的框架之一。此外,Deeplearning4j 还支持多 GPU/GPU 集群,可以与高性能异构计算框架无缝衔接,从而进一步提升运算性能。在 2017 年下半年,Deeplearning4j 正式被 Eclipse 社区接收,同 Java EE 一道成为 Eclipse 社区的一员。

    另外,就在今年的 4 月 7 号,Deeplearning4j 发布了最新版本 1.0.0-alpha,该版本的正式发布不仅提供了一系列新功能和模型结构,也意味着整个 Deeplearning4j 项目的趋于稳定和完善。

    enter image description here

    Deeplearning4j 提供了对经典神经网络结构的支持,例如:

    • 多层感知机/全连接网络(MLP)
    • 受限玻尔兹曼机(RBM)
    • 卷积神经网络(CNN)及相关操作,如池化(Pooling)、解卷积(Deconvolution)、空洞卷积(Dilated/Atrous Convolution)等
    • 循环神经网络(RNN)及其变种,如长短时记忆网络(LSTM)、双向 LSTM(Bi-LSTM)等
    • 词/句的分布式表达,如 word2vec/GloVe/doc2vec 等

    在最新的 1.0.0-alpha 版本中,Deeplearning4j 在开始支持自动微分机制的同时,也提供了对 TensorFlow 模型的导入,因此在新版本的 Deeplearning4j 中可以支持的网络结构将不再局限于自身框架。

    DeepLerning4j 基于数据并行化理论,对分布式建模提供了支持(准确来说是基于参数同步机制的数据并行化,并在 0.9.0 版本后新增了 Gradients Sharing 的机制)。需要注意的是,Deeplearning4j 并没有创建自己的分布式通信框架,对于 CPU/GPU 集群的分布式建模仍然需要依赖 Apache Spark。在早期的版本中,Deeplearning4j 同样支持基于 MapReduce 的 Hadoop,但由于其在模型训练期间 Shuffle 等因素导致的迭代效率低下,加上 Spark 基于内存的数据存储模型的高效性,使得其在最近版本中已经停止了对 Hadoop 的支持。

    此外,Apache 基金会下另一个分布式计算的顶级项目 Flink 正在积极考虑将 Deeplearning4j 进行集成,详见这里

    enter image description here

    Deeplearning4j 生态圈中除了深度神经网络这个核心框架以外,还包括像 DataVec、ND4J、RL4J 等一些非常实用的子项目,下面就对这些子项目的主要功能模块做下介绍。

    1. ND4J & LibND4J

    这两个子项目是 Deeplearning4j 所依赖的张量运算框架。其中,ND4J 提供上层张量运算的各种接口,而 LibND4J 用于适配底层基于 C++/Fortran 的张量运算库,如 OpenBLAS、MKL 等。

    2. DataVec

    这是数据预处理的框架,该框架提供对一些典型非结构化数据(语音、图像、文本)的读取和预处理(归一化、正则化等特征工程常用的处理方法)。此外,对于一些常用的数据格式,如 JSON/XML/MAT(MATLAB 数据格式)/LIBSVM 也都提供了直接或间接的支持。

    3. RL4J

    这是基于 Java/JVM 的深度强化学习框架,它提供了对大部分基于 Value-Based 强化学习算法的支持,具体有:Deep Q-leaning/Dual DQN、A3C、Async NStepQLearning。

    4. dl4j-examples

    这是 Deeplearning4j 核心功能的一些常见使用案例,包括经典神经网络结构的一些单机版本的应用,与 Apache Spark 结合的分布式建模的例子,基于 GPU 的模型训练的案例以及自定义损失函数、激活函数等方便开发者需求的例子。

    5. dl4j-model-z

    顾名思义这个框架实现了一些常用的网络结构,例如:

    • ImageNet 比赛中获奖的一些网络结构 AlexNet/GoogLeNet/VGG/ResNet;
    • 人脸识别的一些网络结构 FaceNet/DeepFace;
    • 目标检测的网络结构 Tiny YOLO/YOLO9000。

    在最近 Release 的一些版本中,dl4j-model-z 已经不再作为单独的项目,而是被纳入 Deeplearning4j 核心框架中,成为其中一个模块。

    6. ScalNet

    这是 Deeplearning4j 的 Scala 版本,主要是对神经网络框架部分基于 Scala 语言的封装。

    对这些生态圈中子项目的使用案例,我会在后续的文章中详细地介绍,在这里就不赘述了。

    为什么要学习 Deeplearning4j

    在引言中我们谈到,目前开源的深度学习框架有很多,那么选择一个适合工程师自己、同时也可以达到团队业务要求的框架就非常重要了。在这个部分中,我们将从计算速度、接口设计与学习成本,和其他开源库的兼容性等几个方面,给出 Deeplearning4j 这个开源框架的特点及使用场景。

    ND4J 加速张量运算

    JVM 的执行速度一直为人所诟病。虽然 Hotspot 机制可以将一些对运行效率有影响的代码编译成 Native Code,从而在一定程度上加速 Java 程序的执行速度,但毕竟无法优化所有的逻辑。另外,Garbage Collector(GC)在帮助程序员管理内存的同时,其实也束缚了程序员的手脚,毕竟是否需要垃圾回收并不是程序员说了算;而在其他语言如 C/C++ 中,我们可以 free 掉内存块。

    对于机器学习/深度学习来说,优化迭代的过程往往非常耗时,也非常耗资源,因此尽可能地加速迭代过程十分重要。运算速度也往往成为评价一个开源库质量高低的指标之一。鉴于 JVM 自身的局限性,Deeplearning4j 的张量运算通过 ND4J 在堆外内存(Off-Heap Memory/Direct Memory)上进行, 详见这里。大量的张量运算可以依赖底层的 BLAS 库(如 OpenBLAS、Intel MKL),如果用 GPU 的话,则会依赖 CUDA/cuBLAS。由于这些 BLAS 库多数由 Fortran 或 C/C++ 写成,且经过了细致地优化,因此可以大大提高张量运算的速度。对于这些张量对象,在堆上内存(On-Heap Memory)仅存储一个指针/引用对象,这样的处理也大大减少了堆上内存的使用。

    High-Level 的接口设计

    对于大多数开发者而言,开源库的学习成本是一个不可回避的问题。如果一个开源库可以拥有友好的接口、详细的文档和案例,那么无疑是容易受人青睐的。这一点对于初学者或者致力于转型 AI 的工程师尤为重要。

    神经网络不同于其他传统模型,其结构与复杂度变化很多。虽然在大多数场景下,我们会参考经典的网络结构,如 GoogLeNet、ResNet 等。但自定义的部分也会很多,往往和业务场景结合得更紧密。为了使工程师可以快速建模,专注于业务本身和调优,Deeplearning4j 对常见的神经网络结构做了高度封装。以下是声明卷积层 + 池化层的代码示例,以及和 Keras 的对比。

    Keras 版本

    model = Sequential()model.add(Convolution2D(nb_filters, (kernel_size[0], kernel_size[1]))) #卷积层  model.add(Activation('relu')) #非线性变换  model.add(MaxPooling2D(pool_size=pool_size)) #池化层  

    Deeplearning4j 版本

    MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()//....layer(0, new ConvolutionLayer.Builder(5, 5)    //卷积层                        .nIn(nChannels)                        .stride(1, 1)                        .nOut(20)                        .activation(Activation.RELU)    //非线性激活函数                        .build()).layer(1, new SubsamplingLayer.Builder(PoolingType.MAX)    //最大池化                        .kernelSize(2,2)                        .stride(2,2)                        .build())

    可以看到,Deeplearning4j 和 Keras 很相似,都是以 Layer 为基本模块进行建模,这样的方式相对基于 OP 的建模方式更加简洁和清晰。所有的模块都做成可插拔的,非常灵活。以 Layer 为单位进行建模,使得模型的整个结构高度层次化,对于刚接触深度神经网络的开发人员,可以说是一目了然。除了卷积、池化等基本操作,激活函数、参数初始化分布、学习率、正则化项、Dropout 等 trick,都可以在配置 Layer 的时候进行声明并按需要组合。

    当然基于 Layer 进行建模也有一些缺点,比如当用户需要自定义 Layer、激活函数等场景时,就需要自己继承相关的基类并实现相应的方法。不过这些在官网的例子中已经有一些参考的 Demo,如果确实需要,开发人员可以参考相关的例子进行设计,详见这里

    此外,将程序移植到 GPU 或并行计算上的操作也非常简单。如果用户需要在 GPU 上加速建模的过程,只需要加入以下逻辑声明 CUDA 的环境实例即可。

    CUDA 实例声明

    CudaEnvironment.getInstance().getConfiguration()            .allowMultiGPU(true)            .setMaximumDeviceCache(10L * 1024L * 1024L * 1024L)            .allowCrossDeviceAccess(true);

    ND4J 的后台检测程序会自动检测声明的运算后台,如果没有声明 CUDA 的环境实例,则会默认选择 CPU 进行计算。

    如果用户需要在 CPU/GPU 上进行并行计算,则只需要声明参数服务器的实例,配置一些必要参数即可。整体的和单机版的代码基本相同。

    参数服务器声明

    ParallelWrapper wrapper = new ParallelWrapper.Builder(model)            .prefetchBuffer(24)            .workers(8)            .averagingFrequency(3)            .reportScoreAfterAveraging(true)            .useLegacyAveraging(true)            .build();

    参数服务器的相关参数配置在后续的课程中会有介绍,这里就不再详细说明了。

    友好的可视化页面

    为了方便研发人员直观地了解神经网络的结构以及训练过程中参数的变化,Deeplearning4j 提供了可视化页面来辅助开发。需要注意的是,如果需要使用 Deeplearning4j 的可视化功能,需要 JDK 1.8 以上的支持,同时要添加相应的依赖:

    <dependency>    <groupId>org.deeplearning4j</groupId>    <artifactId>deeplearning4j-ui_${scala.binary.version}</artifactId>    <version>${dl4j.version}</version></dependency>

    并且在代码中添加以下逻辑:

    //添加可视化页面监听器UIServer uiServer = UIServer.getInstance();StatsStorage statsStorage = new InMemoryStatsStorage();uiServer.attach(statsStorage);model.setListeners(new StatsListener(statsStorage));

    训练开始后,在浏览器中访问本地 9000 端口,默认会跳转到 Overview 的概览页面。我们可以依次选择查看网络结构的页面(Model 页面)和系统页面(System),从而查看当前训练的模型以及系统资源的使用情况。详情见下图:

    enter image description here

    enter image description here

    enter image description here

    Overview 页面主要会记录模型在迭代过程中 Loss 收敛的情况,以及记录参数和梯度的变化情况。根据这些信息,我们可以判断模型是否在正常地学习。从 Model 页面,我们则可以直观地看到目前网络的结构,比如像图中有 2 个卷积层 + 2 个池化层 + 1 个全连接层。而在 System 页面中我们可以看到内存的使用情况,包括堆上内存和堆外内存。

    Deeplearning4j 提供的训练可视化页面除了可以直观地看到当前模型的训练状态,也可以基于这些信息进行模型的调优,具体的方法在后续课程中我们会单独进行说明。

    兼容其他开源框架

    正如在引言中提到的,现在深度神经网络的开源库非常多,每个框架都有自己相对擅长的结构,而且对于开发人员,熟悉的框架也不一定都相同。因此如果能做到兼容其他框架,那么无疑会提供更多的解决方案。

    Deeplearning4j 支持导入 Keras 的模型(在目前的 1.0.0-alpha 版本中,同时支持 Keras 1.x/2.x)以及 TensorFlow 的模型。由于 Keras 自身可以选择 TensorFlow、Theano、CNTK 作为计算后台,再加上第三方库支持导入 Caffe 的模型到 Keras,因此 Keras 已经可以作为一个“胶水”框架,成为 Deeplearning4j 兼容其他框架的一个接口。

    enter image description here

    兼容其他框架(准确来说是支持导入其他框架的模型)的好处有很多,比如说:

    • 扩展 Model Zoo 中支持的模型结构,跟踪最新的成果;
    • 离线训练和在线预测的开发工作可以独立于框架进行,减少团队间工作的耦合。

    Java 生态圈助力应用的落地

    Deeplearning4j 是跑在 JVM 上的深度学习框架,源码主要是由 Java 写成,这样设计的直接好处是,可以借助庞大的 Java 生态圈,加快各种应用的开发和落地。Java 生态圈无论是在 Web 应用开发,还是大数据存储和计算都有着企业级应用的开源项目,例如我们熟知的 SSH 框架、Hadoop 生态圈等。

    Deeplearning4j 可以和这些项目进行有机结合,无论是在分布式框架上(Apache Spark/Flink)进行深度学习的建模,还是基于 SSH 框架的模型上线以及在线预测,都可以非常方便地将应用落地。下面这两张图就是 Deeplearning4j + Tomcat + JSP 做的一个简单的在线图片分类的应用。

    enter image description hereenter image description here

    总结来说,至少有以下 4 种场景可以考虑使用 Deeplearning4j:

    • 如果你身边的系统多数基于 JVM,那么 Deeplearning4j 是你的一个选择;
    • 如果你需要在 Spark 上进行分布式深度神经网络的训练,那么 Deeplearning4j 可以帮你做到;
    • 如果你需要在多 GPU/GPU 集群上加快建模速度,那么 Deeplearning4j 也同样可以支持;
    • 如果你需要在 Android 移动端加入 AI 技术,那么 Deeplearning4j 可能是你最方便的选择之一。

    以上四点,不仅仅是 Deeplearning4j 自身的特性,也是一些 AI 工程师选择它的理由。

    虽然 Deeplearning4j 并不是 GitHub 上 Fork 或者 Star 最多的深度学习框架,但这并不妨碍其成为 AI 工程师的一种选择。就 Skymind 官方发布的信息看,在美国有像 IBM、埃森哲、NASA 喷气推进实验室等多家明星企业和实验机构,在使用 Deeplearning4j 或者其生态圈中的项目,如 ND4J。算法团队结合自身的实际情况选择合适的框架,在多数时候可以做到事半功倍。

    Deeplearning4j 的最新进展

    在这里,我们主要介绍下 Deeplearning4j 最新的一些进展情况。

    版本

    目前 Deeplearning4j 已经来到了 1.0.0-beta3 的阶段,马上也要发布正式的 1.0.0 版本。本课程我们主要围绕 0.8.0 和 1.0.0-alpha 展开(1.0.0-beta3 核心功能部分升级不大),这里罗列下从 0.7.0 版本到 1.0.0-alpha 版本主要新增的几个功能点:

    • Spark 2.x 的支持(>0.8.0)
    • 支持迁移学习(>0.8.0)
    • 内存优化策略 Workspace 的引入(>0.9.0)
    • 增加基于梯度共享(Gradients Sharing)策略的并行化训练方式(>0.9.0)
    • LSTM 结构增加 cuDNN 的支持(>0.9.0)
    • 自动微分机制的支持,并支持导入 TensorFlow 模型(>1.0.0-alpha)
    • YOLO9000 模型的支持(>1.0.0-aplpha)
    • CUDA 9.0 的支持(>1.0.0-aplpha)
    • Keras 2.x 模型导入的支持(>1.0.0-alpha)
    • 增加卷积、池化等操作的 3D 版本(>1.0.0-beta)

    除此之外,在已经提及的 Issue 上,已经考虑在 1.0.0 正式版本中增加对 YOLOv3、GAN、MobileNet、ShiftNet 等成果的支持,进一步丰富 Model Zoo 的直接支持范围,满足更多开发者的需求。详见 GANMobileNetYOLOv3ShiftNet

    进一步的进展情况,可以直接跟进每次的 releasenotes,查看官方公布的新特性和已经修复的 Bug 情况。

    社区

    Deeplearning4j 社区目前正在进一步建设和完善中,在社区官网上除了介绍 Deeplearning4j 的基本信息以外,还提供了大量有关神经网络理论的资料,方便相关研发人员的入门与进阶。Deeplearning4j 社区在 Gitter 上同时开通了英文/中文/日文/韩文频道,开发人员可以和核心源码提交者进行快速的交流以及获取最新的信息。

    enter image description here

    • Deeplearning4j 的 GitHub 地址,详见这里
    • Deeplearning4j 社区官网,详见这里
    • Deeplearning4j 英文 Gitter Channel,详见这里
    • Deeplearning4j 中文 Gitter Channel,详见这里
    • Deeplearning4j 官方 QQ 群,289058486

    关于本课程

    最后我们简单介绍一下本课程涉及的内容以及一些学习建议。

    本课程主要面向深度学习/深度神经网络的企业研发人员、高校以及研究机构的研究人员。同时,对于致力于转型 AI 开发的 Java 工程师也会有很大的帮助。对于那些希望构建基于 JVM 上的 AI 项目的研发人员也有着一定的参考价值。

    本课程会围绕 Deeplearning4j 框架,并结合深度学习在图像、语音、自然语言处理等领域的一些经典案例(如图像的分类、压缩、主体检测,文本分类、序列标注等),给出基于 Deeplearning4j 的解决方案。此外,对于具体的实例,我们将分别介绍建模的步骤及模型的部署上线这一全栈开发的流程。我们会结合 Deeplearning4j 的一些特性,分别介绍在单机、多 CPU/GPU、CPU/GPU 集群上进行建模的步骤,以及如何与 Java Web 项目进行整合实现 AI 应用的落地。

    本课程力求做到对 Deeplearning4j 及其生态圈进行详细的介绍,包括对 Deeplearning4j 现在已经支持的迁移学习(Transfer Learning)和强化学习(Reinforcement Learning)进行实例应用的介绍。同时希望通过本课程帮助真正有需要的研发人员落地 AI 项目或者提供一种可行的解决方案,尽量做到内容覆盖的全面性和语言的通俗易懂。

    此外,我们给出一些学习本课程的建议:在学习本课程前,希望学员有一定的 Java 工程基础,以及对机器学习/深度学习理论的了解。如果对优化理论、微分学、概率统计有一定的认识,那么对理解神经网络的基础理论(如 BP 算法)将大有裨益。

    最后,下面是本课程的大纲思维导图,方便大家参考学习。顺带跟大家说一声,购买课程的读者可以加入我们成立的 DL4J 课程微信交流群,我会抽出时间,不定期回复读者的疑问。预祝大家快速上手 DL4J 开发!

    enter image description here

    第05课:CNN 在机器视觉中的应用——图像分类

    从本节课开始,我们将陆续为大家介绍在工业界使用较多的几种神经网络结构。首先介绍的是卷积神经网络(Convolution Neural Network,CNN)。本节课核心内容包括:

    • 卷积神经网络发展历史回顾
    • 卷积与池化
    • 卷积神经网络的应用(图像分类)

    卷积一词来源于信号处理领域。以 1D 信号为例,$f(x)$ 和 $g(x)$ 分别代表两个信号源输出的信号,则 $f(x)$ 和 $g(x)$ 的卷积可以表示为:

    f71bab20-fe29-11e8-9206-ebae2af18c23

    卷积的数学含义可以认为是两个函数重叠部分的面积(其中一个函数需要做反褶操作)。现实生活中很多信号也可以认为是两个信号卷积的结果,例如:

    回声就可以认为是声源发出的信号与反射信号的卷积。

    在实际应用中,卷积/解卷积操作可用于信号的平滑、滤波等场景,而这次介绍的卷积神经网络也同样基于卷积操作。在介绍卷积神经网络的细节之前,我们先回顾下它的发展历史。

    5.1 卷积神经网络发展历史回顾

    现在卷积神经网络具有代表性的工作,可以追溯到 20 世纪 90 年代 Yann LeCun 提出的 LeNet-5。事实上,后期的 AlexNet、VGG 系列、GoogLeNet 等卷积网络结构,都或多或少地借鉴了 LeCun 的工作,只不过网络的整体结构变得更深更广,或者与其他神经网络结构(如 RNN)结合使用。

    LeNet-5 的结构示意图如下:

    enter image description here图片来源:Gradient-Based Learning Applied to Document Recognition (Proc. IEEE 1998),论文下载链接

    LeNet-5 受限于当时硬件的计算能力,对于小规模的机器视觉问题,如 MNIST 分类问题,可以达到很高的准确率,但对于更大型的问题则显得力不从心。这一局面直到 2012 年 Hinton 以及他的学生 Alex Krizhesky 凭借 AlexNet 夺得 ImageNet 比赛冠军后才被打破。自此,卷积神经网络甚至整个神经网络领域再度受到工业界和学术界的关注,深度神经网络以及深度学习的概念也逐渐被大家所知晓。

    AlexNet 其实是一种更为深刻的 LeNet。此外非线性变换函数、防止过拟合的 Dropout 等 trick 也都在后来深度学习的发展中扮演着重要的角色。此后,卷积神经网络沿着更深更广的趋势继续发展。下面是一个简单的发展历程图:

    enter image description here

    接着,我们介绍下在卷积神经网络中常见的卷积、池化操作的一些细节。

    5.2 卷积与池化

    在卷积神经网络中,卷积操作的目的是用于提取局部特征。参与卷积操作的信号是两个矩阵,其中一个是人为设置大小的(例如 3x3、5x5)通常被称作是卷积核或者滤波器的矩阵,另一个则是图像原始输入的像素矩阵,或上一轮卷积操作后输出的 Feature Map。我们结合 Standford 机器学习课程中关于卷积神经网络的一个动态 Demo 来直观了解下卷积的过程。下图的源地址:https://cs231n.github.io/assets/conv-demo/index.html

    enter image description here

    截图中左侧第一列的三个矩阵可以认为是图片的 R、G、B 三个通道。原始的像素矩阵其实是 5x5 的大小。由于使用的卷积核尺寸是 3x3,并且卷积核在像素矩阵上每次移动 2 个像素,因此需要在外围补充一些像素点,也就是灰色且像素值都是 0 的那些点。截图的例子中选取了两个卷积核,因此输出的 Feature Map(图中最右侧的绿色的矩阵)也是两个。每个卷积核其实是一个 3x3x3 的三维张量,每个 3x3 的切面则用于在原始三个通道的像素矩阵中提取一些特征。当然,每个切面内部的值是可以不同的。

    卷积核从像素矩阵最左上角的像素点开始进行自左向右、自上而下的滑动(例子中滑动过 2 个像素点)。在滑动的过程中,对应位置的矩阵中的值相乘(Hadmard 乘积)并线性叠加。

    需要注意的是,卷积核并不需要做像刚才介绍的一维信号那样的反褶操作(其实反褶操作可以通过初始化不同的矩阵元素的值来实现,效果是一样的)。

    卷积操作结束后,我们可以将输出的 Feature Map 通过非线性激活函数来获取非线性特征。我们将经过非线性处理后的结果称为 Activation Map。

    在获取 Activation Map 之后,我们可以选择添加一次池化或者说下采样的操作(注意:池化操作不是必须,连续卷积操作也是可以的)。池化操作有一些具体的选择,比如说最大池化、平均池化等。我们同样以 Standford 课程中的示例图为例,解释下最大池化的概念。下图的源地址:https://cs231n.github.io/convolutional-networks/

    enter image description here

    在池化操作中,我们同样需要类似卷积核或者说滤波器的介入。只不过滤波器在这里的作用并不是做 Hadmard 乘积,而是在过滤的像素区域内根据一定的规则(如最大数值、加权平均)输出,即为池化。从截图中我们可以看到,当我们的滤波器设置成 2x2,每次滑动 2 个像素点时,就可以把 Activation Map 中 4 个区域的最大值输出成为新的 Feature Map,即为最大池化。类似地,平均池化则是求取了均值。

    池化的好处有两个:

    1. 显著缩小了输出矩阵的大小,起到了降维的作用;
    2. 可以按照需要选择更有代表性的特征,比如最大池化,就可以认为是选择了一定区域内最有代表性的特征,起到了特征选择的作用。

    卷积 + 池化的结构成为卷积神经网络的一种常用的搭配,但并非在所有网络中都采用这样的结构,读者在这里需要参考相关论文和著述并结合自身的实际情况进行选择。

    下面我们分别介绍卷积神经网络在图像分类和目标检测任务中的应用。

    5.3 卷积神经网络的应用

    卷积神经网络目前广泛应用于语音、机器视觉及文本处理的算法任务中。这里我们选择机器视觉中常见的分类和目标检测任务,对如何基于 Deeplearning4j 构建 CNN 网络的应用进行详细分析。

    5.3.1 图像分类

    传统的图像分类往往分为特征提取和分类器构建两个阶段。特征提取常用的算法有 SIFT、SURF、HOG 等。分类器的选择集中在 SVM、基于 Boosting/Bagging 的集成学习算法。在深度学习大规模应用前,类似 SIFT 等设计精良的特征提取方式基本决定了应用的实际效果。但是不可否认的是,现实应用问题往往十分复杂,特征组合的应用非常常见,这不仅增加了工程师的工作量,最重要的是无论如何组合特征实际效果不一定有保证。

    卷积神经网络的兴起在一定程度上解决了传统算法的问题。在我们使用卷积神经网络做图像分类时,并不需要设计特征算法,特征的提取和分类已嵌入到了整个神经网络中。事实上这种 end-to-end 的做法对于工程师来讲只需要将图像的原始信号(也就是像素矩阵)输入到模型,输出就是分类结果,至于神经网络在训练过程中提取了什么特征做分类,其实并不完全可见或者可理解(卷积神经网络的可视化分析可以参考:https://cs231n.github.io/understanding-cnn/)。

    下面我们使用 Deeplearning4j 对 Fashion-MNIST 数据集进行分类建模。

    Fashion-MNIST 数据集(https://github.com/zalandoresearch/fashion-mnist)是类似 MNIST 手写体数字数据集的一组开源的服装数据集。它除了图片内容和 MNIST 不同外,其他诸如标签数量、图片尺寸、训练/测试图片数量,甚至二进制文件名称和 MNIST 均完全一致。以下是 Fashion-MNIST 的部分截图:

    enter image description here

    我们用类似 LeNet-5 的结构,即两组 Conv+MaxPooling 构建卷积神经网络模型。

    public static MultiLayerNetwork getModel(){        MultiLayerConfiguration.Builder builder = new NeuralNetConfiguration.Builder()                        .seed(12345)                        .iterations(1)                        .learningRate(0.01)                        .learningRateScoreBasedDecayRate(0.5)                        .weightInit(WeightInit.XAVIER)                        .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)                        .updater(Updater.ADAM)                        .list()                        .layer(0, new ConvolutionLayer.Builder(5, 5)                                .nIn(1)                                .stride(1, 1)                                .nOut(32)                                .activation(Activation.LEAKYRELU)                                .build())                        .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)                                .kernelSize(2,2)                                .stride(2,2)                                .build())                        .layer(2, new ConvolutionLayer.Builder(5, 5)                                .stride(1, 1)                                .nOut(64)                                .activation(Activation.LEAKYRELU)                                .build())                        .layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)                                .kernelSize(2,2)                                .stride(2,2)                                .build())                        .layer(4, new DenseLayer.Builder().activation(Activation.LEAKYRELU)                                .nOut(500).build())                        .layer(5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)                                .nOut(10)                                .activation(Activation.SOFTMAX)                                .build())                        .backprop(true).pretrain(false)                        .setInputType(InputType.convolutionalFlat(28, 28, 1));        MultiLayerConfiguration conf = builder.build();        MultiLayerNetwork model = new MultiLayerNetwork(conf);        return model; }

    我们结合上述逻辑解释下,在 Deeplearning4j 中卷积神经网络的建模过程。

    首先我们需要声明一个 MultiLayerConfiguration,即多层网络的配置对象。

    注意:Deeplearning4j 同时支持 MultiLayerConfiguration 和 ComputationGraphConfiguration,对于无法清晰划分为多层结构的神经网络,可以考虑使用 ComputationGraphConfiguration。

    网络的第一层,是一个卷积层:

    .layer(0, new ConvolutionLayer.Builder(5, 5)    //卷积核大小         .nIn(1)        //输入原始图片的通道数         .stride(1, 1)    //步长大小         .nOut(32)        //输出 Feature Map 的数量         .activation(Activation.LEAKYRELU)    //非线性激活函数         .build())
    • 由于 Fashion-MNIST 数据集是灰度图,因此通道数为 1。如果是 RGB 彩色图片,则通道数等于 3。
    • 卷积核的大小可以通过构造参数传入,也可以用 .kernelSize 来定义。
    • 输出的 Feature Map 的数量这里等于 32,这个数量用户可以自定义。

    网络的第二层,是一个最大池化层:

    .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)         .kernelSize(2,2)         .stride(2,2)         .build())
    • 构建器传入的参数用于定义池化的类型,池化的类型常用的有最大池化、平均池化、求和池化等。这些方式在 Deeplearning4j 都支持。
    • kernelSize(2,2) 是卷积核/滤波器的尺寸大小。
    • stride(2,2) 和上面卷积层的参数概念一样,是步长。步长越大,输出的 Feature Map 的尺寸也就越小了。

    网络的第五层,是一个全连阶层:

    .layer(4, new DenseLayer.Builder().activation(Activation.LEAKYRELU)         .nOut(500).build())

    全连接这里的作用是将特征展开成一个 1x500 的向量。注意,输入的维度用户不一定要指定,Deeplearning4j 会根据前几层的网络输出自动计算。

    网络的第六层,是一个输出层:

    .layer(5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)                   .nOut(10)                   .activation(Activation.SOFTMAX)                   .build())

    这一层主要用于定义输出标签的数量、损失函数等信息。由于输出有 10 个分类,我们用 Softmax 作为激活函数,损失函数使用交差熵。到此,一个卷积神经网络就基本定义好了。

    接下来,我们需要将数据喂到模型中进行训练。由于 Fashion-MNIST 数据集和手写体 MNIST 数据集在图片属性层面是完全一致的,因此我们可以直接用 Deeplearning4j 内置的工具类 MnistDataSetIterator 进行直接读取。

    注意:如果使用该工具类读取 Fashion-MNIST 数据集,需要将 Fashion-MNIST 的二进制数据文件拷贝到当前用户根目录下的 MNIST 目录中,二进制数据文件可以从 GitHub 上下载。

    DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, 12345);DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, 12345);

    最后,我们需要编写训练模型的逻辑。这段逻辑和之前文章中提到训练逻辑是一致的。并在训练结束后,在验证集上进行准确率验证以及模型的保存。

    for( int i = 0; i < numEpochs; ++i ){    model.fit(mnistTrain);}Evaluation eval = model.evaluate(mnistTest);System.out.println(eval.stats());ModelSerializer.writeModel(model, modelSavePath, true);

    我们共训练了 100 轮次,最终在验证集上的准确率仅在 90% 左右。

    enter image description here

    此外,我们顺便给出 Fashion-MNIST 和 MNIST 数据集训练的比较结果。

    enter image description here

    从这张截图中,我们可以直观地看出,在使用同样网络的情况下,MNIST 数据集在第一轮训练结束后,就可以在验证集上达到 95% 左右的准确率。而反观 Fashion-MNIST 数据集,第一轮训练结束后仅仅达到 80% 左右的准确率,并且在最终的 100 轮训练完后,也只有 90% 的准确性。这说明 Fashion-MNIST 数据集的分类问题相较于 MNIST 而言更为复杂。

    对于 Fashion-MNIST 数据集分类的探索,在它的 GitHub 主页上,有基于 CapsuleNet/Inception ResNet 等复杂网络结构下的分类结果,有兴趣的同学可以关注。

    5.4 小结

    本次课程主要介绍了卷积神经网络的原理,以及其在图像分类中的应用。我们首先回顾了卷积神经网络的历史,然后介绍了卷积神经网络中比较重要的两个概念,卷积 + 池化,随后我们基于 Deeplearning4j 的框架介绍如何构建分类模型。在下一课我们将继续围绕卷积神经网络,介绍基于 YOLO 的图像目标检测应用。

    相关资料:

    第01课:开发环境搭建
    第02课:开发基本流程
    第03课:多层感知机在结构化数据中的应用
    第04课:自编码器在数据压缩中的应用
    第06课:CNN 在机器视觉中的应用——目标检测
    第07课:RNN 在序列问题中的应用——文本分类
    第08课:RNN 在序列问题中的应用——文本生成
    第09课:RNN 在序列问题中的应用——序列标注
    第10课:RNN 在序列问题中的应用——机器翻译
    第11课:词句分布式表达——词建模工具
    第12课:词句分布式表达——句建模工具
    第13课:Spark 分布式模型训练及调优(原理)
    第14课:Spark 分布式模型训练及调优(实战)
    第15课:多 GPU 环境下的模型训练
    第16课:迁移学习的模型训练
    第17课:强化学习的模型训练
    第18课:搭建在线服务环境
    第19课:DL4J 对其他深度学习框架的支持
    第20课:DL4J 建模进阶
    结语:深度学习的进化

    阅读全文: http://gitbook.cn/gitchat/column/5bfb6741ae0e5f436e35cd9f

    展开全文
  • 配置deeplearning4j环境

    2020-05-12 15:08:19
    Deeplearning4j是为Java和Java虚拟机编写的开源深度学习库,是广泛支持各种深度学习算法的运算框架。Deeplearning4j可以实施的技术包括受限玻尔兹曼机、深度置信网络、深度自动编码器、堆叠式降噪自动编码器、循环...
  • 最近这几年,深度学习很火,包括自己在内的很多对机器学习还是一知半解的小白也开始用深度学习做些应用。... Learning开源库有多,如果以语言来划分的话,就有Python系列的tensowflow,theano
  • 在前两天的博客中,我们用Deeplearning4j做了Mnist数据集的分类。算是第一个深度学习的应用。像Mnist数据集这样图片尺寸不大,而且是黑白的开源图片集在本地完成训练是可以的,毕竟我们用了Lenet这样相对简单的网络...
  • 最近这几年,深度学习很火,包括自己在内的很多对机器学习还是一知半解的小白也开始用深度学习做些应用。由于小白的等级不高,... Learning开源库有多,如果以语言来划分的话,就有Python系列的tensowflow,thea
  • 在前两天的博客中,我们用Deeplearning4j做了Mnist数据集的分类。算是第一个深度学习的应用。像Mnist数据集这样图片尺寸不大,而且是黑白的开源图片集在本地完成训练是可以的,毕竟我们用了Lenet这样相对简单的网络...
  • <div><p>Downloaded deeplearning4j-master.zip from git on 2017-08-27 unzipped to directory ~/dl4j/dl4j-examples/deeplearning4j-master mvn clean install fails with Mojo Execution Exception This appears ...
  • deeplearning4j

    2018-03-28 20:16:56
    经典数据挖掘开源系统, 国外创业公司Skymind的产品, 目前最新的版本更新到了0.7.2。
  • Deeplearning4j(简称DL4J)是为Java和Scala编写的首个商业级开源分布式深度学习库。DL4J与Hadoop和Spark集成,为商业环境(而非研究工具目的)所设计。Skymind是DL4J的商业支持机构。Deeplearning4j技术先进,以即...
  • at org.deeplearning4j.nn.conf.MultiLayerConfiguration$Builder.build(MultiLayerConfiguration.java:609) at org.deeplearning4j.nn.conf.NeuralNetConfiguration$ListBuilder.build(NeuralNetConfiguration....
  • 这本应是一个基于Python的列表,但我想我会把Deeplearning4j包括在这里,主要是出于对他们所做事迹的无比崇敬——Deeplearning4j为JVM建立了一个开源的、分布式的深度学习库。 如果您在企业工作,你可能会有一个塞满...
  • Deeplearning4j库学习

    千次阅读 2016-11-28 09:15:47
    一、基础知识(了解)  背景知识:  如官网描述,dl4j-examples含有丰富的深度学习神经网络应用案例,这是一个为Java和Scala编写的首个商业级... Deeplearning4j的使用非常方便,它设计的目标是“即插即用”,通
  • <div><p>该提问来源于开源项目:deeplearning4j/nd4j</p></div>
  • When I import <code>import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;</code> it should import successfully and I should be able to write a line of code like this <code>DataSet...
  • DL4J+Scala的神经网络实现一、... Deeplearning4j开源的,使用C ++,Java,Scala和Python编写,并由Eclipse Foundation和社区贡献者维护。 通过本次内容的学习,我们将会掌握使用DL4J: 1、加载神经网络的数据集。 2
  • 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试 欢迎来到专栏《2小时玩转开源框架系列》,这是我们第九篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer。 今天...
  • deeplearning4j是一个Apache2.0-licensed,开源的,分布式神经网络库编写的java和Scala。主要模块:进入dl4j-examples目录 maven编译项目有可能需要执行多次 如果需要编译所有的项目。我在百度云上传了一份代码及文件...
  • DeepLearning4J入门——让计算机阅读《天龙八部》

    万次阅读 热门讨论 2016-07-20 17:52:59
    很早在实验室就看见钱宝宝用Google的Word2Vector来阅读《天龙八部》并找出与指定词最相关的几个词,最近正好学习新出的深度学习开源项目DeepLearning4J,于是就拿这个例子来练手吧。DL4J快速入门请看 ...
  • m trying to load <code>en.model</code> with <code>deeplearning4j</code>'s Word2Vec implementation. <p>The following code is used: <pre><code>java return WordVectorSerializer.readWord2VecModel(new ...
  • Deeplearning4j的本机CPU优化

    千次阅读 2017-12-19 13:34:07
    Deeplearning4j的本机CPU优化本页指南将介绍在DL4J和ND4J上调试或提升CPU系统性能的几种方法。让我们先来定义一些术语:OpenMPOpenMP是一个开源的并行编程API,支持C/C++/Fortran语言。ND4j使用以C++编写的后端,...
  • Windows下DL4J环境搭建教程一、DL4J简介二、Windows下DL4J环境搭建三、安装JDK1.1、...Deeplearning4J(简称DL4J)不是第一个开源的深度学习项目,但与此前的其他项目相比,DL4J在编程语言和宗旨两方面都独具特色。DL
  • DL4J环境搭建教程-Mac版 这里写目录标题DL4J环境搭建教程-Mac版一、DL4J简介二、Mac下搭建DL4J环境三、安装JDK1.1、JDK简介1.2、JDK下载...Deeplearning4J(简称DL4J)不是第一个开源的深度学习项目,但与此前的其他项

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 894
精华内容 357
关键字:

deeplearning4j开源