From b9e295d7dcff1734f8a20375f4cabecf109abcd1 Mon Sep 17 00:00:00 2001 From: lhenry15 Date: Thu, 6 May 2021 15:51:44 -0500 Subject: [PATCH] add feature_dim detection for LSTMOD --- tods/detection_algorithm/core/LSTMOD.py | 35 ++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/tods/detection_algorithm/core/LSTMOD.py b/tods/detection_algorithm/core/LSTMOD.py index 28ced1d..d66478c 100755 --- a/tods/detection_algorithm/core/LSTMOD.py +++ b/tods/detection_algorithm/core/LSTMOD.py @@ -25,8 +25,8 @@ class LSTMOutlierDetector(CollectiveBaseDetector): epochs=10, batch_size=8, dropout_rate=0.0, - feature_dim=1, - hidden_dim=8, + feature_dim=9, + hidden_dim=1, n_hidden_layer=0, activation=None, diff_group_method='average' @@ -51,19 +51,22 @@ class LSTMOutlierDetector(CollectiveBaseDetector): self.hidden_dim = hidden_dim self.n_hidden_layer = n_hidden_layer self.diff_group_method = diff_group_method + self.activation = activation - self.model_ = Sequential() - self.model_.add(LSTM(units=hidden_dim, input_shape=(feature_dim, 1), - dropout=dropout_rate, activation=activation)) + def _build_model(self): + model_ = Sequential() + model_.add(LSTM(units=self.hidden_dim, input_shape=(self.feature_dim, 1), + dropout=self.dropout_rate, activation=self.activation)) - for layer_idx in range(n_hidden_layer): - self.model_.add(LSTM(units=hidden_dim, input_shape=(hidden_dim, 1), - dropout=dropout_rate, activation=activation)) + for layer_idx in range(self.n_hidden_layer): + model_.add(LSTM(units=self.hidden_dim, input_shape=(self.hidden_dim, 1), + dropout=self.dropout_rate, activation=self.activation)) - self.model_.add(Dense(units=feature_dim, input_shape=(hidden_dim, 1), activation=None)) + model_.add(Dense(units=self.feature_dim, input_shape=(self.hidden_dim, 1), activation=None)) - self.model_.compile(loss=self.loss, optimizer=self.optimizer) + model_.compile(loss=self.loss, optimizer=self.optimizer) + return model_ def fit(self, X: np.array, y=None) -> object: """Fit detector. y is ignored in unsupervised methods. @@ -84,6 +87,8 @@ class LSTMOutlierDetector(CollectiveBaseDetector): X = check_array(X).astype(np.float) self._set_n_classes(None) X_buf, y_buf = self._get_sub_matrices(X) + self.feature_dim = X_buf.shape[1] + self.model_ = self._build_model() # fit the LSTM model self.model_.fit(X_buf, y_buf, epochs=self.epochs, batch_size=self.batch_size) @@ -209,15 +214,14 @@ class LSTMOutlierDetector(CollectiveBaseDetector): return pred_score, relative_error_left_inds, relative_error_right_inds - -if __name__ == "__main__": # pragma: no cover +def main(): X_train = np.asarray( [3., 4., 8., 16, 18, 13., 22., 36., 59., 128, 62, 67, 78, 100]).reshape(-1, 1) X_test = np.asarray( - [3., 4., 8.6, 13.4, 22.5, 17, 19.2, 36.1, 127, -23, 59.2]).reshape(-1,1) + [3., 4., 8., 16.1, 18.2, 36.2, 57.1, -10.3, 17, 19.2, 36.1, 127, -23, 59.2]).reshape(-1,1) - # print(X_train.shape, X_test.shape) + print(X_train.shape, X_test.shape) clf = LSTMOutlierDetector(contamination=0.1) clf.fit(X_train) @@ -231,3 +235,6 @@ if __name__ == "__main__": # pragma: no cover # print('pred_scores: ',pred_scores) print('pred_labels: ',pred_labels) + +if __name__ == "__main__": # pragma: no cover + main()