Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨,
我正在使用 Keras 模型進行 Python 中的編號圖像分類。
https://keras.io/examples/vision/mnist_convnet/

這是眾所周知的例子。 這些影像為 (28,28) 個灰階影像。 我有 .h5 和 .tflite 模型。 輸入是使用 Python 腳本從 JPG 文件轉換的 C 數組。

問題:我的 PSoc6 評估板 (CY8CKIT-062S2-43012) 使用量化時得到了錯誤的分類結果。
我遵循了 ModusToolbox™ 機器學習使用者指南,並使用了 ModusToolbox 中的「ML 配置器」。
我還遵循了「機器 _ 學習 _ 手勢 _ 分類」示例,並從這個項目中複製了一些重要部分。

我有一個解決方法。 當我量化輸入本身時。 在這種情況下,我們不需要調用「mtb_ml_utils_模型 _量」。 然而,這是非常不尋常的。 在這種情況下,一切都可以。 在「量化 _ 輸入 = 1」時,main.c 中的情況就是這樣

我錯過了什麼? 問題可能是什麼?

我已經附加了 Makefile 和 main.c

 

1 解決方案
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

這是在 mtb_ml_utils.c 中的量化實現 :

cy_rslt_t mtb_ml_utils_model_quantize(const mtb_ml_model_t *obj, const float* input_data, MTB_ML_DATA_T* quantized_values)
{
    if (obj == NULL || input_data == NULL || quantized_values == NULL) {
        return MTB_ML_RESULT_BAD_ARG;
    }

#if !defined(COMPONENT_ML_FLOAT32)
    int32_t size = obj->input_size;
    const float *value = input_data;
#if defined(COMPONENT_ML_IFX)
    return mtb_ml_utils_convert_flt_to_int(value, quantized_values, size, obj->input_q_n);
#else
    return mtb_ml_utils_convert_tflm_flt_to_int8(value, quantized_values, size, obj->input_scale, obj->input_zero_point);
#endif
#else
    return MTB_ML_RESULT_SUCCESS;
#endif
}

 

因為在你的 Makefile 中:

NN_INFERENCE_ENGINE=tflm

 

它將跳入 " #else",調用 " mtb_ml_utils_convert_tflm_flt_to_int8(),然後在其中由於未定義的 MTB_ML_HAVING_CMSIS_DSP,實現將是:"
""

    loop_count = size;
    while (loop_count > 0)
    {
        val = (*in++ / scale) + zero_point;
        val += val > 0.0f ? 0.5f : -0.5f;
        if ((int32_t) val > SCHAR_MAX)
            *out++ = SCHAR_MAX;
        else if ((int32_t) val < SCHAR_MIN)
            *out++ = SCHAR_MIN;
        else
            *out++ = (int8_t) (val);

        loop_count--;
    }

 

與您自己的實施有所不同。

我可以建議的是,在學習測試之間使用相同的算法和數據類型。
如果您使用實現與學習/培訓匹配,則可以。 🙂

謝謝你和問候,
穆罕默德·南達

在原始文章中檢視解決方案

0
6 回應
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

感謝您的查詢。 🙂

這個問題正在內部討論中。
我們可能會盡快與您聯繫。

對於任何不便,我深表歉意。

謝謝你和問候,
穆罕默德·南達

0
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

對不起,只是想澄清,
你在訓練中也使用量化嗎?
由於數據集輸入應該在訓練/學習階段和測試階段之間相同。

謝謝你和問候,
穆罕默德·南達

0
Translation_Bot
Community Manager
Community Manager
Community Manager

輸入資料類型指定錯誤。 我已經修復了浮動,我也有一個新的 img_array.c 檔案。 不幸的是,解決這個問題後,結果仍然不好。 我會嘗試直接將應用程序鏈接到 libtensorflow-microlite.a,並避免調用「mtb_ml_utils_model_quantize」,但 libtensorflow-microlite.a 無法鏈接,因為 lib 文件中有一個「主」條目(正如我今天發布的那樣)

當我用我自己的量化函數替換 'mtb_ml_utils_model_量化' 時,結果是 OK 的。 這兩個功能不一樣?

void quantize_input(mtb_ml_model_t *my_model_obj, float* src, int8_t* dest)
{
	for (int i=0; iinput_size; i++) {
 	 float x = src[i];
     int8_t x_quantized = x / my_model_obj->input_scale + my_model_obj->input_zero_point;
     dest[i] = x_quantized;
	}
}

 

0
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

這是在 mtb_ml_utils.c 中的量化實現 :

cy_rslt_t mtb_ml_utils_model_quantize(const mtb_ml_model_t *obj, const float* input_data, MTB_ML_DATA_T* quantized_values)
{
    if (obj == NULL || input_data == NULL || quantized_values == NULL) {
        return MTB_ML_RESULT_BAD_ARG;
    }

#if !defined(COMPONENT_ML_FLOAT32)
    int32_t size = obj->input_size;
    const float *value = input_data;
#if defined(COMPONENT_ML_IFX)
    return mtb_ml_utils_convert_flt_to_int(value, quantized_values, size, obj->input_q_n);
#else
    return mtb_ml_utils_convert_tflm_flt_to_int8(value, quantized_values, size, obj->input_scale, obj->input_zero_point);
#endif
#else
    return MTB_ML_RESULT_SUCCESS;
#endif
}

 

因為在你的 Makefile 中:

NN_INFERENCE_ENGINE=tflm

 

它將跳入 " #else",調用 " mtb_ml_utils_convert_tflm_flt_to_int8(),然後在其中由於未定義的 MTB_ML_HAVING_CMSIS_DSP,實現將是:"
""

    loop_count = size;
    while (loop_count > 0)
    {
        val = (*in++ / scale) + zero_point;
        val += val > 0.0f ? 0.5f : -0.5f;
        if ((int32_t) val > SCHAR_MAX)
            *out++ = SCHAR_MAX;
        else if ((int32_t) val < SCHAR_MIN)
            *out++ = SCHAR_MIN;
        else
            *out++ = (int8_t) (val);

        loop_count--;
    }

 

與您自己的實施有所不同。

我可以建議的是,在學習測試之間使用相同的算法和數據類型。
如果您使用實現與學習/培訓匹配,則可以。 🙂

謝謝你和問候,
穆罕默德·南達

0
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

對不起,我只是想跟進 🙂
您可以更新此問題的狀態嗎?

謝謝你和問候,
穆罕默德·南達

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/ML-problem-with-the-MNIST-number-classification-model/m-p/642648

0
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @jsmith678x

由於您將答案標記為解決方案,因此我將繼續鎖定此討論線程。

如果您將來有任何其他問題,請不要猶豫創建新的線程。 🙂

謝謝你和問候,
穆罕默德·南達

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-6/ML-problem-with-the-MNIST-number-classification-model/m-p/643795

0