Matlab封装BP神经网络成DLL文件并用C#调用

it2023-10-21  91

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文件就写完了,希望对你有帮助。谢谢

最新回复(0)