C++での二次元配列を入力としたCNNの推論時のエラーについて

585 views
Skip to first unread message

sakura.man...@gmail.com

unread,
Apr 16, 2018, 4:47:45 AM4/16/18
to Neural Network Console Users (JP)
こんちには。

Neuraul network consoleを用いて8 x 120の行列を入力としたCNNの学習を行いました。
学習自体はうまく言ったのですが、C++から学習結果を利用し、推論しようとすると例外が発生してしました。

詳しくは下記のような状況となっております

----------------
○ネットワーク構成(neural network console側)

○ネットワークファイル
添付のnet2.nntxtファイル

○nnpファイル
パラメータファイルparameters.h5を
jupyter Qt consoleからnnablaのload_parameters関数とsave_parameters関数を
用いてprotobufファイルに変換した後、上記のネットワークファイルと合わせてzip
に固めたものを使用

○C++側ソースコード

try{
  nbla::Context context{ "cpu", "CpuCachedArray", "0", "default" };
  nnp::Nnp nnp(context);
  nnp.add("上記のnnpファイル");
  shared_ptr<nnp::Executor> executor = nnp.get_executor("Executor");
  shared_ptr<nnp::Network> network = executor->get_network();
  cout << "network : " << network->name() << endl;

  executor->set_batch_size(1);

  nbla::CgVariablePtr x = executor->get_data_variables().at(0).variable; //ここで例外が発生

}catch(nnabla::Exception e){
  cout << e.what();
}

○発生した例外

value error in nbla::Convolution<float>::setup_impl
C:\Users\XXXX\nnabla\src\nbla\function\convolution.cpp:47
Failed `shape_weights.size() == 2 + spatial_dims_`: Weights must be a tensor more than 3D.

○ソフトのバージョン
neural network console
1.1.6519.49966

nnabla
masterブランチ14e03893ceca91cb8aa122b147acff8b4882865aのソースからビルド

-------------------

例外の内容を見るにConvolutionへ入力を渡す前のReshapeがneural network consoleから正しく出力できていないのではないかと思います。
以前のトピックでneural network consoleの学習データをPythonで出力する際にはReshapeのコードの修正が必要だとの記載がありましたが、
C++で推論する場合にもネットワークファイルなどの修正が必要なのでしょうか?

初歩的な質問かもしれず恐縮ですが、どなたかご存知の方がいらっしゃればご回答いただければ幸いです。




net2.nntxt

sakura.man...@gmail.com

unread,
Apr 19, 2018, 6:56:46 AM4/19/18
to Neural Network Console Users (JP)
すみません。ネットワーク構成の図がうまく貼れていませんでした。 


小林由幸

unread,
Apr 19, 2018, 7:56:35 AM4/19/18
to Neural Network Console Users (JP)
こちらは修正が必要かもしれません。
少しこちらで調べてみますので、今しばらくお待ちください。

もしご指摘の点が原因だとすると
nntxtファイルをテキストエディタで開き、全てのreshape functionについて


    reshape_param {
      shape
: { dim: 1 dim: 8 dim: 120 }
   
}


    reshape_param {
      shape
: { dim: bs dim: 1 dim: 8 dim: 120 }
   
}

※bsにはバッチサイズを値で指定

とすることで正しく動作する可能性があります。

sakura.man...@gmail.com

unread,
Apr 21, 2018, 9:35:52 PM4/21/18
to Neural Network Console Users (JP)
ご回答ありがとうございます。


もしご指摘の点が原因だとすると
nntxtファイルをテキストエディタで開き、全てのreshape functionについて


    reshape_param {
      shape
: { dim: 1 dim: 8 dim: 120 }
   
}


    reshape_param {
      shape
: { dim: bs dim: 1 dim: 8 dim: 120 }
   
}


とのことだったのでnntxtファイルを見てみたのですが、既にreshapeは三次元の表記になっておりました(バッチサイズは-1でした)

しかし、 nntxtファイルを読んでいる途中で、
どうせC++側では変数の先頭ポインタしか受け取らないし、実際の配列の要素数は同じなのだからreshape自体をなくしてみたら良いのでは?
と考え、nntxtファイルからreshape層を全て無くし、Input層の次元数を直接書き換えてnnpファイルを作り直してみたところ動作するようになりました。
まだ、推論結果がちゃんと同じものが取得できているかどうかはテストできていないですが、ひとまず例外がはかれることはなくなりました。

今回はnntxtからreshape層をなくし、Input層の次元数を変更しましたが、学習パラメータファイルは以前のものをそのまま使ってnnpファイルを作りました。
この方法は問題ないでしょうか?恥ずかしながらh5やprotobufといった形式について全く見識がないもので、各層にちゃんと学習パラメータが変更されるのかどうかが判断できませんでした。
もし、このあたりもご存知でしたらご回答いただければ幸いです。

小林由幸

unread,
Apr 27, 2018, 3:35:12 AM4/27/18
to Neural Network Console Users (JP)
> とのことだったのでnntxtファイルを見てみたのですが、既にreshapeは三次元の表記になっておりました(バッチサイズは-1でした)

そういうことであれば、この-1を推論時のバッチサイズの実際の値に置き換えるのがよいかと思います。

> この方法は問題ないでしょうか?恥ずかしながらh5やprotobufといった形式について全く見識がないもので、各層にちゃんと学習パラメータが変更されるのかどうかが判断できませんでした。

テンソルのshapeが合っていないことになるため将来のバージョンで正しく動作し続けるかどうかは分かりませんが、現状で正しく推論が出来ている可能性が高いかと思います。
Neural Network Consoleではh5、protobufファイルには学習された重み係数が格納されています。
いずれもパラメータ名と実際のパラメータ(バイナリ)が紐づけられた形で保存されます。
推論時にはnntxtに記述されているパラメータ名を持つパラメータがこれらのファイルから読み込まれ、計算に用いられます。

Reply all
Reply to author
Forward
0 new messages