第零章 Encog入门介绍

Encog是一个使用JAVA和.Net开发的一款机器学习框架。最初,Encog在刚开始创建的时候仅仅只支持神经网络算法,但是在后来的版本扩展中添加了其他更多的通用机器学习算法。

然而,在本次教程中,主要将重点放在了神经网络方面,在本教程中学到的大多数技术都能够应用到其他的机器学习技术领域中,随后,本教程将重点学习Encog的相关编程技术。

本教程主要采用Encog3.0正式版,Encog绝大部分兼容了Encog3之前的版本,未来的版本之中将试图坚持不破坏现有的代码功能API。

一、Encog的历史

Encog的第一个版本是0.5,Encog的功能最初只是包括了一些用于编写第一个版本的<<介绍神经网络与Java>>之中的代码,于2005年发布。

第二个版本完全重新设计了神经网络引擎,Encog版本1.0到2.0极大地扩展了神经网络的代码。Encog3.0版本增加了其他更多的机器学习算法,它已经不仅仅只支持神经网络了。

本教程将详细介绍怎样使用Encog去构建神经网络的一个综合性介绍, 对于实际实现神经网络的复杂性,可以参考 <<神经网络算法与实现 - 基于Java语言>> 一书。本教程将学习到怎样创建实现基本的神经网络和探索神经网络的内部细节。

要使用Encog,首先你需要基本了解JAVA编程语言的基础,尤其,你应该熟悉以下:

  • JAVA泛型
  • 集合
  • 面向对象程序设计
    在我们开始要学习使用Encog之前。我们首先得先来确定神经网络擅长解决哪些问题。神经网络是一种计算模型,它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

二、介绍神经网络
本教程将学习到这样定义一个神经网络并且怎样去使用它。对于大多数人,即使非程序员来说,都听说过神经网络。有很多的科幻小说的弦外之音基本都能和神经网络扯上关联,和许多事物一样,科幻小说作家在其科幻作品中创作了大量的概念,比如神经网络,这对于现实中来说的话,还是有点偏差的。

大多数的外行人员认为神经网络是一种“人造大脑”,它是强大的机器人或者是能与人类进行智能对话的一种事物。这种想法其实更接近于人工智能(AI)而不是神经网络,AI寻求创造出真实的智能机器,这里不会去浪费几章去解释什么是真真的AI人工智能以及当前的计算机状态。简单来说当前的计算机还不是特别智能,在本教程编写时计算机还处于弱人工智能阶段。

人脑是一个生物神经网络(BNN), 而在这里的神经网络是一个人造神经网络。在生物神经网络和人造神经网络之间有一些基本的相似性,人造神经网络主要的数学结构的灵感来自生物神经网络,一个重要的术语“生物合理性”经常用来描述各种人造神经网络算法,这个术语定义了人造神经网络算法怎样接近于生物神经网络。

如前所述,可以知道神经网络设计来完成一个小的任务,一个完整的应用程序可能使用神经网络来完成目标的某些部分,整个应用程序不能作为一个神经网络实现,应用程序也许由几个神经网络组成,每个都为一个特定的任务而设计。

神经网络完成模式识别类的任务效果非常好。在模式识别任务中,先把模式的特诊输入数据传递给神经网络,然后神经网络经过一系列的操作,最后返回模式。这是大部分典型神经网络的工作方式,一些神经网络的构造也许会有所不同,但是绝大多数的神经网络基本都是以这种方式工作的,下图阐述了这样的一个神经网络:
在这里插入图片描述
如图所示,上面的这个神经网络接受一个模式和返回一个模式,神经网络完全同步执行,一个神经网络仅仅当提供了一个输入时才将输出,它不像人脑不同步执行,人脑虽然对输入能作出反应,但是它也会在任何适合的时候产生输出。

  1. 神经网络结构

神经网络是由相似的神经元组成,至少,大部分神经网络基本由输入层和输出层组成,输入模式指定到输入层,然后输出模式从输出层返回,在输入层和输出层之间发生的是一个黑盒子,在本教程中的这一点上,神经网络的内部结构可以不用考虑,有大量的结构定义了输入层和输出层之间的相互作用。

比如,输入和输出模式都是两个float型数组,以下是一个示例:
在这里插入图片描述
上面的神经网络是三个神经元的输入层和两个神经元的输出层,输入层和输出层的神经元数量不能改变,因此,对于一个特定的神经网络,它的输入层和输出层的元素个数永远不会改变。

在Encog中,使用神经网络来解决一个问题,其输入必须定义为一个float类型的数组,同样地,其输出也必须是一个float类型的数组,这是必要的。神经网络拿到一个数组,并且将其转换为第二个。神经网络不循环、调用子程序或者执行任何其他相关的传统程序任务。

一个神经网络很像传统编程里的哈希表,一个哈希表用于将key 映射到 value, 有点像一个字典,下面可以看做是一个哈希表的例子:
在这里插入图片描述
这是一个单词和每个单词的定义之间的映射, 就像一个哈希表在任何编程语言里一样,它使用一个字符串的key 到任意的一个字符串的value, 输入是字典里的一个key和输出是一个value, 这是大多数神经网络的功能,一个神经网络调用一个BidirectionalAssociative Memory (BAM)实际上允许用户通过value和接受key。

哈希表使用key和value, 想想模式发送到神经网络的输入层就像哈希表的Key, 同样地,模式从神经网络的输出层返回就像从哈希表返回value,这里只是拿哈希表和神经网络之间做一个简单的比较,然而,神经网络可要比哈希表强大得多。

如果一个单词不在哈希表中那上面的哈希表会发生什么?例如,传递一个key ‘wrote’,那哈希表将返回null或者在某种程度上表明它无法找到指定的Key, 神经网络不会返回null, 而是找到一个最接近的匹配,神经网络不仅能找到最接近的匹配,还能修改输出值来估计缺失值,如果传递一个”wrote”到上面的神经网络,输出可能是’write’, 在这里没有足够的数据为神经网络去修改返回,这里仅仅三个样例,所以你可能从其他的key中得到输出。

关于神经网络上面的映射提出了一个非常重要的点,回想神经网络接受一个float类型的数组和返回另外一个数组,如何将字符串放到神经网络之中呢,如上图所示?显然有很多方法可以做到这一点,比如可以做一个数值字符串映射,字符串数字化等,因为它处理数值型数据比处理字符型数据更容易。

一个神经网络解决的问题,输入必须是float型数组,这是神经网络编程最困难的一个方面,具体怎样让一个问题转换为一个固定长度的float型数组。本教程后续章节中都有详细的介绍。

三、快速入门

  1. 一个简单的例子

这里以一个XOR运算示例来入门学习怎样使用Encog来构建神经网络,这个XOR运算示例可以作为神经网络编程里的hello world。

如下的XOR运算规则,可以把它理解为一个哈希表,XOR运算类似于AND和OR运算符,对于AND运算结果要为true, 输入两个都要为ture才可以, 对于OR运算结果要为ture, 只要输入的其中一个为true即可, 而对于XOR结果要为true, 必须输入的两个彼此不相同,XOR真值表如下:

False XOR False = false;
True XOR False = True;
False XOR True = True;
True XOR True = False;

上面的真值表用0,1可以表示如下:

[0.0, 0.0] -> [0.0]
[1.0, 0.0] -> [1.0]
[0.0, 1.0] -> [1.0]
[1.0, 1.0] -> [0.0]

这里的映射定义了神经网络的输入和理想期望的输出。

  1. 安装Encog

Maven

<dependency>
	<groupId>org.encog</groupId>
	<artifactId>encog-core</artifactId>
	<version>3.4</version>
</dependency>
  1. 创建神经网络
//创建一个神经网络
		BasicNetwork network = new BasicNetwork();

		//BasicLayer 参数: 激活函数、是否偏移、该层神经元数目
		network.addLayer(new BasicLayer(null, true, 2));
		network.addLayer(new BasicLayer(new ActivationSigmoid(), true, 3));
		network.addLayer(new BasicLayer(new ActivationSigmoid(), true, 1));
		network.getStructure().finalizeStructure();

		// 使用Nguyen Widrow随机重置权重矩阵和偏差值,范围在-1和1之间的。
		// 如果网络没有输入、输出或隐藏层,则不能使用Nguyen Widrow,将使用-1到1之间的简单随机范围
		network.reset();
  1. 创建训练数据
//创建训练数据
		double XOR_INPUT[][] = {
			{0.0, 0.0}, {1.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}
		};
		double XOR_OUTPUT[][] = {
			{0.0}, {1.0}, {1.0}, {0.0}
		};
		MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT,XOR_OUTPUT);
  1. 训练神经网络
//训练神经网络
		final ResilientPropagation train = new ResilientPropagation(network, trainingSet);
		
		int epoch = 1;
		
		do {
			train.iteration();
			System.out.println("Epoch #" + epoch + " Error: " + train.getError());
			epoch++;
		}while(train.getError() > 0.01);
  1. 测试神经网络
//测试神经网络
		System.out.println("Neural Network Results: ");
		for(MLDataPair pair: trainingSet){
			final MLData output = network.compute(pair.getInput());
			System.out.println(pair.getInput().getData(0) + 
					"," + pair.getInput().getData(1) + 
					", actual=" + output.getData(0) + ",ideal=" + 
					pair.getIdeal().getData(0));
		}
  1. Encog关闭
//Encog关闭
		Encog.getInstance().shutdown();
  1. 完整的代码
//创建一个神经网络
		BasicNetwork network = new BasicNetwork();
		
		//BasicLayer 参数: 激活函数、是否偏移、该层神经元数目
		network.addLayer(new BasicLayer(null, true, 2));
		network.addLayer(new BasicLayer(new ActivationSigmoid(), true, 3));
		network.addLayer(new BasicLayer(new ActivationSigmoid(), true, 1));
		network.getStructure().finalizeStructure();
		
		// 使用Nguyen Widrow随机重置权重矩阵和偏差值,范围在-1和1之间的。
		// 如果网络没有输入、输出或隐藏层,则不能使用Nguyen Widrow,将使用-1到1之间的简单随机范围
		network.reset();
		
		//创建训练数据
		double XOR_INPUT[][] = {
			{0.0, 0.0}, {1.0, 0.0}, {0.0, 1.0}, {1.0, 1.0}
		};
		double XOR_OUTPUT[][] = {
			{0.0}, {1.0}, {1.0}, {0.0}
		};
		MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT,XOR_OUTPUT);
		
		//训练神经网络
		final ResilientPropagation train = new ResilientPropagation(network, trainingSet);
		
		int epoch = 1;
		
		do {
			train.iteration();
			System.out.println("Epoch #" + epoch + " Error: " + train.getError());
			epoch++;
		}while(train.getError() > 0.01);
		
		//测试神经网络
		System.out.println("Neural Network Results: ");
		for(MLDataPair pair: trainingSet){
			final MLData output = network.compute(pair.getInput());
			System.out.println(pair.getInput().getData(0) + 
					"," + pair.getInput().getData(1) + 
					", actual=" + output.getData(0) + ",ideal=" + 
					pair.getIdeal().getData(0));
		}
		//Encog关闭
		Encog.getInstance().shutdown();

7 运行结果
在这里插入图片描述

四、本教程的结构

第一章:回归,分类&聚类
这章介绍了用神经网络执行的主要任务,比如对数据的识别和提供。这些任务不仅仅可以通过神经网络来完成,也有使用其他的机器学习算法来完成。

第二章:数据的获取与标准化
介绍了在使用神经网络之前怎样处理数据,这章将研究一些可能用于神经网络的数据,以及如何使用Encog来规范化和使用这些数据。

第三章:使用Encog Workbench
Encog包括了一个Encog Workbench的GUI神经网络编辑器,这章详细介绍此应用程序的使用方法和用途。Encog Workbench提供了一个能够编辑Encog框架使用的.EG数据文件的一个GUI工具,Encog分析师也能够用来自动执行大量的任务。

第四章:用JAVA构造神经网络
接下来就是构造和保存神经网络,介绍了在创建构造神经网络的时候这样使用layer层和怎样使用激活函数,也介绍怎样使用平台独立的“.EG”文件或者标准的JAVA序列化这两种方式来保存神经网络。

第五章:传播训练
介绍了怎样使用Encog内置的训练算法来训练神经网络。Encog支持反向传播,弹性传播,曼哈顿更新规则,快速传播和SCG。

第六章:其他监督训练方法
介绍了Encog支持的其他监督训练算法,这章不但介绍了模拟退火算法和遗传算法,也详细介绍了怎样创建混合训练算法。

第七章:其他神经网络类型
Encog不仅仅支持前馈神经网络类型,也提供了其他几个神经网络类型,这一章详细描述了怎样使用NEAT, ART1和Elman/Jordan神经网络。

第八章:使用时序数据
神经网络通常使用来预测未来数据的改变,比如常见的预测股市趋势,这一章中将介绍怎样使用Encog预测未来的变化。

第九章:使用图像数据
作为神经网络的输入,图像是最一种最常见的形式。Encog包含了易于使用的图像数据和训练神经网络的类,这一张介绍了怎样通过Encog来使用图像数据。

第十章:使用自组织映射
本章讲解了Encog通过监督训练到使用无监督训练的扩展,一个自组织映射(SOM)可以用于集群数据。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现BP神经网络识别数字图片的步骤如下: 1.准备数据集 首先需要准备一个数字图片数据集,可以使用MNIST手写数字数据集,也可以自己制作。 2.数据预处理 将数字图片转换成一维向量,然后进行归一化处理,将像素值缩放到0~1之间。 3.构建BP神经网络模型 BP神经网络由输入层、隐藏层和输出层组成,可以使用Java中的神经网络库,如Encog或者Neuroph来构建模型。 4.训练模型 将数据集分成训练集和测试集,使用训练集来训练模型,并调整模型的参数,使得模型的预测结果与实际结果的误差最小化。 5.测试模型 使用测试集来测试模型的准确性。 以下是一个基本的BP神经网络识别数字图片的Java代码示例: ```java import org.encog.Encog; import org.encog.engine.network.activation.ActivationSigmoid; import org.encog.ml.data.MLData; import org.encog.ml.data.MLDataPair; import org.encog.ml.data.MLDataSet; import org.encog.ml.data.basic.BasicMLDataSet; import org.encog.neural.networks.BasicNetwork; import org.encog.neural.networks.layers.BasicLayer; public class BPNetwork { public static void main(String[] args) { // 准备数据集 double[][] input = new double[][]{{0,0}, {0,1}, {1,0}, {1,1}}; double[][] output = new double[][]{{0}, {1}, {1}, {0}}; MLDataSet trainingSet = new BasicMLDataSet(input, output); // 构建BP神经网络模型 BasicNetwork network = new BasicNetwork(); network.addLayer(new BasicLayer(null,true,2)); network.addLayer(new BasicLayer(new ActivationSigmoid(),true,4)); network.addLayer(new BasicLayer(new ActivationSigmoid(),false,1)); network.getStructure().finalizeStructure(); network.reset(); // 训练模型 for(int i=0;i<10000;i++) { for(MLDataPair pair : trainingSet ) { MLData outputData = network.compute(pair.getInput()); network.calculateErrors(outputData, pair.getIdeal()); network.updateWeights(); } } // 测试模型 System.out.println("Testing neural network"); for(MLDataPair pair : trainingSet ) { MLData output = network.compute(pair.getInput()); System.out.println(pair.getInput().getData(0) + "," + pair.getInput().getData(1) + ", actual=" + output.getData(0) + ",ideal=" + pair.getIdeal().getData(0)); } Encog.getInstance().shutdown(); } } ``` 这是一个简单的BP神经网络模型,用于识别XOR逻辑门。你可以根据实际需求来修改该代码,使其能够识别数字图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值