分享

从程序员的角度设计一个Java的神经网络

 昵称11935121 2018-02-07

来自维基百科:

人工神经网络(ANN)或连接系统是受生物神经网络启发构成生物大脑的计算系统。这样的系统通过考虑例子来学习(逐步提高性能)来完成任务,通常没有任务特定的编程。

用Java或任何其他编程语言设计神经网络我们需要理解人工神经网络的结构和功能

人工神经网络执行的任务比如有模式识别、从数据中学习以及像专家一样预测趋势,而不像传统的算法方法那样需要执行一组步骤来实现所定义的目标。人工神经网络由于其高度交互的网络结构,可以学习如何自己解决一些任务。

人造神经元具有与人脑神经元相似的结构。一个天然的神经元是由核,树突和轴突组成的。轴突延伸到几个分支形成突触与其他神经元的树突。

到目前为止,我们已经区分了神经元的结构和相连神经元的网络。另一个重要方面是分别与单个神经元相关的神经网络的处理或计算。自然神经元是信号处理器 - 它们在树突中接收可以触发轴突信号的微信号。有一个潜在的阈值,到达的时候,刺激轴突,并传播信号到其他神经元。因此,我们可以将人造神经元视为一个在输入中具有信号接收器、在输出中具有激活单元的东西,其可以发送的信号将被转发到与图中所示类似的其他神经元上:

从程序员的角度设计一个Java的神经网络

此外,神经元之间的连接具有相应可以修改信号的权重,从而影响神经元的输出。由于权重是神经网络的内部因素并影响其输出,所以可以认为它们是神经网络的内部学科,调节描述神经元与其他神经元或外部世界的连接的权重将反映神经网络的能力。

正如Bioinfo Publications所述:

人造神经元接收一个或多个输入(代表树突)并将它们相加以产生输出/ 激活 (代表神经元的轴突)。一般来说每个节点的总和被加权,总和通过激活函数或传递函数传递。

这个组件为神经网络处理增加了非线性,这是因为自然神经元具有非线性行为。在一些特殊情况下,它可以是一个线性函数。

维基百科提及到说:

一个标准的计算机芯片电路可以看作是一个激活功能的数字网络,取决于输入的是“ON”(1)还是“OFF”(0)。这与神经网络中的线性感知器的行为类似。然而, 非线性 激活函数允许这样的网络仅使用少量的节点来计算特殊问题。使用的流行的激活函数的例子是Sigmoid、双曲正切、硬极限阈值和纯线性。

将这些知识转化为Java代码,我们将有一个如下的神经元类:

从程序员的角度设计一个Java的神经网络

从程序员的角度设计一个Java的神经网络

神经元有输入和输出连接、输入求和值和激活函数,那输入权重在哪里呢?它们包含在连接本身中,如下所示:

从程序员的角度设计一个Java的神经网络

从程序员的角度设计一个Java的神经网络

从程序员的角度设计一个Java的神经网络

连接对象提供权重并负责计算输入的权值。

求和函数被定义为接口,以便能够替换神经元的计算策略:

从程序员的角度设计一个Java的神经网络

分别实现为:

从程序员的角度设计一个Java的神经网络

激活函数的接口可以定义如下:

从程序员的角度设计一个Java的神经网络

开始编写代码之前需要注意的最后一个问题是神经网络层。神经网络由几个链接层组成,形成所谓的多层网络。

神经层可以分为三类:

  1. 输入层

  2. 隐藏层

  3. 输出层

在实践中,额外的神经层增加了另一个抽象层次的外部刺激,增强了神经网络认知更复杂知识的能力。

一个图层类可以被定义为一个有连接的神经元列表:

从程序员的角度设计一个Java的神经网络

最后,用Java创建一个简单的神经网络:

从程序员的角度设计一个Java的神经网络

从程序员的角度设计一个Java的神经网络

我们所得到的是一个基于Java的神经网络层次、神经元和连接的结构定义。我们也谈到了一些关于激活函数的内容,并为它们定义了一个接口。为简单起见,我们省略了各种激活函数的实现以及学习神经网络的基础知识。这两个主题将在本系列的后续文章中介绍。

翻译人:BAStriver,该成员来自云+社区翻译社

原文链接:https:///articles/designing-a-neural-network-in-java

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多