gpt4 book ai didi

machine-learning - 神经网络为所有输入产生相似的模式

转载 作者:行者123 更新时间:2023-11-30 09:52:03 33 4
gpt4 key购买 nike

我正在尝试使用 Keras 中的时间序列数据训练 ANN。我有三个数据向量,它们被分解为滚动窗口序列(即向量 l)。

np.array([l[i:i+window_size] for i in range( len(l) - window_size)])

目标向量同样被加窗,因此神经网络输出是对下一个 window_size 个时间步长的目标向量的预测。所有数据均使用最小-最大缩放器进行标准化。它以 shape=(nb_samples, window_size, 3) 的形式输入神经网络。这是 3 个输入向量的图。

input vector plots

我从 ANN 收集到的唯一输出是下面的图。目标向量为蓝色,预测为红色(图已放大以使预测模式清晰)。预测向量以 window_size 间隔绘制,因此每个重复模式都是来自网络的预测。 enter image description here

我尝试了许多不同的模型架构、纪元数、激活函数、短网络和胖网络、瘦网络、高网络。这是我当前的(有点偏离)。

Conv1D(64,4, input_shape=(None,3)) ->
Conv1d(32,4) ->
Dropout(24) ->
LSTM(32) ->
Dense(window_size)

但是我所做的任何尝试都不会影响神经网络输出这种重复模式。我一定是误解了 Keras 中的时间序列或 LSTM。但我现在很迷茫,所以非常感谢任何帮助。我已在此存储库中附加了完整的代码。

https://github.com/jaybutera/dat-toy

最佳答案

我稍微研究了一下你的代码,我想我有一些建议可以让你走上正确的轨道。该代码似乎与您的图表不完全匹配,但我认为从那时起您已经对其进行了一些调整。无论如何,有两个主要问题:

  1. 最大的问题在于数据准备步骤。您基本上拥有向后的数据形状,因为您有 X 的单个时间步长输入和 Y 的时间序列。您的输入形状是 (18830, 1, 8),而您真正想要的是 (18830, 30, 8)以便将完整的 30 个时间步输入到 LSTM 中。否则,LSTM 仅在一个时间步上运行,并没有真正的用处。为了解决这个问题,我将 common.py 中的行从

    更改为

    X = X.reshape(X.shape[0], 1, X.shape[1])

    X = windowfy(X, winsize)

    同样,根据我从绘图函数收集到的目标数据,输出数据可能应该只有 1 个值。当然在某些情况下您想要预测整个时间序列,但我不知道在这种情况下这是否是您想要的。我将 Y_train 更改为使用 fuels 而不是 fuels_w,这样它只需预测时间序列的一个步骤。

  2. 对于这个简单的网络架构来说,训练 100 个周期可能太多了。在某些情况下,当我运行它时,看起来好像发生了一些过度拟合。观察网络中损失的减少,看起来可能只需要 3-4 个 epoch。

这是经过我提到的调整后 3 个训练周期后的预测图。这不是一个很好的预测,但看起来至少现在是在正确的轨道上。祝你好运! Predictions after three epochs

编辑:预测多个输出时间步长的示例:

from sklearn import datasets, preprocessing
import numpy as np
from scipy import stats
from keras import models, layers

INPUT_WINDOW = 10
OUTPUT_WINDOW = 5 # Predict 5 steps of the output variable.
# Randomly generate some regression data (not true sequential data; samples are independent).
np.random.seed(11798)
X, y = datasets.make_regression(n_samples=1000, n_features=4, noise=.1)
# Rescale 0-1 and convert into windowed sequences.
X = preprocessing.MinMaxScaler().fit_transform(X)
y = preprocessing.MinMaxScaler().fit_transform(y.reshape(-1, 1))
X = np.array([X[i:i + INPUT_WINDOW] for i in range(len(X) - INPUT_WINDOW)])
y = np.array([y[i:i + OUTPUT_WINDOW] for i in range(INPUT_WINDOW - OUTPUT_WINDOW,
len(y) - OUTPUT_WINDOW)])
print(np.shape(X)) # (990, 10, 4) - Ten timesteps of four features
print(np.shape(y)) # (990, 5, 1) - Five timesteps of one features

# Construct a simple model predicting output sequences.
m = models.Sequential()
m.add(layers.LSTM(20, activation='relu', return_sequences=True, input_shape=(INPUT_WINDOW, 4)))
m.add(layers.LSTM(20, activation='relu'))
m.add(layers.RepeatVector(OUTPUT_WINDOW))
m.add(layers.LSTM(20, activation='relu', return_sequences=True))
m.add(layers.wrappers.TimeDistributed(layers.Dense(1, activation='sigmoid')))
print(m.summary())

m.compile(optimizer='adam', loss='mse')
m.fit(X[:800], y[:800], batch_size=10, epochs=60) # Train on first 800 sequences.
preds = m.predict(X[800:], batch_size=10) # Predict the remaining sequences.
print('Prediction:\n' + str(preds[0]))
print('Actual:\n' + str(y[800]))
# Correlation should be around r = .98, essentially perfect.
print('Correlation: ' + str(stats.pearsonr(y[800:].flatten(), preds.flatten())[0]))

关于machine-learning - 神经网络为所有输入产生相似的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43563224/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com