- Вопрос или проблема
- Matlab – Deep Learning Toolbox
- Python – TensorFlow – Keras
- Ответ или решение
- Почему простая нейронная сеть TensorFlow показывает плохие результаты в задаче регрессии?
- 1. Архитектура и активационные функции
- 2. Параметры обучения
- 3. Препроцессинг данных
- 4. Условия обучения
- 5. Количество эпох и размер пакета
- 6. Мониторинг метрик
- Заключение
Вопрос или проблема
Я пытаюсь реализовать очень простую однослойную МЛП для игрушечной задачи регрессии с одной переменной (размерность = 1) и одной целью (размерность = 1). Это простая задача подгонки кривой с нулевым шумом.
Matlab – Deep Learning Toolbox
Используя обратное распространение ошибки Левенберга-Маркуарда на МЛП с одним скрытым слоем из 100 нейронов и активацией гиперболическим тангенсом, я получил довольно хорошие результаты с почти нулевыми усилиями:
MSE = 7.18e-08
Редактировать:
Это рабочий код matlab. Обратите внимание, что функция “feedforwardnet(100)” просто создает объект сети с одним скрытым слоем из 100 нейронов и активацией tanh и выходным слоем с линейной активацией:
net = feedforwardnet(100);
net.trainParam.min_grad = 1e-25;
net.trainParam.max_fail = 50;
net.trainParam.epochs = 500;
%net1.trainParam.showWindow = false;
net.inputs{1,1}.processFcns = {};
net.outputs{1,2}.processFcns = {};
net = train(net,Train_Vars,Train_Target);
Test_Predictions = net(Test_Vars);
Accuracy = msemetric({Test_Predictions},{Test_Target});
Python – TensorFlow – Keras
С теми же настройками сети, которые я использовал в matlab, почти не происходит обучения. Невероятно, как бы я ни старался настроить параметры обучения или сменить оптимизатор.
MSE = 0.12900154
Я могу добиться чего-то лучшего, используя активации RELU для скрытого слоя, но мы все равно далеки:
MSE = 0.0582045
Вот код, который я использовал в Python:
# ИМПОРТ БИБЛИОТЕК
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
# ИМПОРТ НАБОР ДАННЫХ ИЗ CSV ФАЙЛА, ПЕРЕМЕШАТЬ ОБУЧАЮЩИЙ НАБОР
# И СОЗДАНИЕ МАССИВА NUMPY ДЛЯ ОБУЧЕНИЯ (ДАННЫЕ УЖЕ НОРМАЛИЗОВАНЫ)
dataset_path = "C:/Users/Rob/Desktop/Learning1.csv"
Learning_Dataset = pd.read_csv(dataset_path
, comment="\t",sep=","
,skipinitialspace=False)
Learning_Dataset = Learning_Dataset.sample(frac = 1) # ПЕРЕМЕШИВАНИЕ
test_dataset_path = "C:/Users/Rob/Desktop/Test1.csv"
Test_Dataset = pd.read_csv(test_dataset_path
, comment="\t",sep=","
,skipinitialspace=False)
Learning_Target = Learning_Dataset.pop('Target')
Test_Target = Test_Dataset.pop('Target')
Learning_Dataset = np.array(Learning_Dataset,dtype = "float32")
Test_Dataset = np.array(Test_Dataset,dtype = "float32")
Learning_Target = np.array(Learning_Target,dtype = "float32")
Test_Target = np.array(Test_Target,dtype = "float32")
# ОПРЕДЕЛЕНИЕ ПРОСТОЙ МЛП МОДЕЛИ
inputs = tf.keras.layers.Input(shape=(1,))
x = tf.keras.layers.Dense(100, activation='relu')(inputs)
y = tf.keras.layers.Dense(1)(x)
model = tf.keras.Model(inputs=inputs, outputs=y)
# ОБУЧЕНИЕ МОДЕЛИ
opt = tf.keras.optimizers.RMSprop(learning_rate = 0.001,
rho = 0.9,
momentum = 0.0,
epsilon = 1e-07,
centered = False)
early_stop = keras.callbacks.EarlyStopping(monitor="val_loss", patience=100)
model.compile(optimizer = opt,
loss="mse",
metrics = ['mse'])
model.fit(Learning_Dataset,
Learning_Target,
epochs=500,
validation_split = 0.2,
verbose=0,
callbacks=[early_stop],
shuffle = False,
batch_size = 100)
# ИНФЕРЕНЦИЯ И ПРОВЕРКА ТОЧНОСТИ
Predictions = model.predict(Test_Dataset)
Predictions = Predictions.reshape(10000)
print(np.square(np.subtract(Test_Target,Predictions)).mean()) # MSE
plt.plot(Test_Dataset,Test_Target,'o',Test_Dataset,Predictions,'o')
plt.legend(('Цель','Прогноз Модели'))
plt.show()
Что я делаю не так?
Спасибо
Я не уверен, какую функцию обучения сети использует ваш MATLAB feedforwardnet. Также, скорее всего, функция активации в вашем MATLAB net – ‘tansig’. Попробуйте использовать функцию активации ‘tanh’ в вашем коде python/keras.
Ответ или решение
Почему простая нейронная сеть TensorFlow показывает плохие результаты в задаче регрессии?
Когда вы сталкиваетесь с проблемами в производительности нейронной сети, важно рассмотреть множество факторов, которые могут способствовать созданию модели с низкой точностью. Ваша ситуация, в которой вы используете простую однослойную многослойную перцептронную (MLP) модель в TensorFlow для регрессионной задачи, задает несколько важных вопросов, на которые стоит обратить внимание.
1. Архитектура и активационные функции
В вашем случае вы используете 100 нейронов с активацией ReLU. Однако в MATLAB вы применяете гиперболический тангенс (tansig
). Это может кардинально влиять на результаты, поскольку тип активационной функции влияет на способность модели обучаться.
Рекомендация: Попробуйте заменить ReLU на tanh
в вашей модели Keras. Это может помочь лучше обобщить данные.
Пример изменения:
x = tf.keras.layers.Dense(100, activation='tanh')(inputs)
2. Параметры обучения
Обратите внимание на параметры оптимизации и обучения, используемые в TensorFlow. Ваша модель использует RMSprop, который может быть не самым подходящим выбором для гладкой функции потерь, как в вашем случае. Попробуйте адаптировать параметры обучения к более стандартному SGD или Adam.
Пример:
opt = tf.keras.optimizers.Adam(learning_rate=0.001)
3. Препроцессинг данных
Хотя вы упомянули, что данные уже нормализованы, стоит проанализировать, как именно вы их обрабатываете. Обычно, для задач регрессии полезно убедиться, что ваши данные имеют хотя бы немного сложные зависимости, чтобы избежать переобучения простой модели.
Убедитесь, что:
- Данные имеют нормальное распределение.
- Все переменные правильно масштабироваются, и ваши входные данные хорошо представлены.
4. Условия обучения
Обратите внимание на использование EarlyStopping
. Параметр patience
может быть слишком большим для вашей задачи, что затрудняет наблюдение за процессом. Попробуйте использовать меньшее значение или вообще отключить этот параметр в процессе начального обучения, чтобы лучше проанализировать, как проходит процесс оптимизации.
5. Количество эпох и размер пакета
Вы используете 500 эпох и пакетный размер 100. В некоторых случаях, как обучение с меньшими пакетами и увеличением числа эпох может дать лучшие результаты. Попробуйте увеличить количество эпох до 1000.
6. Мониторинг метрик
Выводите дополнительные метрики, такие как mae
(средняя абсолютная ошибка) и визуализируйте процесс обучения для лучшего понимания того, как ваша модель реагирует на процесс обучения.
Пример улучшенного вызова для model.compile
:
model.compile(optimizer=opt, loss='mse', metrics=['mae', 'mse'])
Заключение
Регрессия с нейронными сетями требует тщательной настройки и тестирования. Все пункты, указанные выше, могут иметь значительное влияние на качество ваших предсказаний. Проверьте каждый аспект, проведите эксперименты и тщательно анализируйте полученные результаты. Таким образом, вы сможете улучшить свою модель и достичь желаемой точности в задаче регрессии.