Matlab封装BP神经网络成DLL文件并用C#调用
很抱歉,由于去年写的一篇MATLAB封装神经成DLL可能描述的不够详细,给大家带来困扰。也有人私信我让我详细说说。这几天正好有时间,我就回忆着具体写一下步骤。不太会用这编译器,有错的地方见谅。
1. MATLAB训练BP神经网络
由于我当时做的数据找不到了。所以就简单的用在0到1之间随机产生数据,训练三个数之和。大致的训练步骤应该是下面的代码。
clc;
clear all;
close all;
%训练BP模型为 X+Y+Z
A = rand(1,100);
B = rand(1,100);
C = rand(1,100);
for i=1:size(A,2)
X(1,i)=A(1,i);
X(2,i)=B(1,i);
X(3,i)=C(1,i);
Y(1,i)= A(1,i) + B(1,i) + C(1,i);
end
net=newff(X,Y,[2],{'tansig','purelin'},'trainlm');%建立神经网络
net.trainParam.epochs=100 ;%训练次数设置
net.trainParam.goal=1e-7;%训练精度
net.trainParam.lr=0.001;%学习率设置,
net.trainParam.min_grad=1e-5;
net.trainParam.max_fail=100;
[net,tr]=train(net,X,Y);
save('NET_EX','net');%保存模型
训练完后会产生上图的4 NET_EX.mat文件。这里面包含着训练好的神经网络。
剩下的就是验证神经网络模型。首先写个函数用来调用网络,如下:
function out=bp_out(a)
net = load('NET_EX');%%加载模型
net_1 = net.net;%%提取模型内的网络
out = simcopy(net_1,a);%% 调用模型
end
代码中的simcopy函数其实就是MATLAB中的sim函数。由于要进行下一部的封装所以我把
MATLAB中自带的sim函数复制到和调用函数一个文件夹下改名字为simcopy,即图一中的3,MATLAB中sim函数在文件夹R2019a\toolbox\nnet\nnet@network中。
调用函数编写完后就是测试网络了。下图2为编写的测试函数和输出结果。
a = [0.1 ;0.3 ;0.4];
b=bp_out(a)
总体来说BP的训练结束。如果我写的不清楚或者有问题可以去网上找其他人写的BP训练方法,网上很多。大致都是这个步骤,下面就是对神经网络进行DLL封装了。
2. MATLAB封装神经网络成DLL
MATLAB封装DLL网络上有很多具体方法,我就大致写一下。在MATLAB中输入deploytool
会出现下图3所示
点击进入封装界面,如下图4。
其中必须注意的是要将调用函数bp_out.m和simcopy.m一起进行封装否则调用时会报错也就是图中黄线画的地方,剩下的就是命名和DLL产生在哪个文件夹中(一般默认在MATLAB所在的当前文件夹)但图4中的标号4要记住函数名,方便在C# 中调用。到这里MATLAB封装BP神经网络DLL已经完成了。下面就是用C#调用DLL验证是否将神经网络封装成功。下面的DLL验证网络上也有很多,更详细。我这就大致写一下。
3. C#调用DLL验证
我用的VS编译的C#。找到MATLAB封装的DLL文件我的是bp_out.dll,和找到MWArray.dll这两个DLL文件,其中MWArray.dll我的在R2019a\toolbox\dotnetbuilder\bin\win64\v4.0中。将这两个DLL文件添加入引用中。如下图5
在类的开头加上段代码
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using bp_out;
剩下的就是编译C#程序了,好久不碰这东西了,有点忘记C#怎么编写了,在网上找了点资料,自己写了一段程序如下段代码,可能有点繁琐。凑合着看吧。我把参考的网站贴出来。
C#调用由matlab生成的dll
C#调用Matlab生成的dll方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using bp_out;
namespace test_bp
{
class Program
{
static void Main(string[] args)
{
bp_out.bp_Class1 BP_OUT = new bp_Class1();//实例化
double[,] a = new double[3, 1];
a[0, 0] = 0.1;
a[1, 0] = 0.3;
a[2, 0] = 0.4;
MWNumericArray A = new MWNumericArray(a);
MWArray out_1 = BP_OUT.bp_out(A);//调用
string Output_2 = out_1.ToString();//输出数据转化
Console.WriteLine("三个数之和 ");
Console.WriteLine(Output_2);
Console.ReadLine();
}
}
}
这里需要注意的如下图6所示我是64位系统。
输出结果为下图7。
这个C#调用MATLAB封装的DLL文件就写完了,希望对你有帮助。谢谢