Keras网络产生逆预测

时间:2019-01-14 21:03:18

标签: python tensorflow machine-learning keras

我有一个时间序列数据集,我正在尝试训练网络,使其过度拟合(显然,这只是第一步,然后我将与过度拟合作斗争)。

网络有两层: LSTM(32个神经元)和密集(1个神经元,未激活)

训练/模型具有以下参数: epochs: 20steps_per_epoch: 100loss: "mse"optimizer: "rmsprop"

TimeseriesGenerator产生具有以下各项的输入序列:length: 1sampling_rate: 1batch_size: 1

我希望网络会记住这么小的数据集(我尝试过更复杂的网络无济于事),训练数据集的损失几乎为零。并非如此,当我在 training 集合上将结果可视化时是这样的:

y_pred = model.predict_generator(gen)
plot_points = 40
epochs = range(1, plot_points + 1)
pred_points = numpy.resize(y_pred[:plot_points], (plot_points,))
target_points = gen.targets[:plot_points]
plt.plot(epochs, pred_points, 'b', label='Predictions')
plt.plot(epochs, target_points, 'r', label='Targets')
plt.legend()
plt.show()

我得到:

predictions and targets chart

预测的幅度较小,但与目标恰好相反。顺便说一句。这是没有记住的,即使对于算法完全没有训练的测试数据集也是如此,似乎我的网络没有记住数据集,而是学会了否定输入值并将其略微缩小。 知道为什么会发生这种情况吗?看来,优化器不应该收敛到该解决方案上(损失相当大)。

编辑(我的代码的一些相关部分):

train_gen = keras.preprocessing.sequence.TimeseriesGenerator(
        x,
        y,
        length=1,
        sampling_rate=1,
        batch_size=1,
        shuffle=False
    )

model = Sequential()
model.add(LSTM(32, input_shape=(1, 1), return_sequences=False))
model.add(Dense(1, input_shape=(1, 1)))

model.compile(
    loss="mse",
    optimizer="rmsprop",
    metrics=[keras.metrics.mean_squared_error]
)

history = model.fit_generator(
    train_gen,
    epochs=20,
    steps_per_epoch=100
)

编辑(不同的,随机生成的数据集):

enter image description here

我不得不将LSTM神经元的数量增加到256,在以前的设置(32个神经元)下,蓝线几乎持平。但是,随着增加,出现了相同的模式-幅度稍小的反向预测

编辑(目标移动+1):

enter image description here

与预测相比,将目标移动1不会产生更好的拟合度。注意图中突出显示的部分不仅是交替的,而且在那里更明显。

EDIT(长度增加到2 ... TimeseriesGenerator(length=2, ...)):

enter image description here

使用length=2时,预测会停止如此紧密地跟踪目标,但总体反演模式仍然存在。

2 个答案:

答案 0 :(得分:4)

编辑:作者发表评论后,我认为这不是正确的答案,但我将其保留以供后代使用。

很好的问题,答案是由于Time_generator的工作原理!显然,不是抓取具有相同索引的x,y对(例如输入mro(H)-> [H] + merge([[E, B, C, A, object], [F, B, D, A, object], [G, C, D, A, object]]) merge([[E, ...], [F, ...], [G, ...]]) -> [E] + merge([[B, C, A, object], [F, B, D, A, object], [G, C, D, A, object]]) merge([[B, ...], [F, ...], [G, ...]]) -> [F] + merge([[B, C, A, object], [B, D, A, object], [G, C, D, A, object]]) merge([[B, ...], [B, ...], [G, ...]]) -> [B] + merge([[C, A, object], [D, A, object], [G, C, D, A, object]]) 来输出目标mro(H)-> [H] + merge([[E, B, C, A, object], [F, B, D, A, object], [G, C, D, A, object]]) merge([[E, ...], [F, ...], [G, ...]]) -> [E] + merge([[B, C, A, object], [F, B, D, A, object], [G, C, D, A, object]]) merge([[B, ...], [F, ...], [G, ...]]) -> [F] + merge([[B, C, A, object], [B, D, A, object], [G, C, D, A, object]]) merge([[B, ...], [B, ...], [G, ...]]) -> [B] + merge([[C, A, object], [D, A, object], [G, C, D, A, object]]) merge([[C, ...], [D, ...], [G, ...]]) -> [G] + merge([[C, A, object], [D, A, object], [C, D, A, object]]) merge([[C, ...], [D, ...], [C, ...]]) -> [C] + merge([[A, object], [D, A, object], [D, A, object]]) merge([[A, ...], [D, ...], [D, ...]]) -> [D] + merge([[A, object], [A, object], [A, object]]) merge([[A, object], [A, object], [A, object]]) -> [A] + merge([[object], [object], [object]]) merge([[object], [object], [object]]) -> [object] + merge([]) merge([]) -> [] # base case ),而是抓取偏移量为1(所以x[0]y[0])的目标。

因此,以偏移1绘制y将产生所需的拟合。

要模拟的代码:

x[0]

正确的绘图:

y[1]

输出,请注意拟合度如何不再反转,并且非常精确:

With proper offset on the <code>target_points</code>

这是偏移量不正确时的外观:

Without proper offset

答案 1 :(得分:3)

您说您的网络“刚刚学会否定输入值并将其稍微缩小”。我不这么认为。您所看到的很可能只是网络性能不佳,而只是预测先前的值(但可以按您所说的进行扩展)。这个问题是我一次又一次看到的。 Here is another exampleanother,此问题。另外,请记住,将数据移动一个就很容易欺骗自己。您很有可能只是将错误的预测及时移回并出现重叠。