C++实现基于离散Hopfield神经网络噪声数字的识别_智能计算作业三

来源:互联网 发布:离线翻译软件哪个好 编辑:程序博客网 时间:2024/05/15 05:29

鸣谢!男朋友帮我整理的数据!真爱!!!


智能计算第三次作业


1、            题目:

基于离散Hopfield神经网络噪声数字的识别

2、            实现步骤

算法部分:

①初始化:

给定P个待存的向量u[p][N],N=120.开关函数采用sigmoid  函数

W[N][N]={0};θ=0.1.验证得θ=0时也能得到结果。

②外积法设计离散型Hopfield神经网络的圈系数矩阵W

③对样本加入噪声,25%的概率;

④ 设定迭代次数50,采用并行的工作方式,进行迭代。

画图部分:

采用opencv2进行画图,-1画点,1画实矩形 。

3、核心代码及说明:

    ///////画图,采用opencv进行画图

    stringstream ss;   

    string str;  

    for(int k=0;k<P;k++)

    {

        str="u";

        ss.clear();   

        ss<<str;   

        ss<<k;   

        ss<<".jpg";   

        ss>>str;   

        Mat img(120,100,CV_8UC3,Scalar(130,240,205));//3通道图像

        for(int i=0;i<120;i++)

        {

            if(u[k][i]==-1) //画点

                circle(img,Point(5+10*(i%10),5+10*(i/10)),1,Scalar(220,0,150),1,8,0);

            if(u[k][i]==1) //画实矩形

                rectangle(img,Point(10*(i%10)+2,10*(i/10)+2),Point(8+10*(i%10),8+10*(i/10)),Scalar(220,0,150),-1,8,0);

        }

        namedWindow(str,0);

        imshow(str,img ); //显示图像

        imwrite(str,img); //保存图像

}

/////外积法设计离散型Hopfield神经网络的圈系数矩阵W

for(int k=0;k<7;k++)

        {

            for(int i=0;i<N;i++)

                for(int j=0;j<N;j++)

                    W[i][j]=W[i][j]+u[k][i]*u[k][j];   

        }

        for(int i=0;i<N;i++)

        {

            for(int j=0;j<N;j++)

            {

                if(i!=j)

                    W[i][j]=W[i][j]/N

                else

                    W[i][j]=0;

            }

     }

/////////////加入噪音

    srand ( unsigned ( time (NULL) ) );

    for(int i=0;i<P;i++)

    {

        for(int j=0;j<N;j++)

        {

            int R=(rand()%4);

            if(R==0)

                u[i][j]=-u[i][j];

        }

}

//////////进行迭代,采用并行的工作方式

int T=0;

while(T<50)

{

    T++;

    for(int k=0;k<7;k++)

    {

        for(int i=0;i<N;i++)

        {

            double v=0;

            for(int j=0;j<N;j++)

            {

                v=v+W[i][j]*u[k][j];

            }

            v=v-0.1; /////θ=0.1

            if(v>0)

                u[k][i]=1;

            else

            {

                if(v==0)

                    u[k][i]=u[k][i];

                 else

                    u[k][i]=-1;

            }

        }

    }

}

3、            运行结果

由于选取随机污染,污染不同结果不同:

初始图像


              结果1:

  污染后图像uiT0

 

一次迭代后uiT1:


二次迭代后:uiT2


三次迭代后:uiT3


之后不再发生变化。

结果2:

污染后:


一次迭代uiT1


二次迭代uiT2


三次迭代uiT3


之后不再发生变化。

4、            总结

通过C++编程实现基于离散Hopfield神经网络噪声数字的识别,我对其的原理理解更深刻了,只有通过一次次修改代码和查阅资料才知道自己对算法的些地方存在错误的认识,再不断改进自己的算法。

今天又发现一个错误,求W矩阵的时候应该除以N,我却打成了%N。已经改过来了。作业还是晚点交好吧。奇怪的是那样结果也能出来。。。这算不算是一种新算法呢?真是醉了。

。cpp文件


#include<iostream>#include"math.h"#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/opencv.hpp>#include <time.h>using namespace cv;using namespace std;#define P 7#define N  120double W[N][N]={0};int u[P][N]={{-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1},{1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1},{-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1},{-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1},{1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1},{1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1}};int main(){////画原图stringstream ss;    string str;   cout<<0.1/2;for(int k=0;k<P;k++){str="u"; ss.clear();    ss<<str;    ss<<k;    ss<<".jpg";    ss>>str;    Mat img(120,100,CV_8UC3,Scalar(130,240,205));//3通道图像for(int i=0;i<120;i++){if(u[k][i]==-1)circle(img,Point(5+10*(i%10),5+10*(i/10)),1,Scalar(220,0,150),1,8,0);if(u[k][i]==1)rectangle(img,Point(10*(i%10)+2,10*(i/10)+2),Point(8+10*(i%10),8+10*(i/10)),Scalar(220,0,150),-1,8,0);}namedWindow(str,0);imshow(str,img );imwrite(str,img);}//waitKey();for(int k=0;k<7;k++){for(int i=0;i<N;i++)for(int j=0;j<N;j++)W[i][j]=W[i][j]+u[k][i]*u[k][j];}for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(i!=j)W[i][j]=W[i][j]/N;elseW[i][j]=0;}}//加入噪音srand ( unsigned ( time (NULL) ) );for(int i=0;i<P;i++){for(int j=0;j<N;j++){int R=(rand()%4);if(R==0)u[i][j]=-u[i][j];}}//int v=0;int T=0;stringstream ss_noise;    string str_noise;while(T<5){///画图stringstream ss_noise;    string str_noise;for(int k=0;k<P;k++){str_noise="u";  ss_noise.clear();    ss_noise<<str_noise;    ss_noise<<k;  ss_noise<<"T"; ss_noise<<T; ss_noise<<".jpg";    ss_noise>>str_noise;    Mat img_noise(120,100,CV_8UC3,Scalar(130,240,205));//3通道图像for(int i=0;i<N;i++){if(u[k][i]==-1)circle(img_noise,Point(5+10*(i%10),5+10*(i/10)),1,Scalar(220,0,150),1,8,0);if(u[k][i]==1)rectangle(img_noise,Point(10*(i%10)+2,10*(i/10)+2),Point(8+10*(i%10),8+10*(i/10)),Scalar(220,0,150),-1,8,0);}namedWindow(str_noise,0);imshow(str_noise,img_noise );imwrite(str_noise,img_noise);}T++;for(int k=0;k<7;k++){for(int i=0;i<N;i++){double v=0;for(int j=0;j<N;j++){v=v+W[i][j]*u[k][j];}v=v-0.1;if(v>0)u[k][i]=1;else{if(v==0)u[k][i]=u[k][i];elseu[k][i]=-1;}}}}waitKey();return 0;}


 

0 0
原创粉丝点击