Я экспериментирую с автоэнкодерами в Керасе. где у меня есть набор данных (сетевое вторжение NLS-DATASET), который я хочу, чтобы мой автоматический кодировщик узнал его идентичность и смог восстановить входные данные.
но похоже, что авто кодер генерирует выходной сигнал далеко от входа.
мой код АвтоЭкодера выглядит так:
import keras
from keras.layers import Input, Dense
from keras.models import Model
input_event= Input(shape=(37,))
# encoded and decoded layer for the autoencoder
encoded = Dense(units=35, activation='linear')(input_event)
encoded = Dense(units=30 ,activation='linear')(encoded)
encoded = Dense(units=25 ,activation='linear')(encoded)
encoded = Dense(units=15, activation='linear')(encoded)
decoded = Dense(units=25, activation='linear')(encoded)
decoded = Dense(units=30, activation='linear')(decoded)
decoded = Dense(units=35, activation='linear')(decoded)
decoded = Dense(units=37, activation='sigmoid')(decoded)
# Building autoencoder
autoencoder=Model(input_event, decoded)
# compiling the autoencoder
#binary_crossentropy
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error', metrics=['accuracy'])
# Fitting the noise trained data to the autoencoder
autoencoder.fit(train_preprocessed, train_preprocessed,
epochs=500,
batch_size=500,
shuffle=True
)
вход выглядит так:
array([ 1.44929445e-04, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.95694716e-03, 1.95694716e-03, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
1.00000000e+00, 0.00000000e+00, 0.00000000e+00,
5.25490196e-01, 3.37254902e-01, 6.10000000e-01,
4.00000000e-02, 6.10000000e-01, 2.00000000e-02,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00])
и восстановленный ввод того же образца выглядит так:
array([ 2.74842819e-06, 1.79134950e-05, 2.46820991e-06,
1.92149782e-05, 1.90284572e-06, 8.65007848e-07,
9.06300829e-06, 5.82939938e-05, 2.86187715e-05,
7.64128927e-04, 1.39977574e-05, 2.23619267e-04,
2.37729073e-05, 2.88849260e-05, 7.43528290e-07,
3.19817104e-06, 1.04340703e-04, 5.09360158e-11,
2.53149103e-02, 4.43180241e-02, 3.23981070e-03,
6.98099006e-03, 1.20416423e-03, 2.04246654e-03,
9.92004931e-01, 8.45971797e-03, 2.18889210e-02,
5.33952713e-01, 2.81162173e-01, 6.86491251e-01,
3.13708745e-02, 6.79274261e-01, 4.15302813e-03,
2.21803953e-06, 9.70323163e-04, 3.18228710e-03,
1.31858699e-03], dtype=float32)
Я пробовал использовать разные функции активации между слоями, я пробовал разные глубины слоя. Различные функции потери.
Буду признателен за вашу помощь, если вы заметите что-то неправильное, что я делаю.
спасибо.