92817


SpresenseとTensorflowliteを用いて畳み込みオートエンコーダーのエンコーダー側をSpresenseに実装しようとしています。  
その際interpreter->AllocateTensors()でテンソルを割り当てた時にbad statusが返ってきます。

[code]

    constexpr int kTensorArenaSize = 900000;
    uint8_t tensor_arena[kTensorArenaSize];
    
    void setup() {
      Serial.begin(115200);
      tflite::InitializeTarget();
      memset(tensor_arena, 0, kTensorArenaSize*sizeof(uint8_t));
      
      // Set up logging. 
      static tflite::MicroErrorReporter micro_error_reporter;
      error_reporter = &micro_error_reporter;
      
    
[/code]

…

[code]

      // This pulls in all the operation implementations we need.
      static tflite::AllOpsResolver resolver;
      
      // Build an interpreter to run the model with.
      static tflite::MicroInterpreter static_interpreter(
          model, resolver, tensor_arena, kTensorArenaSize, error_reporter);
      interpreter = &static_interpreter;
      
      // Allocate memory from the tensor_arena for the model's tensors.
      TfLiteStatus allocate_status = interpreter->AllocateTensors();
      if (allocate_status != kTfLiteOk) {
        Serial.println("AllocateTensors() failed");
        return;
      } else {
        Serial.println("AllocateTensor() Success");
      }
    
[/code]

エンコーダーのモデルは20*20のRGB画像の畳み込みを行っており、TFliteを.hに変換したものを使用しています。.hのサイズは25KBでした。また、エンコーダーを全結合のみで構成したところ動作しましたし、こちらのエンコーダーよりもサイズの大きな畳み込みNNの推論も動作しています  
[![エンコーダーのモデル](https://i.stack.imgur.com/kPiyN.png)](https://i.stack.imgur.com/kPiyN.png)

また、Spresense側はメインメモリに1536KBを割り当てています  
そこまで大きなメモリ消費をしないモデルなのでメモリが足りないことによるエラーではないと思いますが、それ以外の原因をつかみかねています

エラーの原因や解決策がわかりますでしょうか


CC BY-SA 4.0
2022-12-15T15:20:58.887
92808
2023-01-23T03:04:06.800
2022-12-16T04:34:52.833
-1
56026
question
spresense tensorflow
SpresenseとTFliteでinterpreter->AllocateTensors()を行ったとき失敗する


実際に動かしてみたわけではないので、見当違いかもしれませんが、ネットワークの規模に対して、TensorArenaSize が 900kB
確保されており、かなり大きいように感じました。

TensorArenaSize の値をもっと少なくして、試してみてはどうでしょうか？ AllocateTensors
がうまく通れば、そのあとは、interpreter->arena_used_bytes() で TensorArena
がどれだけ消費しているかわかるので、さらに適切な値を設定することができると思います。


CC BY-SA 4.0
2022-12-16T09:28:14.023
92817
2022-12-16T09:28:14.023
27334
92808
answer


さらに確認したところ活性化関数にSelu等を用いると割り当てに失敗するようです。（メモリの大量消費？）  
基本的に **活性化関数にはReluを用いた** ほうがよさそうです


CC BY-SA 4.0
2023-01-23T02:55:20.057
93515
2023-01-23T03:04:06.800
2023-01-23T03:04:06.800
56026
56026
92808
answer