Сборка MATLAB .NET (неопределенная функция или переменная feedforwardnet) - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь интегрировать MATLAB 2010b с Visual Studio 2008 Professional.

У меня есть следующий метод MATLAB.

function varargout = perform( func, varargin )

%% // Set default values
workspaceDirectory = ['Results/MatlabWorkspace_' datestr(now, 'yyyy-mm-dd_HH-MM-SS')];

clear args
args = struct('workspacePath', [ workspaceDirectory '/workspace.mat'], ...
              'testArray', [], ...
              'k', 50, ...
              'rate', 0.0001, ...
              'trainingDataPath', 'P2AT_LaserImageVectorList.csv', ...
              'network', 'feedforwardnet', ...
              'initialWeights', [], ...
              'divideFcn', 'dividerand', ...
              'trainRatio', 70/100, ...
              'testRatio', 15/100, ...
              'valRatio', 15/100, ...
              'trainInd', [], ...
              'testInd', [], ...
              'valInd', [], ...
              'trainFcn', 'trainlm', ...
              'performFcn', 'mse', ...
              'biasConnect', [0; 0; 0], ...
              'layerSize', [9; 4; 1], ...
              'layerTransferFcn', ['tansig '; 'tansig '; 'purelin'], ...
              'max_fail', 10, ...
              'mu_dec', 0.04, ...
              'useInitialWeights', false, ...
              'saveResults', true);

% // Returns a modified properties structure
args = getopt(args,varargin);

args.layerTransferFcn = cellstr(args.layerTransferFcn);

if args.saveResults && ~strcmpi(func,'test')
    if (exist(workspaceDirectory, 'dir') ~= 7)
        mkdir(workspaceDirectory);
    end
end

if (strcmpi(func,'test'))
    try
        load(args.workspacePath, '-regexp', '.*');
    catch err
        Warning(err.message);
        varargin{1,1} = null;
        return;
    end

    data_inputAngle = args.testArray(2501);
    data_inputPCA = args.testArray(1:2500);

    if size(data_inputPCA,1) == 1
        data_inputPCA = data_inputPCA';
    end

    switch(featureExtractionMethod)
        case {'gha','apex'}
            % // [W, errvals] = gha(data_inputPCA, k, varargin{1,3});
            data_PCs  = W' * data_inputPCA;
            data_inputNN = [data_PCs; data_inputAngle];

        case 'nnmf'
            % // [W,H,D] = nnmf(data_inputPCA',k);
            data_PCs  = H * data_inputPCA;
            data_inputNN = [data_PCs; data_inputAngle];

        case 'pcaProcess'

        otherwise
            warning = 'ERROR: no feature extraction method has been defined.';
            Warning('ERROR: no feature extraction method has been defined.');
            varargout{1,1} = null;
            return;
    end

    % // Just to test to see if it recognizes 'feedforwardnet'.
    testnet = feedforwardnet;    % // <------------------------------- LINE 81

    % // Saving all the workspace variables to see if they are all correctly processed.
    save('all');

    varargout{1,1} = net(data_inputNN); %// <------------------------- LINE 86

    end
end

И вот как ясоздайте мой файл DLL для импорта в Visual Studio:

%%// Determine path names
workdir = pwd();
outdir = fullfile(workdir, 'Output');
dnetdir = fullfile(workdir, 'dotnet');

%%// Determine file names
mfile = fullfile(workdir, 'perform.m');
dnetdll = fullfile(dnetdir, 'dotnet.dll');

%%// Build .NET Assembly
eval(['mcc -N -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
        'dotnetclass,0.0,private'' -T link:lib ''' mfile '''']);

Так что все прекрасно работает, когда я использую MATLAB Engine *1012* COM интерфейс для запуска подпрограммы внутри MATLAB изC #:

/*
 * This function calls the routine inside
 * MATLAB using the MATLAB Engine's COM interface
 */
static private float MatlabTestDebug(float[] testData, Double targetAngle)
    {
        Array X = new double[testData.Length + 1];
        testData.CopyTo(X, 0);
        X.SetValue((double)targetAngle, testData.Length);

        Array zerosX = new double[X.GetLength(0)];

        MLApp.MLAppClass matlab = new MLApp.MLAppClass();

        matlab.PutFullMatrix("testArray", "base", X, zerosX);
        matlab.PutWorkspaceData("workspacePath", "base", "workspace.mat");

        // Using Engine Interface, execute the ML command
        // contained in quotes.
        matlab.Execute("cd 'c:\\Users\\H\\Documents\\Project\\Source Code\\MatlabFiles';");
        matlab.Execute("open perform.m");
        matlab.Execute("dbstop in perform.m");
        matlab.Execute("result = perform('test', 'workspacePath', 'workspace.mat', 'testArray', testArray);");
        matlab.Execute("com.mathworks.mlservices.MLEditorServices.closeAll");

        return (double)matlab.GetVariable("result", "base");
    }

Но когда я использую сборку .NET, она не распознает feedforwardnet.Раньше я получал сообщение об ошибке в строке 86 (net(data_inputNN)).Поэтому я добавил строку, чтобы проверить, распознает ли она хотя бы «feedforwardnet», но это не так.

Примечание: я загружаю некоторые переменные из файла, включая «net», который является нейронной сетью(load(args.workspacePath, '-regexp', '.*');)

Также в методе MATLAB, если я загружаю сохраненную «сеть» из файла, а затем сохраняю ее, чтобы посмотреть, как она обрабатывает сеть, она сохранит ее как «структуру» вместо"network".

Я предполагаю, что она загружается как структура для начала.

У меня также была эта проблема внутри самого MATLAB 2009b.Вот почему я сейчас использую MATLAB 2010b, потому что, очевидно, у MATLAB 2009b не было этого конкретного набора инструментов для нейронных сетей.

Ниже приведен код C # для использования сборки .NET.

/*
 * Calls the method from inside a .NET assembly created with MATLAB
 * using Builder for .NET.
 */
private float MatlabTest(float[] testData, Double targetAngle)
    {
        if (testData != null)
        {
            dotnetclass AClass = new dotnetclass();

            Array X = new double[testData.Length + 1];
            testData.CopyTo(X, 0);
            X.SetValue((double)targetAngle, testData.Length);

            MWNumericArray XNumericArray = new MWNumericArray(X);

            MWArray[] RetVal = AClass.perform(1, "test",
                "workspacePath", "workspace.mat",
                "testArray", XNumericArray);

            Array result = ((MWNumericArray)RetVal[0]).ToVector(MWArrayComponent.Real);

            return (float)result.GetValue(0);
        }
        else
        {
            return 0f;
        }
    }

Я получаю эту ошибку в Visual Studio:

... MWMCR::EvaluateFunction error ...
Undefined function or variable 'feedforwardnet'.
Error in => perform.m at line 81.

ПРИМЕЧАНИЕ: версия моего компилятора и программного обеспечения:

Компилятор: Microsoft Visual C ++ 2008 SP1 в C:\Program Files (x86)\Microsoft Visual Studio 9.0

MATLAB: R2010b (64-разрядная версия)

Visual Studio: профессиональный MVS 2008 (.NET Framework 3.5 SP1)

Microsoft Windows SDK 6.1


Недавние обновления:

Я добавил путь к нейронной сети в mcc .

eval(['mcc -N -p ''C:\Program Files\MATLAB\R2010b\toolbox\nnet'' -d ''' dnetdir ''' -W ''dotnet:dotnet,' ...
    'dotnetclass,0.0,private'' -T link:lib -v ''' mfile '''']);

Теперь я получаю этисообщения в mccExcludeFiles.log:

C: \ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ @network \ network.m

, вызываемые C:\ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ nnnetwork \ cascadeforwardnet.m (из-за правил компиляции набора инструментов)

C: \ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ @network \ network.m

, вызываемый C: \ Program Files \ MATLAB \ R2010b \ toolbox \ nnet \ nnet \ nnnetwork \ feedforwardnet.m (из-за набора инструментовправила компиляции)

1 Ответ

1 голос
/ 12 мая 2011

Единственный ответ, который я мог придумать (который не является решением проблемы), был от Создание автономного приложения, которое содержит функции набора инструментов нейронной сети , заявив, что:

Вы не сможете скомпилировать любую функцию, которая обучает сеть (например, ADAPT).Хотя в ссылке нет явного перечисления этих функций (например, ADAPT), они попадают под «Все другие функции командной строки».

Однако вы можете развернуть код функции M, который использует предварительно обученную сеть.Я полагаю, что функция SIM-карты будет развернута нормально.

Рабочий процесс, который я вижу:

  1. В MATLAB обучите вашу сеть, используя тестовый ввод / вывод
  2. Сохраните сеть(MAT-файл?)
  3. Создайте развертываемую функцию, которая затем использует предварительно обученную сеть для новых данных.Сама сеть не будет изменять / адаптировать / обучать этой функции
  4. Скомпилировать и развернуть вышеупомянутую функцию
...