ニューラルネットワー​クのC++共有ライブ​ラリ化について

feedforwardnet関数をしようして機械学習のプログラムを作成したのですが、これによって出力されたnetworkオブジェクトを使用したプログラムをライブラリコンパイラによってC++共有ライブラリに変換することは可能でしょうか。
現在、MATLABで行った機械学習をC++で利用できるようなプログラムを開発しています。
compiler.build.cppSharedLibrary関数を使用してC++共有ライブラリ化をやろうとしたのですが、networkオブジェクトを呼び出す部分でエラーが発生してしまい、うまくライブラリ化することができませんでした。
ご回答のほうをよろしくお願いします。

2 Comments

Kojiro Saito
Kojiro Saito on 1 Oct 2023
networkオブジェクトを呼び出すのもC++ライブラリに変換可能(MATLAB Compiler SDKが対応している関数)なので、呼び出し方に何か原因がありそうです。
エラーメッセージと、該当部分のコード抜粋を開示いただけますか?
Hiroki
Hiroki on 6 Oct 2023
Moved: Kojiro Saito on 6 Oct 2023
<Call_testing2.m>
function K = Call_testing2(Data)
K=ANNmethod(Data);
<ANNmethod.mat> 機械学習によって出力された.mat機械学習ファイル
この二つのファイルを以下の二つのコンパイルをしましたが以下のようなエラーが出ました。
>> buildResults = compiler.build.cppSharedLibrary(Call_testing2)
入力引数が不足しています。
エラー: Call_testing2 (行 11)
K=ANNmethod(Data);
>> buildResults = compiler.build.cppSharedLibrary(opnet.mat)
SWITCH 式は、スカラーか文字ベクトルでなければなりません。
エラー: インデックス (行 173)
switch (subs)
ご回答のほうをよろしくお願いします。

Sign in to comment.

Answers (1)

Kojiro Saito
Kojiro Saito on 6 Oct 2023

0 votes

2点あります。
(1) matファイルの読み込み
Call_testing2.mの処理の中でmatファイルを読み込む処理がないため、ANNmethodが存在しないというエラーが出てしまいます。load('ANNmethod.mat')を追加してください。
function K = Call_testing2(Data)
load('ANNmethod.mat')
K=ANNmethod(Data); % ANNmethod.mat 機械学習によって出力された.mat機械学習ファイル
end
(2) compiler.build.cppSharedLibraryの使い方について
入力引数は文字列なので、
compiler.build.cppSharedLibrary(Call_testing2)
ではなく
compiler.build.cppSharedLibrary('Call_testing2.m')
となります。
また、処理に使うmatファイルはcompiler.build.cppSharedLibraryを実行する必要がありません。コンパイルするのは、メインとなる関数(.mファイルまたは.mlxファイル)だけです。
compiler.build.cppSharedLibraryが自動的にファイルの依存関係を見て.matファイルなどをコンパイルに取り込んでくれますが、うまく行かない場合はAdditionalFilesのオプションで手動で追加することもできます。
compiler.build.cppSharedLibrary('Call_testing2.m', 'AdditionalFiles', 'ANNmethod.mat')
コマンドを使わず、GUIからもできます。アプリタブにある「ライブラリコンパイラー」をクリックして、タイプを「C++共有ライブラリ」にし、エクスポートする関数で「'Call_testing2.m」をファイル選択します。「パッケージ化」】ボタンを押せば自動的にコンパイルされます。

8 Comments

Hiroki
Hiroki on 9 Oct 2023
ありがとうございます。教えていただいた方法で、無事C++共有ライブラリ化することができました。追加で一件質問がございます。このライブラリを利用して開発したC++プログラムを複数のデバイスやアカウントで使用することを想定しているのですが、このC++プログラムの開発に使用した.ctfファイルやlibMatlabCppSharedLib.lib等のlibファイルにはライセンスが必要でしょうか。
Kojiro Saito
Kojiro Saito on 9 Oct 2023
コンパイルして作成された.ctfファイルや.dll、またビルドや実行時に必要なlibMatlabCppSharedLib.libファイルなどはMATLABのライセンスが不要です。
MATLABインストール時にインストールフォルダーに格納されるlicense_agreement.txtというファイルの「Part Two: Deployment Rights 」の「1. Deployment Rights for User Files」などに詳細が書かれています。
.ctfファイルや.dllは配布するもので、libMatlabCppSharedLib.libなどは実行環境にMATLAB Runtimeをインストールすると「<MATLAB Runtimeのインストールフォルダー>\extern\lib\win64」に格納されるファイルを使用しますので、Runtimeの一部です。
Hiroki
Hiroki on 23 Oct 2023
ありがとうございます。
追加で一件質問失礼致します。サンプルコードをVisualStudioで実行しようとしたところ、
cppsharedlib_factory_impl.hppというファイル内の下線部の行で、写真のようなエラーが出てきて困っているのですが、もし解決法が分かるのであれば教えていただきたいです。よろしくおねがいします。
namespace {
std::once_flag sessionFlag;
static std::atomic<bool> initialized(false);
static std::atomic<bool> terminated(false);
bool init(const std::vector<std::u16string>& options) {
try{
std::vector<char16_t*> options_v(options.size());
std::transform(options.begin(), options.end(), options_v.begin(), [](const std::u16string& option){ return const_cast<char16_t*>(option.c_str()); });
runtime_create_session(options_v.data(), options_v.size());
}
catch (...) {
// not much we can do here.
}
return true;
}
Kojiro Saito
Kojiro Saito on 30 Oct 2023
Visual Studioでのインクルードフォルダーやリンカーの設定などがうまくいっていないように思えます。
ドキュメント「サンプル ドライバー ファイルの作成」を参考に、共有ライブラリを呼び出すCPPファイルを作成し、mbuildコマンドでビルドしてVisual Studioで必要な設定を確認してみてください。
compiler.build.cppSharedLibrary('Call_testing2.m', 'AdditionalFiles', 'ANNmethod.mat', 'SampleGenerationFiles', "sample1.m")
sample1.mの例
Data = xxx; % 入力データを何か設定する
K = Call_testing2(Data); % Call_testing2を呼び出す
samplesフォルダーにcppファイル(ファイル名の例:sample1_mda.cpp)が作成されるので、それをmbuildでビルドするとVisual Studioで必要な情報(INCLUDEやLINKLIBSなど)が確認できますので、これをVisual Studioのプロジェクトに設定すれば実現可能です。
mbuild sample1_mda.cpp -v
Hiroki
Hiroki on 1 Nov 2023
ありがとうございます。
mbuild sample1_mda.cpp -v
によってVisualStudioに必要な情報は確認できました。
追加でご質問ですが、これを実行する際、プログラムを実行する際、以下のようなエラー分がmbuildで実行しても、VisualStudioで実行しても出てきてしまうのですが、どのように対処すればよいでしょうか。
*下の出力がされたプログラムでは、ANNmethodの代わりにopnet、Call_testing2のかわりにCall_testing4という名前で実行しています。
⸮⸮: ⸮⸮⸮ 'network' ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ 'loadobj' ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ 'opnet' ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
> Call_testing4 (⸮ 5) ⸮
⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮ logical ⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
⸮⸮⸮: Call_testing4 (⸮ 7)
Kojiro Saito
Kojiro Saito on 1 Nov 2023
エラーメッセージの日本語が文字化けして原因の特定が難しいので、デスクトップコードフォントを「Monospaced」などに変えてエラーが読めるようにしていただけますか。
Hiroki
Hiroki on 5 Nov 2023
文字化けの件は現在確認しております。
追加でご質問が2点ございます。
一つ目は、MATLABC++共有ライブラリはVisualStudio32bitの環境下で使用することは可能でしょうか。
二つ目は、現在質問しているプログラムをMATLABCoderでC++に変換して使用することは可能でしょうか。こちらについて、実際にやってみたのですが、load関数の部分でエラーが発生してしまいます。
ご回答よろしくお願いします。
Kojiro Saito
Kojiro Saito on 6 Nov 2023
  • C++共有ライブラリは64bitのみのライブラリのみ作成できます。
  • MATLAB CoderでC++に変換することは可能ですが、loadの出力を変数に代入したりgenFunctionでCコード生成に対応する関数を作成したりなどのステップが必要になります。
ただ、追加の質問は本質問の当初の内容から離れてきているので、新規の質問として別スレッドにしたほうが良いです。

Sign in to comment.

Categories

Find more on MATLAB Compiler SDK in Help Center and File Exchange

Asked:

on 29 Sep 2023

Commented:

on 6 Nov 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!