Hopfield神经网络实现污染字体的识别

这个网络的内部使用的是hebb学习规则

贴上两段代码:

  

package geym.nn.hopfiled;

import java.util.Arrays;

import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.nnet.Hopfield;
import org.neuroph.nnet.comp.neuron.InputOutputNeuron;
import org.neuroph.nnet.learning.HopfieldLearning;
import org.neuroph.util.NeuronProperties;
import org.neuroph.util.TransferFunctionType;

/**
 * 识别0 1 2 使用hopfield 全连接结构
 * @author Administrator
 *
 */
public class HopfieldSample2 {

    public static double[] format(double[] data){
        for(int i=0;i<data.length;i++){
            if(data[i]==0)data[i]=-1;
        }
        return data;
    }

    public static void main(String args[]) {
        NeuronProperties neuronProperties = new NeuronProperties();
        neuronProperties.setProperty("neuronType", InputOutputNeuron.class);
        neuronProperties.setProperty("bias", new Double(0.0D));
        neuronProperties.setProperty("transferFunction", TransferFunctionType.STEP);
        neuronProperties.setProperty("transferFunction.yHigh", new Double(1.0D));
        neuronProperties.setProperty("transferFunction.yLow", new Double(-1.0D));

        // create training set (H and T letter in 3x3 grid)
        DataSet trainingSet = new DataSet(30);
        trainingSet.addRow(new DataSetRow(format(new double[] {
                0,1,1,1,1,0,
                1,0,0,0,0,1,
                1,0,0,0,0,1,
                1,0,0,0,0,1,
                0,1,1,1,1,0}))); //0

        trainingSet.addRow(new DataSetRow(format(new double[] {
                0,0,0,0,0,0,
                1,0,0,0,0,0,
                1,1,1,1,1,1,
                0,0,0,0,0,0,
                0,0,0,0,0,0}))); //1

        trainingSet.addRow(new DataSetRow(format(new double[] {
                1,0,0,0,0,0,
                1,0,0,1,1,1,
                1,0,0,1,0,1,
                1,0,0,1,0,1,
                0,1,1,0,0,1}))); //2

        // create hopfield network
        Hopfield myHopfield = new Hopfield(30, neuronProperties);
        myHopfield.setLearningRule(new StandHopfieldLearning());
        // learn the training set
        myHopfield.learn(trainingSet);

        // test hopfield network
        System.out.println("Testing network");

        // add one more ‘incomplete‘ H pattern for testing - it will be
        // recognized as H
        // DataSetRow h=new DataSetRow(new double[] { 1, 0, 0, 1, 0, 1, 1, 0, 1
        // });
        // DataSetRow h=new DataSetRow(new double[] { 1, 0, 0, 1, 0, 1, 1, 0, 1
        // });
        DataSetRow h = new DataSetRow(format(new double[] {
                1,0,0,0,0,0,
                1,0,0,1,1,1,
                1,0,0,1,0,1,
                1,0,0,1,0,0,
                0,1,1,0,0,1})); // 2 bad
        trainingSet.addRow(h); 

        myHopfield.setInput(h.getInput());

        double[] networkOutput = null;
        double[] preNetworkOutput = null;
        while (true) {
            myHopfield.calculate();
            networkOutput = myHopfield.getOutput();
            if (preNetworkOutput == null) {
                preNetworkOutput = networkOutput;
                continue;
            }
            if (Arrays.equals(networkOutput, preNetworkOutput)) {
                break;
            }
            preNetworkOutput = networkOutput;
        }

        System.out.print("Input: " + Arrays.toString(h.getInput()));
        System.out.println(" Output: " + Arrays.toString(networkOutput));

        System.out.println(Arrays.equals(format(new double[] {
                1,0,0,0,0,0,
                1,0,0,1,1,1,
                1,0,0,1,0,1,
                1,0,0,1,0,1,
                0,1,1,0,0,1}), networkOutput));
    }

}

下面就是StandHopfieldLearning类的实现,里面标红的地方就是hebb学习规则,权重为输入和输出的乘积:

  

package com.cgjr.com.hopfield;

import org.neuroph.core.Connection;
import org.neuroph.core.Layer;
import org.neuroph.core.Neuron;
import org.neuroph.core.data.DataSet;
import org.neuroph.core.data.DataSetRow;
import org.neuroph.core.learning.LearningRule;

/**
 * Learning algorithm for the Hopfield neural network.
 *
 * @author Zoran Sevarac <[email protected]>
 */
public class StandHopfieldLearning extends LearningRule {

    /**
     * The class fingerprint that is set to indicate serialization
     * compatibility with a previous version of the class.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Creates new HopfieldLearning
     */
    public StandHopfieldLearning() {
        super();
    }

    /**
     * Calculates weights for the hopfield net to learn the specified training
     * set
     *
     * @param trainingSet
     *            training set to learn
     */
    public void learn(DataSet trainingSet) {
        int M = trainingSet.size();
        int N = neuralNetwork.getLayerAt(0).getNeuronsCount();
        Layer hopfieldLayer = neuralNetwork.getLayerAt(0);

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (j == i)
                    continue;
                Neuron ni = hopfieldLayer.getNeuronAt(i);
                Neuron nj = hopfieldLayer.getNeuronAt(j);
                Connection cij = nj.getConnectionFrom(ni);
                Connection cji = ni.getConnectionFrom(nj);

                double wij=0;
                for(int k = 0;k < M;k++){
                    DataSetRow row=trainingSet.getRowAt(k);
                    double[] inputs=row.getInput();
                    wij+=inputs[i]*inputs[j];//Hebb学习规则
                }
                cij.getWeight().setValue(wij);
                cji.getWeight().setValue(wij);
            }// j
        } // i

    }

}
时间: 2024-10-16 14:52:31

Hopfield神经网络实现污染字体的识别的相关文章

数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST

目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 在本章节中,并不会对神经网络进行介绍,因此如果不了解神经网络的话,强烈推荐先去看<西瓜书>,或者看一下我的上一篇博客:数据挖掘入门系列教程(七点五)之神经网络介绍 本来是打算按照<Python数据挖掘入门与实践>

神经网络用于手写数字识别

一:人工神经网络 人类之所以能够思考,学习,判断,大部分都要归功于人脑中复杂的神经网络.虽然现在人脑的机理还没有完全破译,但是人脑中神经元之间的连接,信息的传递都已为人所知晓.于是人们就想能否模拟人脑的功能用于解决其他问题,这就发展出人工神经网络. 人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统

BP神经网络(手写数字识别)

1实验环境 实验环境:CPU [email protected],内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的.测试数据有10000条.另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹.这里选取.mat格式的数据

简单的神经网络算法-手写数字识别

本文通过BP神经网络实现一个简单的手写识别系统. 一.基础知识 1环境 python2.7 需要numpy等库 可利用sudo apt-get install python-安装 2神经网络原理 http://www.hankcs.com/ml/back-propagation-neural-network.html 讲的特别清楚,本实验过程中涉及矩阵运算都用numpy库的函数 3.js的基础知识 http://www.w3school.com.cn/tags/html_ref_canvas.a

基于BP神经网络的手写数字识别

一.BP神经网络原理及结构 本部分先介绍神经网络基本单元神经元的结构和作用,再主要介绍BP神经网络的结构和原理. 1.神经元 神经元作为神经网络的基本单元,对于外界输入具有简单的反应能力,在数学上表征为简单的函数映射.如下图是一个神经元的基本结构,  神经元结构 图中是神经元的输入,是神经元输入的权重,是神经元的激活函数,y是神经元的输出,其函数映射关系为 激活函数来描述层与层输出之间的关系,从而模拟各层神经元之间的交互反应.激活函数必须满足处处可导的条件.常用的神经元函数有四种,分别是线性函数

卷积神经网络入门(1) 识别猫狗

一下来自知乎 按照我的理解,CNN的核心其实就是卷积核的作用,只要明白了这个问题,其余的就都是数学坑了(当然,相比较而言之后的数学坑更难). 如果学过数字图像处理,对于卷积核的作用应该不陌生,比如你做一个最简单的方向滤波器,那就是一个二维卷积核,这个核其实就是一个模板,利用这个模板再通过卷积计算的定义就可以计算出一幅新的图像,新的图像会把这个卷积核所体现的特征突出显示出来.比如这个卷积核可以侦测水平纹理,那卷积出来的图就是原图水平纹理的图像. 现在假设要做一个图像的分类问题,比如辨别一个图像里是

第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器      感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695      感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1.这种算法的局限性很大: 只能将数据分为 2 类 数据必须是线性可分的 虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的. 感知器可以表示为

Tensorflow--基于卷积神经网络实现男女声音分类识别

现在网上基本都没有对应的基于神经网络声音分类识别的较简单的教程,所以我打算通过我自己的思路,编写出一个实现男女声音识别的一个深度学习的模型. 因为没有验证过该想法是否正确,所以想通过该博客来记录实验的结果,无论最终是否能成功识别男女声音,我都想将此次的实验记录下来. 首先从网站http://festvox.org/cmu_arctic/dbs_bdl.html,爬取相关的男人和女人的声音文件. 爬取过程的代码如下,省略,以下直接用到我的代码仓库中的爬取代码:(将在最后提供爬取的男女声音文件集合,

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,