AutoEncoders не показывает ожидаемый результат в кератах - PullRequest
0 голосов
/ 23 марта 2019

Я экспериментирую с автоэнкодерами в Керасе. где у меня есть набор данных (сетевое вторжение 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)

Я пробовал использовать разные функции активации между слоями, я пробовал разные глубины слоя. Различные функции потери.

Буду признателен за вашу помощь, если вы заметите что-то неправильное, что я делаю.

спасибо.

...