C++实现基于离散Hopfield神经网络噪声数字的识别_智能计算作业三
2014-12-20 01:09
381 查看
鸣谢!男朋友帮我整理的数据!真爱!!!
智能计算第三次作业
1、 题目:
基于离散Hopfield神经网络噪声数字的识别
2、 实现步骤
算法部分:
①初始化:
给定P个待存的向量u[p]
,N=120.开关函数采用sigmoid 函数
W
={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文件
智能计算第三次作业
1、 题目:
基于离散Hopfield神经网络噪声数字的识别
2、 实现步骤
算法部分:
①初始化:
给定P个待存的向量u[p]
,N=120.开关函数采用sigmoid 函数
W
={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 120 double W ={0}; int u[P] ={ { -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1, -1,-1,-1,1,1,1,1,-1,-1,-1 },{ 1,1,1,1,1,1,1,1,-1,-1, 1,1,1,1,1,1,1,1,-1,-1, -1,-1,-1,-1,-1,-1,1,1,-1,-1, -1,-1,-1,-1,-1,-1,1,1,-1,-1, -1,-1,-1,-1,-1,-1,1,1,-1,-1, 1,1,1,1,1,1,1,1,-1,-1, 1,1,1,1,1,1,1,1,-1,-1, 1,1,-1,-1,-1,-1,-1,-1,-1,-1, 1,1,-1,-1,-1,-1,-1,-1,-1,-1, 1,1,-1,-1,-1,-1,-1,-1,-1,-1, 1,1,1,1,1,1,1,1,-1,-1, 1,1,1,1,1,1,1,1,-1,-1 },{ -1,-1,1,1,1,1,1,1,-1,-1, -1,-1,1,1,1,1,1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,1,1,1,1,-1,-1, -1,-1,-1,-1,1,1,1,1,-1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,1,1,1,1,1,1,1,-1, -1,-1,1,1,1,1,1,1,-1,-1 },{ -1,1,1,-1,-1,-1,-1,1,1,-1, -1,1,1,-1,-1,-1,-1,1,1,-1, -1,1,1,-1,-1,-1,-1,1,1,-1, -1,1,1,-1,-1,-1,-1,1,1,-1, -1,1,1,-1,-1,-1,-1,1,1,-1, -1,1,1,1,1,1,1,1,1,-1, -1,1,1,1,1,1,1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1, -1,-1,-1,-1,-1,-1,-1,1,1,-1 },{ 1,1,1,1,1,1,-1,-1,-1,-1, 1,1,1,1,1,1,-1,-1,-1,-1, 1,1,1,-1,-1,-1,-1,-1,-1,-1, 1,1,1,-1,-1,-1,-1,-1,-1,-1, 1,1,1,-1,-1,-1,-1,-1,-1,-1, 1,1,1,1,1,1,-1,-1,-1,-1, 1,1,1,1,1,1,-1,-1,-1,-1, 1,1,-1,-1,1,1,-1,-1,-1,-1, 1,1,-1,-1,1,1,-1,-1,-1,-1, 1,1,-1,-1,1,1,-1,-1,-1,-1, 1,1,1,1,1,1,-1,-1,-1,-1, 1,1,1,1,1,1,-1,-1,-1,-1 },{ 1,1,1,1,1,-1,-1,-1,-1,-1, 1,1,1,1,1,-1,-1,-1,-1,-1, 1,1,1,1,1,-1,-1,-1,-1,-1, 1,1,1,1,1,-1,-1,-1,-1,-1, 1,1,1,1,1,-1,-1,-1,-1,-1, 1,1,1,1,1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 },{ -1,-1,-1,-1,1,1,1,1,1,1, -1,-1,-1,-1,1,1,1,1,1,1, -1,-1,-1,-1,1,1,-1,-1,1,1, -1,-1,-1,-1,1,1,-1,-1,1,1, -1,-1,-1,-1,1,1,-1,-1,1,1, -1,-1,-1,-1,1,1,1,1,1,1, -1,-1,-1,-1,1,1,1,1,1,1, -1,-1,-1,-1,-1,-1,-1,-1,1,1, -1,-1,-1,-1,-1,-1,-1,-1,1,1, -1,-1,-1,-1,-1,-1,-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; 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 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]; else u[k][i]=-1; } } } } waitKey(); return 0; }
相关文章推荐
- 【神经网络学习笔记】基于离散Hopfield神经网络的数字识别
- C++实现BP算法_单隐层_异或(可模拟各种函数并验证)_智能计算作业2.1
- C++实现BP算法实现正弦函数模拟_智能计算作业2.2
- C++实现单层感知器网络_智能计算作业1
- 神经网络 做数字识别 C++实现
- [机器学习]基于OpenCV实现最简单的数字识别
- 微信公众号智能识别回复的实现(基于ThinkPHP框架)
- 基于C++的Kinect手势识别实现
- c++基于引用计数的智能指针实现
- Kaggle Digit Recognizer 基于sklearn实现的手写数字识别 for MNIST data
- C++实现BP 神经网络模拟二维机械臂运动_智能计算期末2
- 算术表达式的计算(基于逆波兰表达式)的c++实现
- C++实现md5加密或计算文件的唯一性识别
- 用BP网络算法实现对含噪声0到9数字的识别
- 第四次程序设计作业 C++计算器计算及命令行的使用 前缀表达式方法实现
- 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得
- 基于K-近邻算法识别手写数字的实现
- [机器学习]基于OpenCV实现最简单的数字识别
- 基于Hopfield神经网络的数字识别
- 第四次程序设计作业 C++计算器计算及命令行的使用 前缀表达式方法实现