sota1111さん、こんばんは。ソースを拝見しました。
m5stack S3を検索しましたが、ワンチップマイコン(?)なのですね?
つまりpythonのnnablaで学習させ、学習済みモデルのファイル(.nnp)をC++を使ってコンパイルし、m5stack S3上で動かすという認識で合っているでしょうか?
そして前提条件としてm5stack S3はloop関数がメインと言う事で宜しいでしょうか。
当方、NNCしか使った事が無く、nnablaもm5stack S3(のC++ライブラリ)も使った事はありませんが、C++や組み込みのプログラミング経験はあります。もしかすると的外れかも知れませんが、ちょっと気になった点を幾つか書かせて頂きます。
CSVファイルの情報が見当たらず、下記が意図通りなのか分からなかったので。
1.CSVファイルの1行目だけ読み込んでますが、読み込むのは1行目だけで良いのでしょうか?(CSVにヘッダ行はある?)
2.一つ推論したらNNコンテキストを解放していますが、CSVファイルは複数あるのでしょうか?
3.ローカル変数でchar csvBuffer[]を確保していますが、データサイズはスタックのサイズ内なのでしょうか?
4.正規化部分((atof(token)-2048.0)/2048.0)で2048を引いていますが、CSVファイル中の値の範囲は0~4096で良いのでしょうか?
5.atofはdoubleを返しますが、nn_input_buffer[index]への代入はdoubleで宜しいでしょうか?
6.コードを見るとCSVファイルの時だけcloseしてませんが、これは意図的でしょうか?
色々と書きましたが、怪しそうなのは1番でしょうか。
的外れだったら申し訳ありません。
以降はmain.cppを拝見して「私的にはこうした方が見やすいと思う」と感じた点を老婆心ながら書かせて頂きます。
私のコーディング上の好みなのでお気を悪くされたら申し訳ありません。
1.処理しない部分は先に除外する。
// ディレクトリの場合は無視、
if (file.isDirectory()) {
file.close(); // ディレクトリの場合は閉じる
continue;
}
// CSVファイルでない場合も同様に無視
if (!filename.endsWith(".csv")) {
file.close(); // .csv でないファイルは閉じる
continue;
}
・・・以下、CSVファイルの時の処理
こうした方がインデントが浅くて済みますし、「ここから先は全部CSVの時の処理」と切り分けできるので読みやすくなると思います。
2.CSV行を解析して各値を入力バッファに格納する処理の部分ですが、この場合はfor文の方がすっきりすると思います。
// strtok を使うために、String を char 配列に変換
char csvBuffer[csvLine.length() + 1];
csvLine.toCharArray(csvBuffer, csvLine.length() + 1);
char *token = strtok(csvBuffer, ",");
// CSV行を解析し、各値を入力バッファに格納
for( int index = 0; token != NULL && index < NNABLART_VALIDATION_INPUT0_SIZE; index++ ) {
nn_input_buffer[index] = (atof(token)-2048.0)/2048.0; // 文字列を float に変換して代入
token = strtok(NULL, ",");
}
2025年3月21日金曜日 12:37:20 UTC+9 sota1111: