神经网络的学习
1、为什么学习神经网络
略。
2、开源java神经网络组件
Joone、Encog和Neuroph
3、简单介绍各组件
Joone
网上叙述太少,依赖包相对较老,弃用
依赖包地址请自行查找
Neuroph
阿里云maven有它的依赖包,自行引入
相关使用教程网上自行查找
Encog
阿里云maven有它的依赖包,自行引入
小编使用的是该组件,这里记录学习历程,持续跟新
4、学习Encog
基于 IDEA、jdk1.8、springboot
引入依赖
<dependency> <groupId>org.encog</groupId> <artifactId>encog-core</artifactId> <version>3.4</version>
</dependency>
创建测试类
package com.example.demo.encog; 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; import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation; public class T { public static void main(String[] args) { //创建一个神经网络 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(); } }
运行main方法,控制台打印响应的日志信息
至此简单的环境已经搭建成功
5、深入学习encog
关键词显示,使得重点突出,有点困,显眼
新概念词汇
XOR运算符
对于结果要为true,必须输入的两个彼此不相同
encog擅长解决什么样的问题呢,这是生产工具终极归属
解决训练问题,不能解释其推理,解决那些不能用一系列步骤表示的问题,这可能包括了模式识别、分类、预测和数据挖掘
第一章 回归、分类&聚类
刚看到这又发现,它能做啥呢
人工智能-编程-Fizz Buzz
题目描述
写个程序来玩玩Fizz Buzz 这是一个游戏,玩家从1数到100,如果数字被3整除,那么喊‘fizz’,如果被5整除就喊‘buzz’,
如果两个都满足就喊‘fizzbuzz’,不然就直接说数字。
传统方法编程
100%正确解决当前问题
代码行数少
不依赖数据
有可解释性
AI编程
机器学习需要三步
特征工程 要尽量提取数据特征,并用数字表示
数据训练 对数据进行观察分析,找到合适的算法
模型预测 对模型的准确度进行分析和测试
结果特征
测试准确度并非100%
代码行数较多
依赖数据
无可解释性
关于结果的疑问,准确度并非100%,得出的结果可以作为实验数据吗,怎样应用与实践当中呢
无从下手
先从概念性的名词入手
神经网络中的激活函数
激活函数就是一类x到y的映射,解决线性模型不能解决的问题
双曲正切函数
优点 相比于Sigmoid收敛速度更快
其输出以0为中心
缺点 和sigmoid函数一样,也是存在梯度消失的问题
ReLU,目前使用最广泛的激活函数
优点 更容易学习优化,收敛速度比sigmoid/tanh快很多。因为其分段线性性质,导致其前传、后传,求导都是分段线性;Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的互相依存关系,缓解了过拟合问题的发生;在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征;
缺点 ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁
神经网络中引入激活函数的目的
从激活函数的解释和作用探究它的存在意义
Error函数
利用神经网络做分类的时候,可以将神经网络看成一个mapping function(映射函数),从输入到输出经过复杂的非线性变换。而输出的预测值与实际的目标值总是存在一定偏差的,一般利用这种偏差建立error函数,再利用back propagation(反向传播)来训练神经网络。
BP算法
释义反向传播,bp算法的思想很简单,小时候拿着作业对答案的时候,会根据我们自己写的作业答案和标准答案进行比对,发现误差,就会修改我们作业内容,直到作业答案和标准答案一致,bp算法也是基于这种思想,它会根据网络输出答案和正确答案的误差,不断调整神经网络的参数。
有一点点眉目
根据答案寻找答案,它存在的意义在哪呢,应该是根据数据借助训练的经验得出实验结果,而不是代入答案
保存和提取神经网络
保存神经网络 保存整个神经网络 保存神经网络的参数,不保存它的结构
Encog持久化
这里考虑Encog EG格式,Encog平台的通用文件,EG格式文件架构神经网络保存为文本文件,文件扩展名为.EG,这种格式能够在不同操作系统和Encog平台之间进行转换。
提取神经网络 直接提取 先创建一个跟提取的神经网络一模一样的神经网络,然后再将各个参数传入神经网络即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!