Вопрос или проблема
Точность после обучения моей модели очень низкая. Почему?
Ссылка на пример набора данных: https://drive.google.com/file/d/1kSZNlR0AKgLNSITq_pVxXA6eBJ5nzB5Q/view?usp=sharing
Вот входные данные:
- Вход 1) 6-50 (в текущем наборе данных, для простоты, у нас только
6
- Вход 2) 0-3168
- Вход 3) Последовательность (1-13 + 0 для маски)
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, Concatenate, Masking
import numpy as np
import pandas as pd
def train(max_path_len, num_outputs, csv_file):
sequence_length = max_path_len
num_classes = num_outputs
embedding_dim = 8
sequenza_len = num_outputs + 1 # +1 из-за 0 дополнения
stack_input = Input(shape=(1,), name="stack")
stack_dense = Dense(8, activation='relu')(stack_input)
cluster_input = Input(shape=(1,), name="cluster")
cluster_dense = Dense(8, activation='relu')(cluster_input)
sequenza_input = Input(shape=(sequence_length,), name="sequenza")
masked_sequenza = Masking(mask_value=0)(sequenza_input)
embedded_sequenza = Embedding(input_dim=sequenza_len, output_dim=embedding_dim, input_length=sequence_length, mask_zero=True)(masked_sequenza)
lstm_out = LSTM(128)(embedded_sequenza)
lstm_dense = Dense(8, activation='relu')(lstm_out)
merged = Concatenate()([stack_dense, cluster_dense, lstm_dense])
output = Dense(num_classes, activation='softmax', name="output")(merged)
model = Model(inputs=[stack_input, cluster_input, sequenza_input], outputs=output)
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])
data = pd.read_csv(csv_file)
sequenza_data = data['sequenza'].apply(lambda x: [int(i) for i in x.split('-')]).tolist()
stack_data = data['stack'].to_numpy()
cluster_data = data['cluster'].to_numpy()
sequenza_data = np.array(sequenza_data)
outputN = [f"output{o}" for o in range(1, num_outputs+1)]
output_data = data[outputN].to_numpy()
model.fit(
[stack_data, cluster_data, sequenza_data],
output_data,
batch_size=128,
epochs=50,
validation_split=0.2
)
train(max_path_len=9, num_outputs=13, "./dataset.csv")
Ответ или решение
Причины плохой точности модели LSTM
Если ваша модель LSTM показывает плохую точность после обучения, необходимо рассмотреть несколько ключевых аспектов, которые могут влиять на качество предсказаний. Ниже приведены основные моменты, которые стоит проверить и учесть в вашей реализации.
1. Качество данных
Первый и наиболее важный аспект — это качество входных данных. Проверьте следующее:
- Объем данных: Модель машинного обучения требует достаточного объема данных для понимания паттернов. Вы указали, что у вас есть только один пример входных данных для входа (Input 1). Убедитесь, что у вас достаточно примеров для каждого сценария.
- Разнообразие данных: Ваша модель должна обучаться на репрезентативном множестве данных, которое включает в себя все проявления целевой переменной. Однородность данных может привести к плохо обученной модели.
2. Структура модели
Обратите внимание на структуру вашей модели:
- Количество слоев и нейронов: Возможно, LSTM-слой требует больше нейронов для извлечения важных признаков из последовательных данных. Попробуйте увеличить размер LSTM и добавить дополнительные слои.
- Функция активации: Вы используете
relu
для Dense-слоев. Хотяrelu
хорошо работает в большинстве задач, для некоторых случаев стоит рассмотретьtanh
, особенно в LSTM, где она может лучше захватывать информацию, находящуюся на разных временных масштабах.
3. Гиперпараметры
Параметры, которые вы используете для компиляции и настройки модели, могут также повлиять на производительность:
- Размер батча: 128 может быть слишком большим или слишком маленьким в зависимости от размера вашего набора данных. Экспериментируйте с различными размерами батчей.
- Количество эпох: Вы указали 50 эпох для обучения. Возможно, стоит увеличить их количество, наблюдая за прогрессом на валидационном наборе.
4. Обработка последовательностей
Имеются некоторые особенности работы с последовательными данными в вашей модели:
- Параметр Masking: Убедитесь, что вы правильно задаете маску. Если не все ваши последовательности имеют одинаковую длину, может возникнуть путаница. Убедитесь, чтоPadding (дополнение последовательностей до одной длины) выполнено корректно.
- Значения сеанса: Если giriş (входные данные) и c_values (выходные значения) не синхронизированы должным образом, это может негативно сказаться на результатах.
5. Проверка функции потерь
Вы используете categorical_crossentropy
в качестве функции потерь. Убедитесь, что выходные данные имеют правильный формат для этой функции. Если ваши данные размечены с помощью one-hot-encoding
, это будет корректно; в противном случае стоит использовать sparse_categorical_crossentropy
.
6. Оценка и валидация
В процессе тестирования и валидации:
- Обязательно используйте разделение на обучающую и валидационную выборки, чтобы избежать переобучения модели.
- Оцените модель на тестовом наборе данных после завершения обучения для получения итоговой метрики точности.
Заключение
Погружение в детали вашей архитектуры, данных и процесса обучения может помочь выявить причины низкой точности модели. Рекомендуется проверить все вышеуказанные аспекты и произвести соответствующие коррективы. Обучение сложной модели, такой как LSTM, требует тщательного подбора параметров и постоянного анализа, чтобы добиться приемлемых результатов. Удачи в разработке вашей модели!