Вопрос или проблема
Моя нейронная сеть не выдает ожидаемый результат после обучения в Python. Есть ли какая-либо ошибка в коде? Есть ли способ уменьшить среднюю квадратичную ошибку (MSE)?
Я пытался обучать (Запускать программу) сеть несколько раз, но она не обучается, вместо этого выдает ту же MSE и результат.
Вот данные, которые я использовал:
https://drive.google.com/open?id=1GLm87-5E_6YhUIPZ_CtQLV9F9wcGaTj2
Вот мой код:
# загрузка и оценка сохраненной модели
from numpy import loadtxt
from tensorflow.keras.models import load_model
# загрузка модели
model = load_model(‘ANNnew.h5’)
# суммирование модели.
model.summary()
# Начало модели
import numpy as np
import pandas as pd
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.models import Sequential
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# Импорт данных
X = pd.read_excel(r”C:\filelocation\Data.xlsx”,”Sheet1″).values
y = pd.read_excel(r”C:\filelocation\Data.xlsx”,”Sheet2″).values
# Деление данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.08, random_state = 0)
# Масштабирование признаков
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
# Инициализация ANN
model = Sequential()
# Добавление входного слоя и первого скрытого слоя
model.add(Dense(32, activation = ‘tanh’, input_dim = 4))
# Добавление второго скрытого слоя
model.add(Dense(units = 18, activation = ‘tanh’))
# Добавление третьего скрытого слоя
model.add(Dense(units = 32, activation = ‘tanh’))
#model.add(Dense(1))
model.add(Dense(units = 1))
# Компиляция ANN
model.compile(optimizer=”adam”, loss=”mean_squared_error”)
# Обучение ANN на обучающей выборке
model.fit(X_train, y_train, batch_size = 100, epochs = 1000)
y_pred = model.predict(X_test)
for i in range(5):
print(‘%s => %d (ожидается %s)’ % (X[i].tolist(), y_pred[i], y[i].tolist()))
plt.plot(y_test, color=”red”, label=”Тестовые данные”)
plt.plot(y_pred, color=”blue”, label=”Предсказанные данные”)
plt.title(‘Прогноз’)
plt.legend()
plt.show()
# сохранение модели и архитектуры в один файл
model.save(“ANNnew.h5”)
print(“Модель сохранена на диск”)
Выглядит так, что ваша ошибка улучшается (ошибка уменьшается с каждой эпохой), так что я не сказал бы, что сеть не обучается. Попробуйте посмотреть на график обучения (который будет иметь эпоху на оси x и потерю на оси y). Посмотрите, есть ли какие-либо скачки или странные паттерны в обучении. Если вы не видите примерно убывающей потери обучения, значит, у вас есть проблема.
Также возможно, что эта модель просто полностью перенастраивается на ваши данные, что приводит к слабым прогнозам на тестовом наборе. Сколько входов у вас есть? Почему вы используете три скрытых слоя? Попробуйте уменьшить размер вашей модели и посмотрите, улучшится ли ваш прогноз.
Судя по тому, что я вижу здесь, ваша модель имеет много возможностей для перенастройки. Вы обучаете эту модель всего на 70 точках данных. Что, по-моему, маловато. Вы можете попробовать увеличить ваши обучающие данные, а затем наблюдать за прогнозами и посмотреть, улучшились ли они, или вы можете уменьшить размер вашей модели и построить модель с меньшим количеством параметров.
Ответ или решение
Проблема, с которой вы столкнулись, может быть вызвана несколькими факторами. Давайте разберем ваш код и возможные причины, по которым нейронная сеть не дает ожидаемого результата после обучения. Кроме того, я предложу способы снижения средней квадратичной ошибки (MSE).
1. Проверка качества обучения
Первое, что необходимо сделать — это проанализировать график потерь (loss). Если вы заметили низкий, но стабильный уровень потерь, это может указывать на то, что ваша модель переобучается или не обучается должным образом.
history = model.fit(X_train, y_train, batch_size=100, epochs=1000, validation_data=(X_test, y_test))
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Loss over Epochs')
plt.legend()
plt.show()
2. Проверка размера модели и данных
С вашим объемом данных (около 70 точек) ваша модель может быть слишком сложной. Вот несколько вариантов:
-
Уменьшить размер сети. Попробуйте использовать один или два полносвязных слоя с меньшим количеством нейронов.
model = Sequential() model.add(Dense(16, activation='tanh', input_dim=4)) model.add(Dense(1))
-
Увеличить объем данных. Если возможно, попробуйте собрать или сгенерировать больше обучающих данных.
3. Регуляризация
Чтобы избежать переобучения, рассмотрите возможность добавления регуляризации. Например, вы можете использовать Dropout
:
from tensorflow.keras.layers import Dropout
model.add(Dense(32, activation='tanh'))
model.add(Dropout(0.5)) # Случайно отключает 50% нейронов
4. Изменение параметров обучения
- Изменение функции активации. Иногда использование ReLU вместо tanh может помочь. Попробуйте заменить:
model.add(Dense(32, activation='relu', input_dim=4))
- Настройка скорости обучения. Вы можете настроить скорость обучения оптимизатора:
from tensorflow.keras.optimizers import Adam
optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=optimizer, loss='mean_squared_error')
5. Нормализация данных
Вы уже делали нормализацию данных с помощью StandardScaler
, что хорошо. Убедитесь, что целевые значения (y) также нормализованы, если они имеют широкий диапазон значений.
6. Проверка данных
Убедитесь, что ваши данные не содержат аномалий или выбросов, которые могут влиять на обучение. Также стоит проверить, правильно ли вы загружаете данные из Excel.
7. Проверка на тестовых данных
После обучения и предсказаний проверьте результат на тестовых данных, чтобы убедиться, что у вас нет утечек данных (data leakage). Это может привести к переобучению, когда модель "запоминает" данные вместо того, чтобы обучаться.
Подведение итогов
Если после всех вышеуказанных шагов результаты по-прежнему не соответствуют ожиданиям, возможно, стоит пересмотреть выбор модели или глядеть на другие подходы (например, использование ансамблей моделей). Переобучение и недостаток данных — частые проблемы при работе с нейронными сетями, особенно с маленькими наборами данных.
Надеюсь, что эти советы помогут вам улучшить качество вашего обучения и добиться ожидаемых результатов!