#numpy #keras #deep-learning #conv-neural-network
#numpy #keras #глубокое обучение #conv-нейронная сеть
Вопрос:
Набор данных, содержащий 777 значений (строк) и 29 объектов (столбцов), последний объект помечен как 0 или 1. Однако я не уверен, как разделить метки на выборки.
Я разделил свои данные на тестирование и обучение: от строки 1 до 625 я изменил свою матрицу, чтобы она была трехмерной, 104 выборки, содержащие 6 временных шагов чтения с 28 функциями. Размер массива (104,6,28) Проделал то же самое со строками 626-776 для тестовых данных, в результате чего получился массив размером (25,6,28).
Затем последний столбец (содержащий 0 или 1) также преобразован в 3D. Результирующий размер стал:
test_y (25,6,1) train_y(104,6,1)
после обработки моих данных я использовал функцию one hot encoding для своих Y-данных (меток), которые я ранее удалил из исходного набора данных 29 features.
Проблема возникает, когда я запускаю свою модель для выполнения классификации softmax. В нем говорится, что моя вторая плотная сеть должна быть 2D, и я передаю трехмерный массив, но мой массив должен быть 3D, иначе модель не знала бы, к какому набору данных принадлежат метки.
Надеюсь, кто-нибудь сможет мне помочь. Большое спасибо!
Прочитав несколько статей, я пришел к выводу, что, возможно, дело в том, что некоторые модели раздвижных окон предоставляют только 1 категориальную метку для каждого окна, что означает, что за (временные интервалы, функции) выводится только 1 классификационный вывод?
Мой набор данных содержит показания из сообщений TCP / IP, и каждая строка классифицируется либо как кибератака типа DDOS, либо как отсутствие кибератаки DDOS. У меня нет 1 окна для каждого случая, чтобы классифицировать весь массив как 1 или 0.
from numpy import mean
from numpy import std
from numpy import dstack
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Dropout
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.utils import to_categorical
import numpy as np
f=open('data/data_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[1:625]
train_x=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
values=[float(x) for x in line.split(',')[0:]]
train_x[i,:]=values
f=open('data/labels_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[1:625]
train_y=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
values=[float(x) for x in line.split(',')[0:]]
train_y[i,:]=values
f=open('data/data_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[626:776]
test_x=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
values=[float(x) for x in line.split(',')[0:]]
test_x[i,:]=values
f=open('data/labels_shuffled.csv')
data=f.read()
f.close()
lines=data.split('n')
header=lines[0].split(',')
lines=lines[626:776]
test_y=np.zeros(((len(lines)),len(header)))
for i, line in enumerate(lines):
values=[float(x) for x in line.split(',')[0:]]
test_y[i,:]=values
train_x=train_x.reshape(104,6,28)
train_y=train_y.reshape(104,6,1)
test_x=test_x.reshape(25,6,28)
test_y=test_y.reshape(25,6,1)
train_y=to_categorical(train_y)
test_y=to_categorical(test_y)
print(train_x.shape)
print(test_x.shape)
print(train_y.shape)
print(test_y.shape)
def evaluate_model(train_x, train_y, test_x, test_y):
verbose, epochs, batch_size = 0, 10, 32
n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[2]
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu',
input_shape=(n_timesteps,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
# evaluate model
accuracy = model.evaluate(test_x, test_y, batch_size=batch_size, verbose=0)
return accuracy
evaluate_model(train_x, train_y, test_x, test_y)
Ожидаемый результат — просто иметь классификатор softmax, который будет предсказывать, принадлежат ли проверенные данные атаке или нет.
Комментарии:
1. Преобразуйте метки в категориальные переменные с помощью
keras.utils.to_categorical()
, чтобы метки последовательности имели форму ( 104, 2)2. Но это означало бы, что я буду использовать только 1 метку на образец окна, в то время как мне нужно 6 меток на образец окна. Вот где я так запутался, у меня нет профиля окна для каждого класса.