AlanSbor 0 August 17 Posted August 17 · Report post Добрый вечер ! Получил немного данных при чтении с ридера NFC Все ключи были считаны и сохранены после очередного использования. Проблема в том что этих данных очень мало, порядка 45 уникальных значений. Данных мало, потому что раньше их никто не собирал до кризиса, а тут случилось. Обучение нейронок проводилось с учителем. Задавались входа, данные разделялись и нормировались, входной слой, пара скрытых и выходной. На входе порядка 40 hex символов, на выходе 4 hex символа. Простая сеть точностью не радовала, всегда выше 0,89, что практически никакой точности. Смысл в том что после использования карточки-ключа записывалась дата использования и 4 hex байта как контрольная сумма. Соответственно карточка-ключ имеет срок годности, если только не вписать правильные новые даты инициализации карты. В итоге имеется (для справки) key = '0481B7BAD25B6280' UID карты-ключа date1 = '1308E5071905E707' две даты, из которых первая дата активации карты, а вторая дата предыдущая дата использования карты date2 = '1308E5071606E707' тоже две даты, из которых первая дата активации карты, а вторая дата последняя дата использования карты Контрольные суммы выглядят вот так для date1 : 00001827 для date2 : 00003CE7 Я пробовал в лоб, пробовал хеширование, XOR в разных вариантах. На выходных пробовал CRC16 с разными полиномами, ни сходится аленький цветочек. Пробовал простые нейронки, результат тоже нулевой. Может кто имел положительный опыт с таким малым количеством данных или работал с подобными NFC системами , подскажите пожалуйста куда копать дальше ? Share this post Link to post Share on other sites More sharing options...
Мур 1 August 19 Posted August 19 · Report post Есть вариант улучшения ситуации. Провести ревизию данных на предмет критичности факторов при помощи регрессионного анализа , чтобы убедится в правильности принятого выбора факторов на входе NN. Далее начните вводить дополнительные факторы (тут надо крепко вникнуть в возможные, пока не учтенные данные совершенствуемой модели) и тем же регрессионным анализом определите степень участия нового вашего канала. ...Вы должны знать, что NN не обеспечивают 100% точность выхода. Архитектурно будьте готовы к тому, что придется усложнять сеть, но это потребует высоких временных затрат на прогонах вариантов. Теории построения NN не существует. Это пока эмпирическая и во много м интуитивная магия. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 August 20 Posted August 20 · Report post В 19.08.2023 в 20:30, Мур сказал: Есть вариант улучшения ситуации. Провести ревизию данных на предмет критичности факторов при помощи регрессионного анализа , чтобы убедится в правильности принятого выбора факторов на входе NN. Далее начните вводить дополнительные факторы (тут надо крепко вникнуть в возможные, пока не учтенные данные совершенствуемой модели) и тем же регрессионным анализом определите степень участия нового вашего канала. ...Вы должны знать, что NN не обеспечивают 100% точность выхода. Архитектурно будьте готовы к тому, что придется усложнять сеть, но это потребует высоких временных затрат на прогонах вариантов. Теории построения NN не существует. Это пока эмпирическая и во много м интуитивная магия. Попробую тогда Метод расчета весов входов в нейронной сети Метод "leave one out" - удаление факторов по одному и смотреть изменение метрик Линейную регрессию и анализ значимости коэффициентов Понятно что займет время, но есть хотя бы варианты. Спасибо за направление. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 August 22 Posted August 22 · Report post Одна из 10 пробных сеток дала точность не выше 45 процентов, что совсем не подобает в моем варианте. import pandas as pd import numpy as np import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense, Dropout from keras.regularizers import l1_l2 from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.model_selection import train_test_split from sklearn.linear_model import Lasso from sklearn.metrics import mean_squared_error # Загрузка данных data = pd.read_csv("data43_new.csv", delimiter=",") # Преобразуем в строки data.iloc[:,1] = data.iloc[:,1].astype(str) # Оставляем как есть, без конвертации в int # Разделение на входные и выходные def hex_to_dec(hex_str): return int(hex_str, 16) X = data.iloc[:,0].str.split(';', expand=True).applymap(hex_to_dec).values y = data.iloc[:,1].values # Encoding y y = LabelEncoder().fit_transform(y) # Нормализация данных scaler = StandardScaler() X = scaler.fit_transform(X) # Разбиение данных на обучение и тест X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # Создание и обучение модели model = Sequential() model.add(Dense(32, activation='relu', input_shape=(6,), kernel_regularizer=l1_l2(l1=0.01, l2=0.01))) model.add(Dropout(0.5)) model.add(Dense(16, activation='relu', kernel_regularizer=l1_l2(l1=0.01, l2=0.01))) model.add(Dropout(0.5)) model.add(Dense(np.unique(y).shape[0], activation='softmax')) # Используем оптимизатор RMSprop с измененной скоростью обучения from keras.optimizers import RMSprop optimizer = RMSprop(learning_rate=0.001) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) history = model.fit(X_train, y_train, epochs=2000, validation_data=(X_test, y_test), batch_size=10, verbose=1) # Построение графиков plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.plot(history.history['loss'], label='train') plt.plot(history.history['val_loss'], label='test') plt.title('Loss') plt.legend() plt.subplot(1, 2, 2) plt.plot(history.history['accuracy'], label='train') plt.plot(history.history['val_accuracy'], label='test') plt.title('Accuracy') plt.legend() plt.tight_layout() plt.show() # Lasso регрессия lasso = Lasso(alpha=0.1) lasso.fit(X_train, y_train) y_pred = lasso.predict(X_test) mse = mean_squared_error(y_test, y_pred) print(f"Lasso Regression MSE: {mse}") print(f"Lasso Coefficients: {lasso.coef_}") Переходим к плану "Б", прямая атака на железо. Спасибо за помощь! Share this post Link to post Share on other sites More sharing options...
Doka 1 September 1 Posted September 1 · Report post сообщение от пользователя Мур Тема: Информирование AlanSbor о проблеме построения NN Сообщение: Хочу порекомендовать вам изменить архитектуру вашей сети, если просматривается некая временная зависимость поведения от данных. Тогда для проб Вам стоит идти по пути создания RNN , где осуществляется анализ предыстории потока данных. Кстати это одна из самых перспективных , наряду с CNN, нейронок! Рекуррентность позволила решить многие тупиковые задачи. Удачи! Share this post Link to post Share on other sites More sharing options...