I wrote a program that uses a variational autoencoder to generate network intrusion traffic, but the generated effect is relatively poor and cannot improve the prediction results very well. I don’t know how to tune it. Please give me some ideas.
I am using the Kubernetes network intrusion dataset, generate a VAE model for each sample to generate data and the number of samples is as follows:
Label
Normal 60471
info_search 2475
kubelet 824
influxdb 193
node_rce 168
attack_pod 163
runc 131
SSRF 56
cmd_injection 48
Grafana 36
containerd 34
Name: count, dtype: int64
Here are my model parameters:
dvae = DVAEModel(5, 79, 79, 90)
dvae.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001), loss=keras.losses.binary_crossentropy, metrics=['reconstruction_loss', 'kl_loss'])
dvae.fit(gdata, epochs=30, batch_size=10)
from keras import layers, Input
class Sampling(layers.Layer):
"""Uses (z_mean, z_log_var) to sample z, the vector encoding a digit."""
def call(self, inputs):
z_mean, z_log_var = inputs
batch = tf.shape(z_mean)[0]
dim = tf.shape(z_mean)[1]
epsilon = tf.random.normal(shape=(batch, dim))
return z_mean + tf.exp(0.5 * z_log_var) * epsilon
class DVAEModel(keras.Model):
def __init__(self, latent_dim, input_dim, output_dim, hidden_size = 90, *args, **kwargs):
super().__init__(*args, **kwargs)
self.mse_loss = None
self.optimizer = None
self.latent_dim = latent_dim
self.input_dim = input_dim
self.output_dim = output_dim
self.hidden_size = hidden_size
encoder_inputs = Input(shape=(input_dim,))
x = Dense(hidden_size, activation='relu')(encoder_inputs)
# x = Dense(64, activation='relu')(x)
x = Dense(32, activation='relu')(x)
self.z_mean_layer = Dense(latent_dim)(x)
self.z_log_var_layer = Dense(latent_dim)(x)
self.z = Sampling()([self.z_mean_layer, self.z_log_var_layer])
self.encoder = keras.Model(encoder_inputs, [self.z_mean_layer, self.z_log_var_layer, self.z], name="encoder")
self.decoder = keras.Sequential([
InputLayer(input_shape=(latent_dim, )),
# Dense(32, activation='relu'),
Dense(64, activation='relu'),
Dense(output_dim, activation='sigmoid')
])
self.total_loss_tracker = keras.metrics.Mean(name="total_loss")
self.reconstruction_loss_tracker = keras.metrics.Mean(name="reconstruction_loss")
self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss")
def call(self, x, *args, **kwargs):
mean, log_var = self.encode(x)
z = self.reparameterizate(mean, log_var)
reconstructed_x = self.decode(z)
return reconstructed_x, mean, log_var
def compile_model(self, learning_rate=0.001):
self.optimizer = keras.optimizers.Adam(learning_rate)
self.mse_loss = keras.losses.MeanSquaredError()
@property
def metrics(self):
return [
self.total_loss_tracker,
self.reconstruction_loss_tracker,
self.kl_loss_tracker,
]
def train_step(self, data):
with tf.GradientTape() as tape:
z_mean, z_log_var, z = self.encoder(data)
reconstruction = self.decoder(z)
reconstruction_loss = tf.reduce_mean(
tf.reduce_sum(
keras.losses.binary_crossentropy(data, reconstruction),
)
)
kl_loss = -0.5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))
kl_loss = tf.reduce_mean(tf.reduce_sum(kl_loss))
total_loss = reconstruction_loss + kl_loss
grads = tape.gradient(total_loss, self.trainable_weights)
self.optimizer.apply_gradients(zip(grads, self.trainable_weights))
self.total_loss_tracker.update_state(total_loss)
self.reconstruction_loss_tracker.update_state(reconstruction_loss)
self.kl_loss_tracker.update_state(kl_loss)
return {
"loss": self.total_loss_tracker.result(),
"reconstruction_loss": self.reconstruction_loss_tracker.result(),
"kl_loss": self.kl_loss_tracker.result(),
}
def generate_data(self, num_samples):
z_samples = tf.random.normal(shape=(num_samples, self.latent_dim))
generated_data = self.decoder.predict(z_samples)
return generated_data
Here is some loss:
Epoch 1/30
6/6 [==============================] - 1s 1ms/step - loss: 7.4883 - reconstruction_loss: 6.3576 - kl_loss: 0.5898
Epoch 2/30
6/6 [==============================] - 0s 1ms/step - loss: 6.6758 - reconstruction_loss: 6.0944 - kl_loss: 0.1885
Epoch 3/30
6/6 [==============================] - 0s 1ms/step - loss: 6.3074 - reconstruction_loss: 5.8545 - kl_loss: 0.0985
Epoch 4/30
6/6 [==============================] - 0s 1ms/step - loss: 6.0750 - reconstruction_loss: 5.6468 - kl_loss: 0.0636
Epoch 5/30
6/6 [==============================] - 0s 1ms/step - loss: 5.7886 - reconstruction_loss: 5.4236 - kl_loss: 0.0419
Epoch 6/30
6/6 [==============================] - 0s 1ms/step - loss: 5.4812 - reconstruction_loss: 5.1806 - kl_loss: 0.0276
Epoch 7/30
6/6 [==============================] - 0s 1ms/step - loss: 5.2328 - reconstruction_loss: 4.8992 - kl_loss: 0.0206
Epoch 8/30
6/6 [==============================] - 0s 999us/step - loss: 4.9818 - reconstruction_loss: 4.6009 - kl_loss: 0.0190
Epoch 9/30
6/6 [==============================] - 0s 1ms/step - loss: 4.6852 - reconstruction_loss: 4.3729 - kl_loss: 0.0180
Epoch 10/30
6/6 [==============================] - 0s 1ms/step - loss: 4.4518 - reconstruction_loss: 4.1837 - kl_loss: 0.0179
Epoch 11/30
6/6 [==============================] - 0s 1ms/step - loss: 4.2952 - reconstruction_loss: 4.0030 - kl_loss: 0.0169
Epoch 12/30
6/6 [==============================] - 0s 1ms/step - loss: 4.1463 - reconstruction_loss: 3.7850 - kl_loss: 0.0158
Epoch 13/30
6/6 [==============================] - 0s 1ms/step - loss: 3.7868 - reconstruction_loss: 3.6147 - kl_loss: 0.0155
Epoch 14/30
6/6 [==============================] - 0s 1000us/step - loss: 3.4024 - reconstruction_loss: 3.2234 - kl_loss: 0.0162
Epoch 15/30
6/6 [==============================] - 0s 1ms/step - loss: 3.1202 - reconstruction_loss: 3.0370 - kl_loss: 0.0170
Epoch 16/30
6/6 [==============================] - 0s 1ms/step - loss: 3.0033 - reconstruction_loss: 2.8847 - kl_loss: 0.0183
Epoch 17/30
6/6 [==============================] - 0s 1ms/step - loss: 2.7883 - reconstruction_loss: 2.6985 - kl_loss: 0.0185
Epoch 18/30
6/6 [==============================] - 0s 1000us/step - loss: 2.8058 - reconstruction_loss: 2.5621 - kl_loss: 0.0173
Epoch 19/30
6/6 [==============================] - 0s 1ms/step - loss: 2.5771 - reconstruction_loss: 2.3882 - kl_loss: 0.0161
Epoch 20/30
6/6 [==============================] - 0s 999us/step - loss: 2.4528 - reconstruction_loss: 2.3232 - kl_loss: 0.0152
Epoch 21/30
6/6 [==============================] - 0s 1000us/step - loss: 2.2719 - reconstruction_loss: 2.0742 - kl_loss: 0.0142
Epoch 22/30
6/6 [==============================] - 0s 1ms/step - loss: 2.2824 - reconstruction_loss: 2.0957 - kl_loss: 0.0132
Epoch 23/30
6/6 [==============================] - 0s 1ms/step - loss: 2.1258 - reconstruction_loss: 2.0166 - kl_loss: 0.0122
Epoch 24/30
6/6 [==============================] - 0s 1ms/step - loss: 2.0261 - reconstruction_loss: 1.8854 - kl_loss: 0.0112
Epoch 25/30
6/6 [==============================] - 0s 1ms/step - loss: 2.0904 - reconstruction_loss: 1.9450 - kl_loss: 0.0102
Epoch 26/30
6/6 [==============================] - 0s 1000us/step - loss: 1.8601 - reconstruction_loss: 1.7473 - kl_loss: 0.0087
Epoch 27/30
6/6 [==============================] - 0s 1000us/step - loss: 1.7937 - reconstruction_loss: 1.7142 - kl_loss: 0.0074
Epoch 28/30
6/6 [==============================] - 0s 1000us/step - loss: 1.6934 - reconstruction_loss: 1.6353 - kl_loss: 0.0064
Epoch 29/30
6/6 [==============================] - 0s 999us/step - loss: 1.6015 - reconstruction_loss: 1.5774 - kl_loss: 0.0057
Epoch 30/30
6/6 [==============================] - 0s 1ms/step - loss: 1.5259 - reconstruction_loss: 1.5465 - kl_loss: 0.0052
2/2 [==============================] - 0s 999us/step
2
Epoch 1/30
248/248 [==============================] - 1s 717us/step - loss: 4.7693 - reconstruction_loss: 2.9224 - kl_loss: 0.0737
Epoch 2/30
248/248 [==============================] - 0s 727us/step - loss: 1.0951 - reconstruction_loss: 1.0460 - kl_loss: 0.0017
Epoch 3/30
248/248 [==============================] - 0s 723us/step - loss: 0.9628 - reconstruction_loss: 0.9696 - kl_loss: 2.4119e-04
Epoch 4/30
248/248 [==============================] - 0s 733us/step - loss: 0.9489 - reconstruction_loss: 0.9529 - kl_loss: 1.4301e-04
Epoch 5/30
248/248 [==============================] - 0s 725us/step - loss: 1.0058 - reconstruction_loss: 0.9427 - kl_loss: 1.1505e-04
Epoch 6/30
248/248 [==============================] - 0s 729us/step - loss: 0.9318 - reconstruction_loss: 0.9397 - kl_loss: 7.8498e-05
Epoch 7/30
248/248 [==============================] - 0s 731us/step - loss: 0.9409 - reconstruction_loss: 0.9286 - kl_loss: 8.3360e-05
Epoch 8/30
248/248 [==============================] - 0s 721us/step - loss: 0.9232 - reconstruction_loss: 0.9340 - kl_loss: 6.5222e-05
Epoch 9/30
248/248 [==============================] - 0s 719us/step - loss: 0.9368 - reconstruction_loss: 0.9308 - kl_loss: 6.7981e-05
Epoch 10/30
248/248 [==============================] - 0s 729us/step - loss: 0.9167 - reconstruction_loss: 0.9249 - kl_loss: 4.1513e-05
Epoch 11/30
248/248 [==============================] - 0s 726us/step - loss: 0.9202 - reconstruction_loss: 0.9274 - kl_loss: 5.1149e-05
Epoch 12/30
248/248 [==============================] - 0s 721us/step - loss: 0.9473 - reconstruction_loss: 0.9211 - kl_loss: 2.9135e-05
Epoch 13/30
248/248 [==============================] - 0s 721us/step - loss: 0.9233 - reconstruction_loss: 0.9198 - kl_loss: 3.1092e-05
Epoch 14/30
248/248 [==============================] - 0s 723us/step - loss: 0.9337 - reconstruction_loss: 0.9147 - kl_loss: 3.2729e-05
Epoch 15/30
248/248 [==============================] - 0s 725us/step - loss: 0.8921 - reconstruction_loss: 0.9096 - kl_loss: 3.6039e-05
Epoch 16/30
248/248 [==============================] - 0s 725us/step - loss: 0.9190 - reconstruction_loss: 0.9081 - kl_loss: 2.9572e-05
Epoch 17/30
248/248 [==============================] - 0s 733us/step - loss: 0.9333 - reconstruction_loss: 0.9113 - kl_loss: 2.9027e-05
Epoch 18/30
248/248 [==============================] - 0s 720us/step - loss: 0.9429 - reconstruction_loss: 0.9065 - kl_loss: 3.6777e-05
Epoch 19/30
248/248 [==============================] - 0s 725us/step - loss: 0.9295 - reconstruction_loss: 0.9016 - kl_loss: 2.2912e-05
Epoch 20/30
248/248 [==============================] - 0s 731us/step - loss: 0.9124 - reconstruction_loss: 0.8987 - kl_loss: 2.8741e-05
Epoch 21/30
248/248 [==============================] - 0s 721us/step - loss: 0.9077 - reconstruction_loss: 0.8956 - kl_loss: 3.2906e-05
Epoch 22/30
248/248 [==============================] - 0s 733us/step - loss: 0.8791 - reconstruction_loss: 0.8944 - kl_loss: 3.3966e-05
Epoch 23/30
248/248 [==============================] - 0s 733us/step - loss: 0.9457 - reconstruction_loss: 0.8922 - kl_loss: 2.7509e-05
Epoch 24/30
248/248 [==============================] - 0s 733us/step - loss: 0.8609 - reconstruction_loss: 0.8854 - kl_loss: 3.0690e-05
Epoch 25/30
248/248 [==============================] - 0s 733us/step - loss: 0.9084 - reconstruction_loss: 0.8847 - kl_loss: 3.0705e-05
Epoch 26/30
248/248 [==============================] - 0s 733us/step - loss: 0.8722 - reconstruction_loss: 0.8788 - kl_loss: 3.8073e-05
Epoch 27/30
248/248 [==============================] - 0s 721us/step - loss: 0.8875 - reconstruction_loss: 0.8733 - kl_loss: 4.3774e-05
Epoch 28/30
248/248 [==============================] - 0s 729us/step - loss: 0.8376 - reconstruction_loss: 0.8704 - kl_loss: 4.9258e-05
Epoch 29/30
248/248 [==============================] - 0s 729us/step - loss: 0.8125 - reconstruction_loss: 0.8704 - kl_loss: 3.9183e-05
Epoch 30/30
248/248 [==============================] - 0s 729us/step - loss: 0.8847 - reconstruction_loss: 0.8620 - kl_loss: 4.8452e-05
5/5 [==============================] - 0s 750us/step
I tried different classifiers and network models but it didn't work very well。