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