Потеря NaN в CNN-LSTM на Keras для прогнозирования временных рядов - PullRequest
1 голос
/ 10 июля 2020

Я должен спрогнозировать временную зависимость влажности почвы от дождя и несколько временных рядов. Для всех из них у меня есть прогнозы, и единственное, что я могу сделать, это прогнозировать влажность почвы. c влияние.

Модель работает, но не как надо. Если вы посмотрите на это изображение введите описание изображения здесь , вы обнаружите, что прогнозируемая серия (желтый smsfu_sum) не зависит от дождя (apre c series), как в обучающем наборе. Мне нужен резкий пик прогноза, но изменение размеров ядра и объединения не помогает.

Итак, я попытался обучить модель CNN-LSTM на основе этого руководства

Вот код архитектуры модели:

def build_model(train, n_input):
# prepare data
train_x, train_y = to_supervised(train, n_input)
# define parameters
verbose, epochs, batch_size = 1, 20, 32
n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]
# reshape output into [samples, timesteps, features]
train_y = train_y.reshape((train_y.shape[0], train_y.shape[1], 1))
# define model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='softmax', input_shape=(n_timesteps,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='softmax'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(RepeatVector(n_outputs))
model.add(LSTM(200, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(100, activation='softmax')))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mse', optimizer='adam')
# fit network
model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
return model

Я использовал размер пакета = 32 и разделил данные с помощью функции:

def to_supervised(train, n_input, n_out=300):
# flatten data
data = train.reshape((train.shape[0]*train.shape[1], train.shape[2]))
X, y = list(), list()
in_start = 0
# step over the entire history one time step at a time
for _ in range(len(data)):
    # define the end of the input sequence
    in_end = in_start + n_input
    out_end = in_end + n_out
    # ensure we have enough data for this instance
    if out_end <= len(data):
        X.append(data[in_start:in_end, :])
        y.append(data[in_end:out_end, 2])
    # move along one time step
    in_start += 1
return array(X), array(y)

Используя n_input = 1000 и n_output = 480 (I на этот раз надо предсказать) Итак, первая итерация в этой сети приводит функцию потерь к Nan.

Как мне это исправить? В моих данных нет пропущенных значений, я отбрасывал каждые NaN.

...