用于时间序列预测的Keras上CNN-LSTM中的NaN损失

时间:2020-07-10 16:31:48

标签: tensorflow keras deep-learning time-series conv-neural-network

我必须根据降雨和一些时间序列来预测土壤湿润的时间依赖性。我已经预测了所有这些,而唯一要做的就是预测土壤湿润。

根据guide,我建立了一个CNN模型,因为Arima无法考虑外部随机影响。

是模型工作的,但不是应有的。 如果您看这张图片enter image description here,您会发现预测序列(黄色smsfu_sum)不像训练集中那样依赖降雨(雨流序列)。我希望在预测中达到一个高峰,但是更改内核的大小和池化无济于事。

因此,我尝试根据此guide

训练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(我必须对此进行预测) 因此,该网络上的第一次迭代会将损失函数趋向于Nan。

我应该如何解决?我的数据中没有缺失值,因此我删除了每个NaN。

0 个答案:

没有答案