Модель Keras CNN + GRU для обнаружения аномалий во временных рядах - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь использовать нейронную сеть для обнаружения аномалий более чем за 120 секунд windows.

Входной сигнал имеет три значения:

  • 4 Сигналы 1 Гц: таким образом, для каждого временного окна имеется 120 значений
  • 2 формы сигнала 80 Гц: таким образом, для каждого временного окна имеется 80 * 120 = 9600 значений
  • 2 других значения для каждого 120-секундного окна

Выходные данные задаются 120 двоичными значениями, которые указывают, в какие секунды внутри окна происходит аномалия.

Как видите, сеть принимает первые два двумерных входа (время х особенность) и затем работает отдельно. Сначала к каждому типу входных данных применяется ряд сверток. Это полезно для уменьшения количества значений, чтобы я мог затем применить слой GRU. Кроме того, я надеюсь извлечь какие-то функции из временного ряда. Затем две отдельные модели объединяются вместе с двумя другими значениями окна. К объединенным значениям затем применяется серия плотных слоев.

Я не очень знаком с Keras. Кажется, что модель работает правильно, но я надеюсь, что в ее определении я не допустил «скрытой ошибки», которая могла бы повлиять на ее производительность ...?

Кроме того, аномалии во временном окне обычно коррелирует между ними. Может быть полезно применить уровень CRF к сети, чтобы учесть это? Я уже пытался добавить, сразу после комбинированный_акт_3 :

   combined = Lambda(lambda x: expand_dims(x, -1), name="reshape")(combined) # add a dimension
   combined = CRF(window_seconds, learn_mode='marginal', name='crf_layer_waves')(combined)

Однако это приводит к ошибке. Что я делаю не так?

Спасибо

    # input definition (temporal dimension comes first)
    input_parameters = layers.Input(shape=(window_seconds, number_of_1hz_features), name='param_input')
    input_waves = layers.Input(shape=(window_seconds*80, number_of_80hz_features), name='waves_input')
    input_hrv = layers.Input(shape=(2,), name='hrv_input')
    # convolutional part on parameter data
    x = layers.Conv1D(64, 7, name='param_conv_1', kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(input_parameters)
    x = layers.Activation("relu", name='param_act_1')(x)
    x = layers.BatchNormalization(name='param_batchnorm_1')(x)
    x = layers.MaxPooling1D(3, name='param_pool_1')(x)
    x = layers.Conv1D(128, 7, name='param_conv_2', kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(x)
    x = layers.Activation("relu", name='param_act_2')(x)
    x = layers.BatchNormalization(name='param_batchnorm_2')(x)
    x = layers.MaxPooling1D(3, name='param_pool_2')(x)
    x = layers.GRU(50, return_sequences=True, name="param_GRU", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(x)
    x = layers.BatchNormalization(name='param_GRU_batchnorm')(x)
    x = layers.Flatten(name='param_flatten')(x)
    x = Model(inputs=input_parameters, outputs=x)
    # convolutional part on wave data
    y = layers.Conv1D(64, 7, name="waves_conv_1", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(input_waves)
    y = layers.Activation("relu", name="waves_act_1")(y)
    y = layers.BatchNormalization(name="waves_batchnorm_1")(y)
    y = layers.MaxPooling1D(5, name="waves_pool_1")(y)
    y = layers.Conv1D(128, 7, name="waves_conv_2", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(y)
    y = layers.Activation("relu", name="waves_act_2")(y)
    y = layers.BatchNormalization(name="waves_batchnorm_2")(y)
    y = layers.MaxPooling1D(5, name="waves_pool_2")(y)
    y = layers.Conv1D(256, 7, name="waves_conv_3", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(y)
    y = layers.Activation("relu", name="waves_act_3")(y)
    y = layers.BatchNormalization(name="waves_batchnorm_3")(y)
    y = layers.MaxPooling1D(5, name="waves_pool_3")(y)
    y = layers.Conv1D(512, 7, name="waves_conv_4", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(y)
    y = layers.Activation("relu", name="waves_act_4")(y)
    y = layers.BatchNormalization(name="waves_batchnorm_4")(y)
    y = layers.MaxPooling1D(5, name="waves_pool_4")(y)
    y = layers.Conv1D(128, 1, name="waves_1x1conv", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(y)
    y = layers.Activation("relu", name="waves_act_1x1")(y)
    y = layers.BatchNormalization(name="waves_batchnorm_1x1")(y)
    y = layers.GRU(50, return_sequences=True, name="waves_GRU", kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(y)
    y = layers.BatchNormalization(name='waves_GRU_batchnorm')(y)
    y = layers.Flatten(name="waves_flatten")(y)
    y = Model(inputs=input_waves, outputs=y)
    # combine the output of the two branches
    z = Model(inputs=input_hrv, outputs=input_hrv)
    combined = layers.concatenate([x.output, y.output, z.output], name='concatenation')
    # dense layer
    combined = layers.Dense(512, name='combined_dense_1', kernel_regularizer=l1_l2(0.001,0.001), bias_regularizer=l1_l2(0.001,0.001))(combined)
    combined = layers.Activation("relu", name='combined_act_1')(combined)
    combined = layers.BatchNormalization(name='combined_batchnorm_1')(combined)
    combined = layers.Dense(256, name='combined_dense_2')(combined)
    combined = layers.Activation("relu", name='combined_act_2')(combined)
    combined = layers.BatchNormalization(name='combined_batchnorm_2')(combined)
    combined = layers.Dense(window_seconds, name='combined_dense_3')(combined)
    combined = layers.Activation("sigmoid", name='combined_act_3')(combined)
    # final model
    model = Model(inputs=[x.input, y.input, z.input], outputs=combined)
...