Огромный всплеск в обучении после 5000 эпох (LSTM)

#tensorflow #optimization #loss-function #spike

#tensorflow #оптимизация #потеря-функция #всплеск

Вопрос:

Я борюсь с оптимизацией LSTM NN, позвольте мне объяснить, что я пытаюсь сделать 🙂

—> У меня есть набор данных, скажем, с ежедневной температурой моего местоположения, начиная с 2015 года.

—> Я хочу предсказать температуру завтрашнего дня на основе температур последних дней 30.

Итак, в основном то, что я сделал, — это таблица panda с 31 столбцом и 2 тыс. строк. Каждая строка представляет температуры за 31-дневный период

 [[18.5, 19.6, 15.2, 16.3 ... 12.4, 13.2]
[19.6, 15.2, 16.3, 12.6 ... 13.2, 15.5]
[......]]
  

Затем я создал ту же таблицу, но с изменением температуры каждого дня по сравнению с предыдущим днем в %

Затем я выделил первые 30 строк моей таблицы в качестве входных данных, а последнюю строку — в качестве результата. Поэтому я пытаюсь предсказать%-ное изменение температуры завтрашнего дня на основе%-ных изменений за последние дни.

Итак, я написал этот код :

 import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt


   
def visualize_training_results(results):
    history = results.history
    plt.figure(figsize=(12, 4))
    plt.plot(history['loss'])
    plt.title('Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.show()

data_delta = [] data_base = pd.read_csv('data.csv')

length_data_base = len(data_base) for i in range(1, (length_data_base
- 1)):
    data_delta.append(round(((data_base.iloc[(i), 5]) - (data_base.iloc[(i - 1), 5])) / (data_base.iloc[(i - 1), 5]) * 100, 4))

training_set = pd.DataFrame([], columns= ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'outputs']) 

for j in range(31, (length_data_base - 1)):    
    data_train = pd.Series(data_delta[j - 31:j], index = training_set.columns)
    training_set = training_set.append(data_train, ignore_index = True)

training_data = training_set.drop(training_set.columns[[30]], axis='columns') training_labels = training_set.pop('outputs')

training_data_model = np.array(training_data) training_labels_model = np.array(training_labels)

training_data_model = training_data_model.reshape(len(training_data_model), 30, 1)

data_model = tf.keras.Sequential([

    layers.LSTM(30, return_sequences=True, activation= 'relu' , input_shape=(30,1)),
    layers.Dense(12, activation= 'relu'),
    layers.Dense(12, activation= 'relu'),
    layers.LSTM(10, activation= 'relu'),
    layers.Dense(1) ])

data_model.compile(loss = tf.losses.MeanSquaredError(),
                   optimizer = tf.optimizers.Adam()) data_model.summary()

results = data_model.fit(training_data_model, training_labels_model, batch_size = 300, epochs=10000)

visualize_training_results(results)
  

 Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 30, 30)            3840      
_________________________________________________________________
dense (Dense)                (None, 30, 12)            372       
_________________________________________________________________
dense_1 (Dense)              (None, 30, 12)            156       
_________________________________________________________________
lstm_1 (LSTM)                (None, 10)                920       
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 11        
=================================================================
Total params: 5,299
Trainable params: 5,299
Non-trainable params: 0
  

И сначала это работает отлично, но после 5000 эпох у меня огромный всплеск, и он никогда не возвращается к низким уровням потерь.

Вот картина моей потери по сравнению с эпохами Всплеск после 5000 эпох

% в моем наборе данных варьируется от -37 до 42 с большим количеством значений около 0, я пытался нормализовать его, но использование minmaxscaler заставляет меня терять большую степень детализации моих данных, я хочу иметь возможность прогнозировать увеличение на 40%, даже если в большинстве дней изменение составляет всего 0-3%.

Что я здесь делаю не так? Хороша ли архитектура NN даже для того, что я пытаюсь сделать? Должен ли я установить другую скорость обучения?

PS: Я новичок, поэтому, возможно, я сделал очень неправильные вещи: D.

Заранее спасибо!

Комментарии:

1. регулярно сохраняйте вашу модель. Затем загрузите модель перед скачком и продолжайте обучение

2. Или вы можете использовать планировщик скорости обучения с decay

3. Спасибо! Я увеличил размер пакета до 600, и, похоже, он работает нормально. Мне все еще интересно, не следует ли мне добавлять отсевы?

4. отсев предотвращает переобучение. Но прежде всего вы должны разделить свои данные на части обучения и проверки и рассчитать потери при проверке

5. И всегда используйте максимально возможный размер пакета