Нейронная сеть для обнаружения аномальных последовательностей в системных вызовах
Есть код, который читает логи с последовательностями системных вызовов и записывает их индексы в файл, с этого фала формируются массивы [4500] на [100]. Код python
import sys
import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
import tensorflow as tf
import csv
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.models import load_model
import os, os.path
import re
TRAIN_FILE='rdpSsh.log'
SYSCALL_FILE='syscalls.txt'
TEST_FILE='rdpSsh.log'
TRAIN_NORMALIZED_FILE='train_normalized_file.csv'
STEPS = 100
def split_sequences(sequence, seq_length):
sequences = []
for i in range(len(sequence) - seq_length + 1):
sequences.append(sequence[i:i + seq_length])
return sequences
def extract_syscall(row):
"""Извлекает системный вызов из строки."""
match = re.search(r'syscall=(\w+)', row)
if match:
return match.group(1)
else:
return None
def get_syscall_index(syscall, TRAIN_NORMALIZED_FILE):
"""Возвращает индекс системного вызова из файла со словарем."""
with open(TRAIN_NORMALIZED_FILE, "r") as f:
for i, line in enumerate(f):
if line.strip() == syscall:
return i + 1 # Индексы начинаются с 1
return None
# Запись индексов системных вызовов
with open(TRAIN_NORMALIZED_FILE, "w") as output_file:
with open(TRAIN_FILE, "r") as input_file:
for line in input_file:
syscall = extract_syscall(line)
if syscall:
syscall_index = get_syscall_index(syscall, SYSCALL_FILE)
if syscall_index:
output_file.write(f"{syscall_index}\n")
else:
print(f"Системный вызов '{syscall}' не найден в словаре.")
def create_sliding_sequences(filename, seq_length):
"""Читает данные из файла и формирует скользящие последовательности заданной длины.
Args:
filename: Имя файла с данными.
seq_length: Длина каждой последовательности.
Returns:
Список скользящих последовательностей.
"""
with open(TRAIN_NORMALIZED_FILE, "r") as file:
data = [int(line.strip()) for line in file]
sequences = []
for i in range(len(data) - seq_length + 1):
sequences.append(data[i:i + seq_length])
return sequences
sequences = create_sliding_sequences(TRAIN_NORMALIZED_FILE, STEPS)
with open(TRAIN_FILE, 'r') as file:
line_count = sum(1 for line in file)
steps=4549
sequences = np.array(sequences).reshape(-1, steps, STEPS)
print(sequences.shape)
print(sequences)
# Sequential model
model = Sequential()
model.add(LSTM(STEPS, activation='relu', input_shape=(steps, STEPS), return_sequences=True))
model.add(LSTM(50, activation='relu', return_sequences=False))
model.add(RepeatVector(steps))
model.add(LSTM(50, activation='relu', return_sequences=True))
model.add(LSTM(STEPS, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(STEPS)))
model.compile(optimizer='adam', loss='mse')
model.summary()
# Fit model
model.fit(sequences, sequences, epochs=100, batch_size=1)
# Save model and weights
print("Save model: models/AE.keras")
model.save("models/AE.keras")
print("Save weights: models/AE.weights.h5")
model.save_weights("models/AE.weights.h5")
Файл syscalls
getpid
openat
rt_sigprocmask
lseek
chown
connect
bind
pipe
execve
rt_sigaction
...
Файл rdpSsh
6: Warning (user=ubuntu container_id=2f0f6879f2bd container_name=uxrdp process name=bash process id=8327 syscall=rt_sigprocmask)
13:31:02.790236364: Warning (user=ubuntu container_id=2f0f6879f2bd container_name=uxrdp process name=bash process id=8327 syscall=rt_sigprocmask)
13:31:02.790252309: Warning (user=ubuntu container_id=2f0f6879f2bd container_name=uxrdp process name=bash process id=8327 syscall=rt_sigprocmask)
13:31:02.790259433: Warning (user=ubuntu container_id=2f0f6879f2bd container_name=uxrdp process name=bash process id=8327 syscall=rt_sigprocmask)
13:31:02.790394617: Warning (user=ubuntu container_id=2f0f6879f2bd container_name=uxrdp process name=bash process id=8327 syscall=rt_sigaction)
Файл train_normalized_file
3
3
3
3
10
39
1
3
...
И вот во время обучения, у меня значения loss Nan. Подскажите пожалуйста, из-за чего такое может быть?