Есть ли способ использовать самоорганизующуюся карту в 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
Можно ли решить эту ошибку и продолжить этот подход?
В совете спасибо за ответы.