model = Sequential() model.add(LSTM(10, activation = "tanh",input_shape=(window_size, 1))) model.add(Dense(1)) model.add(tfp.layers.DistributionLambda( lambda t: tfd.Normal(loc=t[...,0], scale=0.01*tf.math.softplus(t[...,1])), name='normal_dist')) # note this negloglik = lambda y, p_y: -p_y.log_prob(y) # note this opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(loss=negloglik, optimizer= opt) #model.compile(loss="mse", optimizer= opt)中,改为model.add(Dense(2)),测试集中的MAPE上升,怎么办
时间: 2023-06-20 11:08:00 浏览: 106
class6_LSTM_pythonLSTM_python实现的LSTM长短时记忆网络_RNN_gru_
当您将 `model.add(Dense(1))` 更改为 `model.add(Dense(2))` 后,您的模型将输出两个值,一个是均值,另一个是标准差。这表明您希望使用正态分布来拟合您的目标。但您需要相应地更改损失函数,使其适用于正态分布。可以使用负对数似然作为损失函数,然后使用 `tfd.Normal.log_prob(y)` 来计算概率密度。
以下是更改后的代码示例:
```
model = Sequential()
model.add(LSTM(10, activation="tanh", input_shape=(window_size, 1)))
model.add(Dense(2))
model.add(tfp.layers.DistributionLambda(
lambda t: tfd.Normal(loc=t[...,0], scale=0.01*tf.math.softplus(t[...,1])),
name='normal_dist'))
def negloglik(y, p_y):
return -tf.reduce_mean(p_y.log_prob(y))
opt = keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss=negloglik, optimizer=opt)
```
请注意,您还需要相应地调整您的训练代码,以便在训练期间使用 `tfd.Normal(loc=p_y[:,0], scale=tf.math.softplus(p_y[:,1]))` 来计算预测值的概率密度。
阅读全文