Как использовать функцию Arm CMSIS-NN Softmax для встроенного машинного обученияPython

Программы на Python
Ответить
Anonymous
 Как использовать функцию Arm CMSIS-NN Softmax для встроенного машинного обучения

Сообщение Anonymous »

Я пытаюсь понять, как использовать функцию CMSIS-NN Softmax для 16-битных входных данных со знаком. https://github.com/ARM-software/CMSIS-N ... tmax_s16.c.
Arm CMSIS-NN предоставил пример входных данных и ожидаемые выходные данные здесь (https://github.com/ARM-software/CMSIS-N ... oftmax_s16) в их тестовом примере.
Изначально мой первое впечатление было, что я не смогу это использовать коробки, потому что когда я смотрю на данные конфигурации тестовых случаев (https://github.com/ARM-software/CMSIS-N ... fig_data.h), Я вижу два параметра конфигурации softmax_s16_input_mult и softmax_s16_input_left_shift, которые я не совсем понял.
Кроме того, в тестовом примере кажется, что они обращаются к экспоненте посмотреть таблицу (https://github.com/ARM-software/CMSIS-N ... lut_data.h) и поочередную таблицу поиска (https://github.com/ARM-software/CMSIS-N ... lut_data.h). Я также изучил это (например, таблицу экспоненциального поиска), которая, по-видимому, получается путем равномерного создания значений от -10 до 0, а затем для каждой точки они вычисляют e^x и масштабируют его от [2^1 до (2^15)-1].
Я покопался еще немного и нашел здесь (https://github.com/ARM-software/CMSIS-N ... ettings.py), что input_scale, который используется для генерации параметров конфигурации softmax_s16_input_mult и softmax_s16_input_left_shift — параметр по умолчанию. Итак, один вопрос, который меня интересует: для моего варианта использования мне нужно будет использовать разные softmax_s16_input_mult и softmax_s16_input_left_shift или я могу просто получить отказаться от использования этого множителя «по умолчанию» и предоставленного сдвига.
Например, для моего варианта использования у меня есть 16-битный входной сигнал,

Код: Выделить всё

#include 
static const int16_t logits[15] = {2019, 4958, 1855, -230, -7992, 1396, -1919, 2611, 658, 3588, 885, -4759, 3426, 1348, 5906};
Я предполагаю, что мне нужно создать собственную таблицу экспоненциального поиска и таблицу поиска one_by_one (т. е. одну, масштабированную от [-2^15 до (2^15) - 1]. Для экспоненциальной , я делаю это, используя эту функцию ниже

Код: Выделить всё

    def get_s16_exp_lut(input_range : list[int, int], num_vals : int, num_bits: int) -> np.array:
"""
Takes in the specificed input range and the specified number of entries from CMSIS,
and computes the exponential of each point and scales it to num_bits range.

Example
--------
exp_lut = get_s16_exp_lut([-10, 0], 513, 16)
"""

in_arr = np.linspace(input_range[0], input_range[1], num_vals)
exp_in_arr = np.exp(in_arr)
min_val = -2**(num_bits-1)
max_val = 2**(num_bits - 1) - 1
normalised_exp = (exp_in_arr - np.min(exp_in_arr)) / (np.max(exp_in_arr) - np.min(exp_in_arr))
scaled_exp = normalised_exp * (max_val - min_val) + min_val
exp_lut_arr = np.round(scaled_exp).astype(np.int16)
return exp_lut_arr
и я могу легко изменить это для случая one_by_one.
Мой главный вопрос: могу ли я обойтись без используя предоставленные softmax_s16_input_mult и softmax_s16_input_left_shift, или мне нужно выяснить входной сдвиг влево и множитель для моего случая, и если да, то что бы вы предложили Я так и сделаю (если это поможет, пример ввода бита S16, которым я поделился выше, был получен с использованием этой библиотеки (https://github.com/francof2a/fxpmath). При этом после ручного выполнения всех операций на каждом уровне моего модели, окончательный результат (то есть логиты) представляет собой дробный объект с фиксированной запятой, который имеет в общей сложности 16 бит, из которых 9 бит выделены для дробной части моих данных, 6 бит выделены для целого числа и 1 бит для знака. Если эта информация поможет определить входной множитель и/или сдвиг влево, это будет полезно.)?
В общем, правильно ли я говорю, для моего использования. В этом случае мне понадобится
  • Экспоненциальная таблица поиска [-2^15, 2^15-1]
  • А [-2^15, 2^15-1] Таблица поиска one_by_one
  • Входной множитель
  • Ввод смещения влево
или могу ли я обойтись без использования доступного входного множителя и ввода левого сдвига?
PS: Я знаю, что это нестандартный тип вопросов на этом форуме, и я пытался задать их на других форумы, например (субреддит Arm), но я получаю ответы, которые можно использовать chatgpt и т. д., что бесполезно. Я очень надеюсь, что кто-нибудь здесь сможет помочь, но если есть более конкретный форум, где я могу задать этот вопрос, это тоже будет полезно.

Подробнее здесь: https://stackoverflow.com/questions/792 ... mbedded-ml
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»