Есть ли способ использовать самоорганизующуюся карту в M5Stack?

я пытаюсь запустить SOM на M5Stack, используя minisom (библиотека python для SOM), и я пробовал двумя способами:
1 — с помощью tflite;
2 — Использование UIFlow (официальная IDE для M5Stack) и Micropython.
В обоих случаях я в тупике.

1 - В первом случае я попытался сохранить и экспортировать модель как модель tflite, но проблема в том, что реализация minisom не использует tensforflow, и единственный способ, который я нашел для сохранения модели, - это использование рассола, затем я попытался преобразовать в .tflite, но запрошенный ввод представляет собой файл .pb/.pbtxt, и я не нашел способа преобразовать файл .p в .pb/.pbtxt. Я также пытался использовать различные реализации SOM с тензорным потоком, но они не работают так же хорошо, как реализация minisom, поэтому мой вопрос: есть ли способ экспортировать модель minisom как модель tflite? Или хорошая реализация тензорного потока?

2. Для второго способа я обнаружил, что можно использовать python для программирования M5Stack с использованием VSCode или UIFlow. Моя идея заключалась в том, чтобы вручную скопировать библиотеку minisom и импортировать ее из кода, что мне удалось, потому что файл minisom.py найден, но я получаю сообщение об ошибке при импорте объекта MiniSom, и я думаю, что это связано с тем, что необходимо импортировать библиотеки, которые использует minisom (например, numpy), следуя тем же рассуждениям, что я пытался скопировать numpy внутри M5Stack, но здесь возникает проблема. С VSCode и UIFlow я могу создавать или отправлять только один файл за раз, и я не могу создавать или отправлять каталоги. Единственный способ, который я нашел для нажатия каталогов, - это использовать ampy, но когда я набираю любую команду ampy из терминала, курсор мигает, и я не получаю ответа от программы. Следующим моим шагом будет копирование библиотек на карту памяти microSD и размещение ее в M5Stack. Может быть, это правильный путь? Есть ли другие способы скопировать библиотеки Python внутри M5Stack?

Для второго способа я обнаружил, что можно вручную копировать библиотеки на карту microSD и загружать их с помощью micropython, но при загрузке библиотек возникает ошибка нехватки памяти. После этого я вернулся к первому способу, и теперь я пытаюсь создать пользовательскую модель keras, следуя этому руководству: Настройка того, что происходит в fit(), но у меня есть ошибка, я перечислю свой код и покажу ошибку ниже: Это это код пользовательской модели

      import tensorflow as tf
from sklearn.metrics import classification_report
from tensorflow import keras
import numpy as np
from minisom import MiniSom


def classify(som, data, X_train, y_train):
    """Classifies each sample in data in one of the classes definited
    using the method labels_map.
    Returns a list of the same length of data where the i-th element
    is the class assigned to data[i].
    """
    y = list()
    for idx, item in enumerate(y_train):
        y.append(np.argmax(y_train[idx]))
        print("\rTrain labels transform. progress: " + str(idx + 1) + '/' + str(len(y_train)), end='')
    print()
    winmap = som.labels_map(X_train, y)
    # print(winmap)
    # input()
    default_class = np.sum(list(winmap.values())).most_common()[0][0]
    result = []
    for d in data:
        win_position = som.winner(d)
        if win_position in winmap:
            result.append(winmap[win_position].most_common()[0][0])
        else:
            result.append(default_class)
    return result


class SOMModel(keras.Model):
    def __init__(self, X_train, y_train):
        super().__init__()
        self.y_train = y_train
        self.X_train = X_train
        self.som = None

    @tf.function
    def train_step(self, data):
        # Unpack the data. Its structure depends on your model and
        # on what you pass to `fit()`.
    
        n, m, input_shape = data

        self.som = MiniSom(n, m, input_shape, sigma=5, learning_rate=0.1,
                       neighborhood_function='gaussian', activation_distance='manhattan')

        self.som.random_weights_init(self.X_train)
        self.som.train_random(self.X_train, 100, verbose=True)  # random training

        with tf.GradientTape() as tape:
            y_pred = self(self.X_train, training=True)  # Forward pass
            # Compute the loss value
            # (the loss function is configured in `compile()`)
            loss = self.compiled_loss(self.y_train, y_pred, regularization_losses=self.losses)

        # Compute gradients
        trainable_vars = self.trainable_variables
        gradients = tape.gradient(loss, trainable_vars)
        # Update weights
        self.optimizer.apply_gradients(zip(gradients, trainable_vars))
        # Update metrics (includes the metric that tracks the loss)
        self.compiled_metrics.update_state(self.y_train, y_pred)
        # Return a dict mapping metric names to current value
        return {m.name: m.result() for m in self.metrics}

    def test_step(self, data):
        X_test, y_test = data
        new_y_test = list()
        for idx, item in enumerate(y_test):
            new_y_test.append(np.argmax(y_test[idx]))
            print("\rTest labels transform. progress: " + str(idx + 1) + '/' + str(len(y_test)), end='')
        print(classification_report(new_y_test, classify(self.som, X_test, self.X_train, self.y_train)))

        y_pred = self(X_test, training=False)
        # Updates the metrics tracking the loss
        self.compiled_loss(y_test, y_pred, regularization_losses=self.losses)
        # Update the metrics.
        self.compiled_metrics.update_state(y_test, y_pred)
        # Return a dict mapping metric names to current value.
        # Note that it will include the loss (tracked in self.metrics).
        return {m.name: m.result() for m in self.metrics}

Это код, который я использую для создания пользовательской модели.

          from SOMModel import SOMModel

    model = SOMModel(X_train, y_train)
    model.compile(optimizer="adam", loss="categorical_crossentropy")
    data = 50, 50, X_train.shape[1]
    model.fit(data)
    model.evaluate(X_test, y_test)

У меня есть эта ошибка, когда вызывается model.fit():

      Traceback (most recent call last):
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 328, in <module>
    run_experiment(5)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 324, in run_experiment
    execute_minisom(trainX, trainy, testX, testy)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 241, in execute_minisom
    model.fit(data, epochs=1)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\venv\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\venv\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1233, in autograph_handler
    raise e.ag_error_metadata.to_exception(e)
tensorflow.python.framework.errors_impl.OperatorNotAllowedInGraphError: in user code:

    File "C:\Users\Scianso\PycharmProjects\UCI_HAR\venv\lib\site-packages\keras\engine\training.py", line 1160, in train_function  *
        return step_function(self, iterator)
    File "C:\Users\Scianso\PycharmProjects\UCI_HAR\SOMModel.py", line 45, in train_step  *
        n, m, input_shape = data

    OperatorNotAllowedInGraphError: Iterating over a symbolic `tf.Tensor` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.

Если я распаковываю параметры, переданные в model.fit(), у меня есть:

      Traceback (most recent call last):
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 328, in <module>
    run_experiment(5)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 324, in run_experiment
    execute_minisom(trainX, trainy, testX, testy)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\main.py", line 241, in execute_minisom
    model.fit(50, 50, X_train.shape[1], epochs=1)
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\venv\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\Scianso\PycharmProjects\UCI_HAR\venv\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 912, in __getitem__
    return self._dims[key]
IndexError: tuple index out of range

Можно ли решить эту ошибку и продолжить этот подход?

В совете спасибо за ответы.

0 ответов

Другие вопросы по тегам