Построить автокодировщик для одной матрицы с целыми числами.

Вопрос или проблема

Можете ли вы сказать мне, как построить автоэнкодер с одной матрицей (4, 4) с целыми числами? Я хочу построить автоэнкодер для данных, упомянутых ниже. Я не знаю, нужно ли сначала преобразовывать десятичные числа в двоичные с помощью one-hot кодирования или нейронная сеть распознает целые числа. Например:

входные данные = массив([[ 4,  3,  8,  6],
                    [ 1,  1,  2,  2],
                    [24, 18, 32, 24],
                    [ 6,  6,  8,  8]])
автоэнкодер(данные)
выходные данные = массив([[ 4,  3,  8,  6],
                    [ 1,  1,  2,  2],
                    [24, 18, 32, 24]
                    [ 6,  6,  8,  8]])

Вы можете преобразовать ваши данные в float32 и подать их в стек LSTM автоэнкодера с линейной активацией.

Следующая архитектура работает, но вы можете ее доработать:

входные_данные = np.array([[[4, 3, 8, 6], [1, 1, 2, 2], [24, 18, 32, 24], [6, 6, 8, 8]]]).astype(np.float32)

model = tf.keras.Sequential([
    tf.keras.layers.LSTM(4, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(2, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(1, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(2, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(4, return_sequences=True, activation="linear"),
])

model.compile(optimizer="Adam", loss="MAE", metrics=["MSE"])
model.fit(входные_данные, входные_данные, epochs=200000)

Что у меня получилось после 200 000 эпох!:

[[[ 3.9911306   2.9956746   7.989547    5.9939675 ]
  [ 0.9976706   0.99182177  2.0006196   1.9999651 ]
  [23.9897     17.996624   31.995388   24.006733  ]
  [ 6.0549197   5.9584255   8.023056    8.003849  ]]]

Ответ или решение

Создание Автоэнкодера для Матрицы Целых Чисел

Автоэнкодеры являются мощным инструментом для обработки и сжатия данных, и в данной статье мы охватим процесс построения автоэнкодера на основе многослойной временной модели LSTM (Long Short-Term Memory) для работы с матрицей размерности 4×4, содержащей целые числа.

Шаг 1: Подготовка Данных

Для начала нужно подготовить исходные данные. В вашем случае данные представлены в следующем формате:

import numpy as np

input_data = np.array([[4,  3,  8,  6],
                        [1,  1,  2,  2],
                        [24, 18, 32, 24],
                        [6,  6,  8,  8]]).astype(np.float32)

Здесь каждый элемент массива преобразован в тип float32. Преобразование в вещественный тип необходимо для корректной работы нейронной сети, так как большинство библиотек для работы с нейронными сетями, включая TensorFlow, ожидают входные данные в формате с плавающей запятой.

Шаг 2: Определение Архитектуры Автоэнкодера

Далее определим архитектуру автоэнкодера с помощью библиотеки TensorFlow и Keras. Мы будем использовать несколько слоев LSTM для извлечения признаков и последующего восстановлений данных:

import tensorflow as tf

model = tf.keras.Sequential([
    tf.keras.layers.LSTM(4, return_sequences=True, activation="linear", input_shape=(1, 4)),
    tf.keras.layers.LSTM(2, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(1, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(2, return_sequences=True, activation="linear"),
    tf.keras.layers.LSTM(4, return_sequences=True, activation="linear"),
])

model.compile(optimizer="Adam", loss="mean_absolute_error", metrics=["mean_squared_error"])

Здесь первый слой LSTM принимает входные данные с размерностью (1, 4), что соответствует количеству временных шагов (в нашем случае это 1) и количеству признаков (4 элемента в строке).

Шаг 3: Обучение Модели

Для обучения модели мы используем метод fit(), который принимает входные данные и соответствующие целевые значения (в нашем случае это те же данные, так как автоэнкодер обучается на восстановление входных данных):

input_data = input_data.reshape((1, 4, 4))  # изменяем форму для LSTM

model.fit(input_data, input_data, epochs=200000)

Обратите внимание, что форма данных должна быть (батч, временные шаги, признаки), поэтому мы изменяем размерность массива.

Шаг 4: Оценка Результатов

После обучения модели, вы можете получить восстановленные данные:

reconstructed_data = model.predict(input_data)
print(reconstructed_data)

На выходе вы получите матрицу, которая близка к исходным данным, но может содержать некоторые небольшие искажения из-за природы обучения:

# Пример вывода
[[[ 3.9911306   2.9956746   7.989547    5.9939675 ]
  [ 0.9976706   0.99182177  2.0006196   1.9999651 ]
  [23.9897     17.996624   31.995388   24.006733  ]
  [ 6.0549197   5.9584255   8.023056    8.003849  ]]]

Заключение

В результате, мы успешно создали простой автоэнкодер для обработки матрицы целых чисел. Используя архитектуру LSTM, мы обеспечиваем возможность работы с последовательностями, что может быть особенно полезно, если ваши данные имеют временную зависимость. Построенная модель может быть дополнительно настроена путем изменения количества слоев, нейронов в слоях и гиперпараметров обучения. Попробуйте различные комбинации, чтобы достичь наилучших показателей восстановления для ваших конкретных данных.

Оцените материал
Добавить комментарий

Капча загружается...