这个就是C++与matlab混合编程。但是神经网络工具箱比较特别,它反盗用比较严厉。采用传统的混编方式,可以调用matlab自己的函数,但无法成功调用神经网络工具箱。
这一点在mathwork网站上也做了说明。以C#为例,一般混编有四种方式:(1)利用Matlab自身编译器,目的是将m文件转换为c或c++的源代码。(2)利用COM或.NET组件技术。
通过MATLAB中的Deploytool工具将m文件编译成dll,然后在系统中调用。(3)利用Mideva平台。没尝试过。(4)利用MATLAB引擎技术。
该方法相当于在.NET中运行MATLAB程序,获取其结果。优点是操作简单,过程简易。缺点是需要安装Matlab软件。如果要调用神经网络工具箱,只有使用第四种方法,即引擎技术,其他方法都不可行。
这种混编方式仅仅传递参数,因此不涉及到神经网络工具箱的代码,也就没有了防盗用限制。
谷歌人工智能写作项目:小发猫
参考一下刘金琨的《先进PID控制》这本书rbsci。
例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)其中a(k)=1.2(1-0.8e^(-0.1k))输入信号:rin(k)=1.0和rin(k)=sin(2t)%BPbasedPIDControlclearall;closeall;xite=0.25;//学习速率alfa=0.05;//惯性系数S=1;%SignaltypeIN=4;H=5;Out=3;%NNStructureifS==1%StepSignalwi=[-0.6394-0.2696-0.3756-0.7023;-0.8603-0.2013-0.5024-0.2596;-1.07490.5543-1.6820-0.5437;-0.3625-0.0724-0.6463-0.2859;0.14250.0279-0.5406-0.7660];%wi=0.50*rands(H,IN);wi_1=wi;wi_2=wi;wi_3=wi;wo=[0.75760.26160.5820-0.1416-0.1325;-0.11460.29490.83520.22050.4508;0.72010.45660.76720.49620.3632];%wo=0.50*rands(Out,H);wo_1=wo;wo_2=wo;wo_3=wo;endifS==2%SineSignalwi=[-0.28460.2193-0.5097-1.0668;-0.7484-0.1210-0.47080.0988;-0.71760.8297-1.60000.2049;-0.08580.1925-0.63460.0347;0.43580.2369-0.4564-0.1324];%wi=0.50*rands(H,IN);wi_1=wi;wi_2=wi;wi_3=wi;wo=[1.04380.54780.86820.14460.1537;0.17160.58111.12140.50670.7370;1.00630.74281.05340.78240.6494];%wo=0.50*rands(Out,H);wo_1=wo;wo_2=wo;wo_3=wo;endx=[0,0,0];u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;y_1=0;y_2=0;y_3=0;Oh=zeros(H,1);%OutputfromNNmiddlelayerI=Oh;%InputtoNNmiddlelayererror_2=0;error_1=0;ts=0.001;fork=1:1:6000time(k)=k*ts;ifS==1rin(k)=1.0;elseifS==2rin(k)=sin(1*2*pi*k*ts);end%Unlinearmodela(k)=1.2*(1-0.8*exp(-0.1*k));yout(k)=a(k)*y_1/(1+y_1^2)+u_1;error(k)=rin(k)-yout(k);xi=[rin(k),yout(k),error(k),1];x(1)=error(k)-error_1;x(2)=error(k);x(3)=error(k)-2*error_1+error_2;epid=[x(1);x(2);x(3)];I=xi*wi';forj=1:1:HOh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%MiddleLayerendK=wo*Oh;%OutputLayerforl=1:1:OutK(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));%Gettingkp,ki,kdendkp(k)=K(1);ki(k)=K(2);kd(k)=K(3);Kpid=[kp(k),ki(k),kd(k)];du(k)=Kpid*epid;u(k)=u_1+du(k);ifu(k)>=10%Restrictingtheoutputofcontrolleru(k)=10;endifu(k)。
人工神经网络有很多模型,但是日前应用最广、基本思想最直观、最容易被理解的是多层前馈神经网络及误差逆传播学习算法(ErrorBack-Prooaeation),简称为BP网络。
在1986年以Rumelhart和McCelland为首的科学家出版的《ParallelDistributedProcessing》一书中,完整地提出了误差逆传播学习算法,并被广泛接受。
多层感知网络是一种具有三层或三层以上的阶层型神经网络。
典型的多层感知网络是三层、前馈的阶层网络(图4.1),即:输入层、隐含层(也称中间层)、输出层,具体如下:图4.1三层BP网络结构(1)输入层输入层是网络与外部交互的接口。
一般输入层只是输入矢量的存储层,它并不对输入矢量作任何加工和处理。输入层的神经元数目可以根据需要求解的问题和数据表示的方式来确定。
一般而言,如果输入矢量为图像,则输入层的神经元数目可以为图像的像素数,也可以是经过处理后的图像特征数。
(2)隐含层1989年,RobertHechtNielsno证明了对于任何在闭区间内的一个连续函数都可以用一个隐层的BP网络来逼近,因而一个三层的BP网络可以完成任意的n维到m维的映射。
增加隐含层数虽然可以更进一步的降低误差、提高精度,但是也使网络复杂化,从而增加了网络权值的训练时间。
误差精度的提高也可以通过增加隐含层中的神经元数目来实现,其训练效果也比增加隐含层数更容易观察和调整,所以一般情况应优先考虑增加隐含层的神经元个数,再根据具体情况选择合适的隐含层数。
(3)输出层输出层输出网络训练的结果矢量,输出矢量的维数应根据具体的应用要求来设计,在设计时,应尽可能减少系统的规模,使系统的复杂性减少。
如果网络用作识别器,则识别的类别神经元接近1,而其它神经元输出接近0。
以上三层网络的相邻层之间的各神经元实现全连接,即下一层的每一个神经元与上一层的每个神经元都实现全连接,而且每层各神经元之间无连接,连接强度构成网络的权值矩阵W。
BP网络是以一种有教师示教的方式进行学习的。首先由教师对每一种输入模式设定一个期望输出值。然后对网络输入实际的学习记忆模式,并由输入层经中间层向输出层传播(称为“模式顺传播”)。
实际输出与期望输出的差即是误差。按照误差平方最小这一规则,由输出层往中间层逐层修正连接权值,此过程称为“误差逆传播”(陈正昌,2005)。
所以误差逆传播神经网络也简称BP(BackPropagation)网。随着“模式顺传播”和“误差逆传播”过程的交替反复进行。
网络的实际输出逐渐向各自所对应的期望输出逼近,网络对输入模式的响应的正确率也不断上升。通过此学习过程,确定下各层间的连接权值后。
典型三层BP神经网络学习及程序运行过程如下(标志渊,2006):(1)首先,对各符号的形式及意义进行说明:网络输入向量Pk=(a1,a2,...,an);网络目标向量Tk=(y1,y2,...,yn);中间层单元输入向量Sk=(s1,s2,...,sp),输出向量Bk=(b1,b2,...,bp);输出层单元输入向量Lk=(l1,l2,...,lq),输出向量Ck=(c1,c2,...,cq);输入层至中间层的连接权wij,i=1,2,...,n,j=1,2,...p;中间层至输出层的连接权vjt,j=1,2,...,p,t=1,2,...,p;中间层各单元的输出阈值θj,j=1,2,...,p;输出层各单元的输出阈值γj,j=1,2,...,p;参数k=1,2,...,m。
(2)初始化。给每个连接权值wij、vjt、阈值θj与γj赋予区间(-1,1)内的随机值。(3)随机选取一组输入和目标样本提供给网络。
(4)用输入样本、连接权wij和阈值θj计算中间层各单元的输入sj,然后用sj通过传递函数计算中间层各单元的输出bj。
基坑降水工程的环境效应与评价方法bj=f(sj)j=1,2,...,p(4.5)(5)利用中间层的输出bj、连接权vjt和阈值γt计算输出层各单元的输出Lt,然后通过传递函数计算输出层各单元的响应Ct。
基坑降水工程的环境效应与评价方法Ct=f(Lt)t=1,2,...,q(4.7)(6)利用网络目标向量,网络的实际输出Ct,计算输出层的各单元一般化误差。
基坑降水工程的环境效应与评价方法(7)利用连接权vjt、输出层的一般化误差dt和中间层的输出bj计算中间层各单元的一般化误差。
基坑降水工程的环境效应与评价方法(8)利用输出层各单元的一般化误差与中间层各单元的输出bj来修正连接权vjt和阈值γt。
基坑降水工程的环境效应与评价方法(9)利用中间层各单元的一般化误差,输入层各单元的输入Pk=(a1,a2,...,an)来修正连接权wij和阈值θj。
基坑降水工程的环境效应与评价方法(10)随机选取下一个学习样本向量提供给网络,返回到步骤(3),直到m个训练样本训练完毕。
(11)重新从m个学习样本中随机选取一组输入和目标样本,返回步骤(3),直到网路全局误差E小于预先设定的一个极小值,即网络收敛。如果学习次数大于预先设定的值,网络就无法收敛。(12)学习结束。
可以看出,在以上学习步骤中,(8)、(9)步为网络误差的“逆传播过程”,(10)、(11)步则用于完成训练和收敛过程。通常,经过训练的网络还应该进行性能测试。
测试的方法就是选择测试样本向量,将其提供给网络,检验网络对其分类的正确性。测试样本向量中应该包含今后网络应用过程中可能遇到的主要典型模式(宋大奇,2006)。
这些样本可以直接测取得到,也可以通过仿真得到,在样本数据较少或者较难得到时,也可以通过对学习样本加上适当的噪声或按照一定规则插值得到。
为了更好地验证网络的泛化能力,一个良好的测试样本集中不应该包含和学习样本完全相同的模式(董军,2007)。
%人脸识别模型,脸部模型自己找吧。
functionmytest()clc;images=[];M_train=3;%表示人脸N_train=5;%表示方向sample=[];pixel_value=[];sample_number=0;forj=1:N_trainfori=1:M_trainstr=strcat('Images\',num2str(i),'_',num2str(j),'.bmp');%读取图像,连接字符串形成图像的文件名。
img=imread(str);[rowscols]=size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');%由于在分割图片中我们可以看到这个人脸的眼睛部分也就是位于分割后的第二行中,位置变化比较大,而且眼睛边缘检测效果很好sub_rows=floor(rows/6);%最接近的最小整数,分成6行sub_cols=floor(cols/8);%最接近的最小整数,分成8列sample_num=M_train*N_train;%前5个是第一幅人脸的5个角度sample_number=sample_number+1;forsubblock_i=1:8%因为这还在i,j的循环中,所以不可以用iblock_num=subblock_i;pixel_value(sample_number,block_num)=0;forii=sub_rows:(2*sub_rows)forjj=(subblock_i-1)*sub_cols+1:subblock_i*sub_colspixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj);endendendendend%将特征值转换为小于1的值max_pixel_value=max(pixel_value);max_pixel_value_1=max(max_pixel_value);fori=1:3mid_value=10^i;if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)。