Перейти к содержанию
    

Обучение и положительный результат работы нейронок на малых данных

Добрый вечер !

Получил немного данных при чтении с ридера NFC

Все ключи были считаны и сохранены после очередного использования.

Проблема в том что этих данных очень мало, порядка 45 уникальных значений.

Данных мало, потому что раньше их никто не собирал до кризиса, а тут случилось.

Обучение нейронок проводилось с учителем. 

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

На входе порядка 40 hex символов, на выходе 4 hex символа.

Простая сеть точностью не радовала, всегда выше 0,89, что практически никакой точности.

Смысл в том что после использования карточки-ключа записывалась дата использования и 4 hex байта как контрольная сумма.

Соответственно карточка-ключ имеет срок годности, если только не вписать правильные новые даты инициализации карты.

В итоге имеется (для справки)

key =   '0481B7BAD25B6280' UID карты-ключа
date1 = '1308E5071905E707' две даты, из которых первая дата активации карты, а вторая дата предыдущая дата использования карты
date2 = '1308E5071606E707' тоже две даты, из которых первая дата активации карты, а вторая дата последняя дата использования карты

Контрольные суммы выглядят вот так

для date1 :  00001827

для date2 :  00003CE7

Я пробовал в лоб, пробовал хеширование, XOR в разных вариантах. На выходных пробовал CRC16 с разными полиномами, ни сходится аленький цветочек.

Пробовал простые нейронки, результат тоже нулевой.

Может кто имел положительный опыт с таким малым количеством данных или работал с подобными NFC системами , подскажите пожалуйста куда копать дальше ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть вариант улучшения ситуации. Провести ревизию данных на предмет критичности факторов при помощи регрессионного анализа , чтобы убедится в правильности принятого выбора  факторов на входе NN.

Далее начните вводить дополнительные факторы (тут надо крепко вникнуть в возможные, пока не учтенные данные совершенствуемой модели) и тем же регрессионным анализом определите степень участия нового вашего канала.   

...Вы должны знать, что NN не обеспечивают 100% точность выхода. Архитектурно будьте готовы к тому, что придется усложнять сеть, но это потребует высоких временных затрат на прогонах вариантов. Теории построения NN не существует. Это пока эмпирическая и во много м интуитивная магия.

      

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 19.08.2023 в 20:30, Мур сказал:

Есть вариант улучшения ситуации. Провести ревизию данных на предмет критичности факторов при помощи регрессионного анализа , чтобы убедится в правильности принятого выбора  факторов на входе NN.

Далее начните вводить дополнительные факторы (тут надо крепко вникнуть в возможные, пока не учтенные данные совершенствуемой модели) и тем же регрессионным анализом определите степень участия нового вашего канала.   

...Вы должны знать, что NN не обеспечивают 100% точность выхода. Архитектурно будьте готовы к тому, что придется усложнять сеть, но это потребует высоких временных затрат на прогонах вариантов. Теории построения NN не существует. Это пока эмпирическая и во много м интуитивная магия.

      

Попробую тогда 
Метод расчета весов входов в нейронной сети
Метод "leave one out" - удаление факторов по одному и смотреть изменение метрик
Линейную регрессию и анализ значимости коэффициентов

Понятно что займет время, но есть хотя бы варианты.

Спасибо за направление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одна из 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_}")



Переходим к плану "Б", прямая атака на железо.
Спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сообщение от пользователя Мур

Тема: Информирование AlanSbor о проблеме построения NN

Сообщение:

Хочу порекомендовать вам изменить архитектуру вашей сети, если просматривается некая временная зависимость поведения от данных.

Тогда для проб Вам стоит идти по пути создания  RNN , где осуществляется анализ предыстории потока данных.  Кстати это одна из самых перспективных , наряду с CNN, нейронок!  

Рекуррентность  позволила решить многие тупиковые задачи.  Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...