Phân tích và tái tạo mô hình phát hiện bất thường VAE-LSTM

Giới thiệu

Bài viết này trình bày quá trình tái tạo mô hình phát hiện bất thường VAE-LSTM. Mô hình kết hợp giữa mạng Variational Autoencoder (VAE) và mạng Long Short-Term Memory (LSTM) để xử lý dữ liệu chuỗi thời gian.

Cấu hình môi trường

Môi trường được sử dụng trong quá trình tái tạo bao gồm:

  • Python 3.7
  • TensorFlow 1.15
  • NumPy 1.18.5
  • Scikit-learn 0.24.2
  • Matplotlib 3.3.4

Tạo môi trường bằng lệnh sau:


conda create -n vae-lstm python=3.7
conda activate vae-lstm
pip install tensorflow==1.15 numpy==1.18.5 scikit-learn==0.24.2 matplotlib==3.3.4

Ghi nhận thay đổi mã nguồn

1. Xử lý tương thích TensorFlow

Trong quá trình tái tạo, đã gặp vấn đề về tương thích phiên bản TensorFlow ở phần LSTM. Cụ thể, khi sử dụng lớp LSTM trực tiếp đã xuất hiện lỗi:


NotImplementedError: Cannot convert a symbolic Tensor (lstm/strided_slice:0) to a numpy array.

Để giải quyết, lớp `create_lstm_model` trong tệp `models.py` đã được sửa đổi bằng cách thay thế LSTM bằng mạng nơ-ron tiền xử lý (FNN):


def build_sequence_model(self, config):
    # Thay thế LSTM bằng mạng FNN để đảm bảo tương thích
    sequence_length = config['input_length'] - 1
    feature_size = config['latent_dim']
    hidden_units = config['hidden_layer_units']

    inputs = tf.keras.layers.Input(shape=(sequence_length, feature_size))
    
    # Chuyển đổi đầu vào thành vector duy nhất
    flat_input = tf.keras.layers.Flatten()(inputs)
    
    # Thêm các lớp Dense với hàm kích hoạt ReLU
    dense_layer_1 = tf.keras.layers.Dense(hidden_units, activation='relu')(flat_input)
    dense_layer_2 = tf.keras.layers.Dense(hidden_units, activation='relu')(dense_layer_1)
    
    # Lớp đầu ra không sử dụng hàm kích hoạt
    output_layer = tf.keras.layers.Dense(sequence_length * feature_size)(dense_layer_2)
    
    # Đưa kết quả về dạng ban đầu
    outputs = tf.keras.layers.Reshape((sequence_length, feature_size))(output_layer)

    return tf.keras.Model(inputs=inputs, outputs=outputs)

Lựa chọn này giữ nguyên cấu trúc đầu vào và đầu ra của mô hình gốc nhưng loại bỏ sự phụ thuộc vào LSTM.

2. Sửa chữa trình tải dữ liệu

Khi thử nghiệm, nếu số lượng mẫu dữ liệu kiểm tra nhỏ hơn kích thước cửa sổ, sẽ xảy ra lỗi. Để khắc phục, phương pháp `get_test_data` và `get_test_labels` trong tệp `data_loader.py` đã được điều chỉnh để thêm phần điền dữ liệu:


# Kiểm tra số lượng mẫu kiểm tra có đủ lớn không
if test_sample_count < self.config['window_size']:
    print(f"Cảnh báo: Số lượng mẫu kiểm tra ({test_sample_count}) nhỏ hơn kích thước cửa sổ ({self.config['window_size']}), đang thực hiện điền dữ liệu.")
    # Sử dụng zero-padding để đảm bảo ít nhất một cửa sổ
    padded_data = np.pad(test_data_array, ((0, self.config['window_size'] - test_sample_count), (0, 0)), 'constant')

Việc này đảm bảo rằng dữ liệu luôn đủ chiều cho việc phân chia thành các cửa sổ.

Thẻ: tensorflow lstm variational-autoencoder

Đăng vào ngày 26 tháng 5 lúc 04:10