После загрузки CNN модели из файла в новом проекте модель показывает значительно худшие результаты по точности

Пытаюсь решить задачу классификации комментариев по четырём классам с помощью свёрточной нейронной сети. Подбираю гиперпараметры модели с помощью Optuna: filters, kernel_size, activation для слоя Conv1D, dropou_rate для слоя Dropout, число эпох и batch_size для обучения модели, даже random_seed подбираю. Получается accuracy = 0.8, и в целом модель неплохо решает свою задачу на выборке примеров. Сохраняю модель с помощью callbacks, точность воспроизводится. Однако если попытаться загрузить эту модель в другом проекте, в другой день после закрытия рабочей среды, то модель будет демонстрировать значительно более худший результат - на тех же данных, что она и обучалась, получается уже accuracy = 0.57. Подскажите, пожалуйста, почему так выходит? Как мне сохранить воспроизводимость модели, чтобы можно было просто использовать load_model и полноценно использовать модель в проекте.

Процесс обучения модели

# Random Seed
**random.set_seed(96)**

# Определение архитектуры модели
model = Sequential()
model.add(Embedding(input_dim = num_words, output_dim = 100, weights = [embedding_matrix], input_length = 100, trainable = False))
model.add(Conv1D(filters = 123, kernel_size = 3, activation = 'tanh')),
model.add(Dropout(rate = 0.49)),
model.add(GlobalMaxPooling1D())
model.add(Dense(4, activation = 'softmax'))

# Компиляция модели
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

checkpoint_path = 'model_checkpoint.h5'
checkpoint = ModelCheckpoint(checkpoint_path, monitor = 'val_accuracy', save_best_only = True, mode = 'max', verbose = 1)

# Преобразование меток классов в категориальное представление
y_train_categorical = to_categorical(y_train)
y_test_categorical = to_categorical(y_test)

# Обучение модели
model.fit(X_train, y_train_categorical, epochs = 30, batch_size = 16, validation_data = (X_test, y_test_categorical), callbacks = [checkpoint])

Загружаю модель из файла после выхода из среды разработки (Google Colab)

# Random Seed
**random.set_seed(96)**

# Определение архитектуры модели
model = Sequential()
model.add(Embedding(input_dim = num_words, output_dim = 100, weights = [embedding_matrix], input_length = 100, trainable = False))
model.add(Conv1D(filters = 123, kernel_size = 3, activation = 'tanh')),
model.add(Dropout(rate = 0.49)),
model.add(GlobalMaxPooling1D())
model.add(Dense(4, activation = 'softmax'))

# Компиляция модели
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

**model.load_weights('model_checkpoint.h5')**

y_test_categorical = to_categorical(y_test)

loss, accuracy = model.evaluate(X_test, y_test_categorical)
print('Loss:', loss)
print('Accuracy:', accuracy) 

Пытался инициализировать тот же random_seed, специально подбирал и его в Optuna. Данные делятся так же всегда при фиксированном random_state на тренировочную и валидационную выборки.


Ответы (0 шт):