#neural-network #loss-function
#нейронная сеть #функция потерь
Вопрос:
Я пытаюсь построить простую сеть с пользовательской функцией потери. Я прогнозирую ИМТ на основе 25 различных характеристик. Мой набор данных несбалансирован, имеет выбросы и хочет лучше прогнозировать выбросы. Скорее, более важно лучше прогнозировать выбросы. Для моей пользовательской функции потерь я добавил условие, что если потеря превышает 2 единицы, то я хочу больше наказывать за эти наблюдения.
import keras.backend as K def custom_loss(y_true, y_pred): loss = K.abs(y_pred - y_true) wt = loss * 5 loss_mae = K.switch((loss gt; 2),wt,loss) return loss_mae model = Sequential() model.add(SimpleRNN(units=64, input_shape=(25, 1), activation="relu")) model.add(Dense(32, activation="linear")) model.add(Dropout(0.2)) model.add(Dense(1, activation="linear")) model.compile(loss=custom_loss, optimizer='adam') model.add(Dropout(0.1)) model.summary() model.fit(train_x, train_y)
примеры прогнозов после выполнения этого кода
preds=[[16.015867], [16.022823], [15.986835], [16.69895 ], [17.537468]] actual=[[18.68], [24.35], [18.07], [15.2 ], [13.78]]
Как вы можете видеть, прогноз для 2-го и 5-го obs все еще далек. Я делаю что-то не так в коде?
Ответ №1:
Одна вещь, которая очень неверна, заключается в том, что у вас никогда не должно быть выпадения выходного нейрона. Помимо этого:
- функция активации скрытых слоев не должна быть линейной (
model.add(Dense(32, activation="linear"))
должна бытьmodel.add(Dense(32, activation="relu"))
) - Нейронная сеть всегда должна быть в состоянии адаптироваться к вашим тренировочным данным, и это должно быть вашим состоянием отладки, прежде чем беспокоиться об обобщении, следовательно:
- Не используйте отсев (это только усложняет подгонку, вы можете поэкспериментировать с этим, как только вас заинтересует обобщение)
- Ваша сеть несколько крошечная,попробуйте сделать ее намного шире и посмотрите, улучшатся ли ваши прогнозы
- в целом MAE ведет себя гораздо хуже, чем обучающий сигнал MSE, который также автоматически сильно наказывает выбросы, почему бы не использовать его?
- Подумайте о нормализации ваших данных, нейронные сети хорошо работают со своими инициализациями по умолчанию, если и входные данные, и целевые объекты находятся в несколько ограниченном пространстве, предпочтительно в масштабе [-1, 1] или [0, 1].
Комментарии:
1. Спасибо @lejlot за ваш вклад. Я осознал свою ошибку при отсеве после публикации вопроса и исправил ее. Я также использовал minmaxscalar для нормализации. Я включил все ваши предложения, но, к сожалению, улучшения нет. Я добавил еще 6 слоев и использовал только mae. У вас есть еще какие-нибудь советы, чтобы улучшить это?
2. вместо добавления слоев я бы посоветовал вам сделать каждый из них намного больше. Я также совершенно сбит с толку, зачем вам использовать RNN для этой задачи, здесь нет времени, нет измерения различной длины, это похоже на задачу для обычного MLP.
3. Это мое требование к проекту, поэтому я использую RNN. Также, как вы думаете, может ли здесь помочь преобразование журнала? Мои данные искажены, но я читал на других сайтах/блогах, что для NN предпочтение отдается нормализованным данным.
4. требование или нет, начиная с обычной сети, вы ответите на вопрос, связана ли проблема с моделью или данными/кодом.