您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

时间:2019-08-06 09:35:57  来源:  作者:

一提到深度学习,神经网络等技术,大部分肯定会想到TensorFlow,Keras,Caffe,PyTorch等框架,而这些框架大部分都是使用Python来进行开发的,毫无疑问,在人工智能领域技术上比如神经网络等Python是一种很不错的选择,但是作为一个JAVA程序员,如果想要使用java语言来玩玩神经网络的话,有没有更好的选择呢,其实java在这一方面确实没有Python做的好,不过要使用java来做神经网络的话还是有很多选择的,比如DeepLearning4J, Encog, JOONE等等,这篇文章我们来介绍一款java神经网络学习框架Encog。

Encog是一款Java和.Net上的机器学习框架,好像也有JavaScript版的,但我没找到,它除了支持神经网络之外,也支持大部分通用的机器学习技术。Encog的第一个版本为0.5, 正式发布于2008年7月10号,之后的Encog1.0到2.0极大地扩展了神经网络,到了3.0后增加了更多的机器学习方法。Encog他也不仅仅包括了机器学习,它内部还包括了一款爬虫工具,可以很方便地为神经网络获取数据(不过这款工具我感觉不好用,还没有Jsoup好使呢)。

使用Encog构建一个神经网络也特别简单,在Encog中,创建神经网络主要使用BasicNetwork和BasicLayer这两个类,当然也会用到其他的类比如激活函数。

使用maven导入相关的包

这里我们使用maven导入encog的相关包,只需要导入encog-core这个包就可以了。

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

Encog神经网络的介绍

神经网络通常是分层的,至少有一个输入和输出层,也许还有隐藏层,某些神经网络类型不会在输入和输出层之外分解成任何形式层,然而,这个输入层和输出层将永远存在,也许可能被整合在同一层,我们现在先介绍一下输入层,输出层和隐藏层。

输入层: 输入层是神经网络的第一层,和其他层一样,这一层包括了一个指定数字的神经元,同一层的神经元都含有相似的属性,一般情况下,对于分类,回归或者聚类的神经网络的每个属性,输入层都会有一个神经元与之一一对应。

神经元的数量决定了神经网络层的结构,对于每个输入神经元,在Encog中为一个double值,例如,以下的数组能够输入到一个包含五个神经元层的结构中

double[] input = new double[5];

Encog中使用double类型数据,使用MLData接口管理这些double数组,上面的double数据要想被神经网络使用,得先将其转换为MLData,代码如下:

MLData data = new BasicMLData(input);

MLData是可以直接提供给Encog的数据,BasicMLData类是其中一个实现了MLData接口的类。其他实现了MLData接口的类也可以作为Encog神经网络处理的数据。

输出层: 输出层是神经网络的最后一层,这层给出了神经网络最终的输出结果。同样,输出结果也是一个实现了MLData接口的类,大多数神经网络返回的输出类是一个BasicMLData,从MLData中我们也可以得到一个doube数组。

隐藏层:在前面的讨论中,神经网络包含了输入层和输出时,有时候,输出层和输入层是相同的,但是大多数通常是两个单独的层,此外,在输入层和输出层之间也许存在其他的层,这层被称为隐藏层,隐藏层在输入层和输出层之间。隐藏层也可以承担更多复杂的结构。

隐藏层唯一的目标是让神经网络更好的为给定的输入产生预期的输出,神经网络编程首先涉及到的是定义输入层和输出层神经元个数,然后在定义隐藏层。

隐藏层是一个非常大的“黑盒子”,怎样创建一个隐藏层结构,要达到不要太简单,也不要太复杂,太简单的隐藏层结构将学习不精,太复杂的隐藏层结构也要花太多数据和时间去训练,通常是一个单一的隐藏层神经元数目等于输入层的两倍(这个不一定对,但可以先试试),在根据神经网络的性能,在适当增加或者减少隐藏层神经元的数量。

为XOR运算构造一个神经网络

一般我们在编程的时候第一个入门的例子就是打印一句hello world, 相应地,学习XOR运算是我们学习Encog的第一个例子,相当于神经网络编程的hello world。

XOR的运算规则为:0 XOR 0 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 1 XOR 1 = 0。

我们希望给神经网络输入0, 0得到0, 输入1,0得到1,输入0,1得到1,输入1,1得到0。

该神经网络是最原始的神经网络,被称为感知器,是一种前馈神经网络,也是我们将要学习的第一个神经网络。XOR运算符有两个输入和一个输出,此外,我们还需要一个隐藏层,该隐藏层具有两个神经元,两个神经元的选择是任意的,你也可以尝试三个或者一个。XOR问题很简单,两个隐藏层神经元足以解决它,该网络的结构如下:

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

上图中:输入神经元为I1, I2。 输出神经元为O1。隐藏神经元为H1, H2。偏执神经元为B1, B2

使用代码实现XOR运算

构造神经网络:使用Encog构建一个神经网络特别简单,首先需要new 一个BasicNetwork对象,然后往这个对象里面添加层就可以了。BasicLayer构造函数第一个参数指定激活函数,第二个参数指定是由有偏置神经元,第三个参数指定神经元个数,如果只传一个数字,则表示只指定神经元个数,而默认激活函数为ActivationSigmoid, 有偏置神经元。

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

因为偏执神经元影响的是下一层,以及激活函数影响的是前一层的数据。所以一般第一层(输入层)不需要激活函数,最后一层(输出层)不需要偏置神经元。调用finalizeStructure表示已经构建完成,不需要在往里面添加层了,reset是随机初始化各层之间的连接权重。

处理数据:

  1. 准备好输入数据和我们期望输出的数据
  2. 构造一个MLDataSet对象训练集,我们将我们的训练数据传给它。
谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

使用弹性传播(RPROP)训练:我们在这个使用弹性传播训练(RPROP)来训练我们的网络, RPROP是Encog所支持的最好的训练算法,当然,Encog还提供了其他训练技术,并且在一定的训练技术下能较好地解决某些问题。使用RPROP训练的代码如下:

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

上面的代码通过多次的迭代,当迭代到使神经网络的错误率低于1%的时候,神经网络训练就结束了。到了这里,我们可以运行我们的代码看看训练的结果:

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 


谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

可以看到,在第一次迭代的时候错误率很大,然后随着迭代次数的增加,当迭代到一百次左右的时候,错误率已经降低到0.01了。注意这里每次的运行结果都不一样,但是只要是错误率在降低说明我们的神经网络构建成功了。

使用该神经网络计算XOR:接下来就是测试一下我们的神经网络能不能得到正确的XOR运算。

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

输出的结果如下:

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 

可以看到,我们的神经网络最终的结果还是相当不错的。

完整的代码:

谁说JAVA不适合做神经网络,那来看看Encog这款框架吧

 



Tags:JAVA 神经网络   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一提到深度学习,神经网络等技术,大部分肯定会想到TensorFlow,Keras,Caffe,PyTorch等框架,而这些框架大部分都是使用Python来进行开发的,毫无疑问,在人工智能领域技术上比如神经网络...【详细内容】
2019-08-06  Tags: JAVA 神经网络  点击:(784)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条