すのはら荘春原庄的雪

神经网络的学习

Toretto·2022-10-14 14:12·126 次阅读

神经网络的学习

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平台之间进行转换。

提取神经网络  直接提取 先创建一个跟提取的神经网络一模一样的神经网络,然后再将各个参数传入神经网络即可

 

posted @   subtlman  阅读(126)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示