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

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');%保存模型

图1

训练完后会产生上图的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)

图2
总体来说BP的训练结束。如果我写的不清楚或者有问题可以去网上找其他人写的BP训练方法,网上很多。大致都是这个步骤,下面就是对神经网络进行DLL封装了。

2. MATLAB封装神经网络成DLL

MATLAB封装DLL网络上有很多具体方法,我就大致写一下。在MATLAB中输入deploytool
会出现下图3所示
图3
点击进入封装界面,如下图4。
图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
图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位系统。
图6
输出结果为下图7。
图7

这个C#调用MATLAB封装的DLL文件就写完了,希望对你有帮助。谢谢

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值