X-CUBE-AI: ai_network_create_and_init() weights info required
Hi,
I'm working with X-CUBE AI.
The code seems working but I have a doubt:
status_init = ai_network_create_and_init(&network_handle, act_addr, NULL);
Is NULL parameter correct ?
Why souldn't I need to pass a pointer also for weigths like 'act_addr' ?
If it is required how am I supposed to achieve this point without occcupy other RAM space ?
(Note that inference output is actually weird, but it could be correct cause I used mockup input data to feed the network)
Please, take a look to code and log below:
....network_data_params.h....
#ifndef NETWORK_DATA_PARAMS_H
#define NETWORK_DATA_PARAMS_H
#include "ai_platform.h"
/*
#define AI_NETWORK_DATA_WEIGHTS_PARAMS \
(AI_HANDLE_PTR(&ai_network_data_weights_params[1]))
*/
#define AI_NETWORK_DATA_CONFIG (NULL)
#define AI_NETWORK_DATA_ACTIVATIONS_SIZES \
{ 306432, }
#define AI_NETWORK_DATA_ACTIVATIONS_SIZE (306432)
#define AI_NETWORK_DATA_ACTIVATIONS_COUNT (1)
#define AI_NETWORK_DATA_ACTIVATION_1_SIZE (306432)
#define AI_NETWORK_DATA_WEIGHTS_SIZES \
{ 390920, }
#define AI_NETWORK_DATA_WEIGHTS_SIZE (390920)
#define AI_NETWORK_DATA_WEIGHTS_COUNT (1)
#define AI_NETWORK_DATA_WEIGHT_1_SIZE (390920)
#define AI_NETWORK_DATA_ACTIVATIONS_TABLE_GET() \
(&g_network_activations_table[1])
extern ai_handle g_network_activations_table[1 + 2];
#define AI_NETWORK_DATA_WEIGHTS_TABLE_GET() \
(&g_network_weights_table[1])
extern ai_handle g_network_weights_table[1 + 2];
#endif /* NETWORK_DATA_PARAMS_H */
//.........
//Global Variables
ai_handle network_handle;
ai_buffer * ai_input;
ai_buffer * ai_output;
AI_ALIGNED(4) ai_u8 activations[AI_NETWORK_DATA_ACTIVATIONS_SIZE];
ai_float patches[AI_NETWORK_IN_1_SIZE]; // Singola patch da passare alla rete
ai_float inference_result[AI_NETWORK_OUT_1_CHANNEL];
//..........
void run_neural_network(void) {
ai_error status_init;
ai_i32 status_run;
// Local activations array
const ai_handle act_addr[] = { activations };
// Init network after creation
status_init = ai_network_create_and_init(&network_handle, act_addr, NULL);
if (status_init.type != AI_ERROR_NONE) {
send_uart_message("Network creation and initialization failed.\r\n");
return;
}
ai_input = ai_network_inputs_get(network_handle, NULL);
ai_output = ai_network_outputs_get(network_handle, NULL);
ai_input[0].data = AI_HANDLE_PTR(patches); // Dati di input sono le patch (già in forma 128x32x1)
ai_output[0].data = AI_HANDLE_PTR(inference_result);
// Process Inference
status_run = ai_network_run(network_handle, ai_input, ai_output);
if (status_run <= 0 ) {
sprintf(uart_buffer, "Inference failed. Input size: %lu, Status: %ld\r\n", ai_input[0].size, status_run);
send_uart_message(uart_buffer);
ai_error error = ai_network_get_error(network_handle);
sprintf(uart_buffer, "Error type: %d, Code: %d\r\n", error.type, error.code);
send_uart_message(uart_buffer);
return;
}
send_uart_message("Inference SUCCESS!!!\r\n");
// Extract result
float32_t* result = (float32_t*)ai_output[0].data;
// Send results by uart
sprintf(uart_buffer, "Inference result: %f\r\n", result[0]);
send_uart_message(uart_buffer);
// Debug
for (uint32_t i = 0; i < AI_NETWORK_OUT_1_CHANNEL; i++) {
sprintf(uart_buffer, "Output[%lu]: %f\r\n", i, result[i]);
send_uart_message(uart_buffer);
}
// Destroy Network
ai_network_destroy(network_handle);
}
//....Log...
Ricevuto: Inference SUCCESS!!!.
Ricevuto: Inference result: 0.000000
Ricevuto: Output[0]: 0.000000
Ricevuto: Output[1]: 1.000000
Ricevuto: Process completed.
