如何在预测时定期更新我的LSTM网络?

时间:2018-11-09 10:30:54

标签: python tensorflow keras deep-learning lstm

我想要一个可以实时检测网络异常的系统。我在Keras中有一个LSTM网络模型,可以实时预测时间序列数据。

我已经用部分数据对它进行了训练,现在我试图对测试数据中的每个样本提前预测一个步骤。

现在的问题是,每当数据模式偏离训练时的周期性模式时,该模型就会预测错误。但是,我要记住的是记住模式的不断变化并正确更新自身,以便当模式更改并变为周期性时,它应该能够预测新模式而忘记旧的模式,而现在旧模式根本不是周期性的趋势。这有可能吗?

我是深度学习的新手。

到目前为止,我从该链接中学到的LSTM是它基于最近的输入进行预测,并且可以记住给出的最后一个序列。

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

该模型的代码在下面给出

def build_model(layers):
model = Sequential()
model.add(LSTM(input_dim = 1, output_dim= 50, return_sequences = True))
model.add(Dropout(0.5))
model.add(LSTM(256,return_sequences = False))
model.add(Dropout(0.5))
'''model.add(LSTM(256,return_sequences = False))
model.add(Dropout(0.5))'''
model.add(Dense(1))
model.add(Activation("linear"))
model.compile(loss="mse", optimizer="adam")
print (model.summary())
return model

训练和测试拆分代码为

class Dataloader:
def __init__(self,seq_len):
    df = pd.read_csv("Patternchange1.csv")
    j = 0
    df = pd.DataFrame(df['Pattern'])
    x = df.values #returns a numpy array
    min_max_scaler = preprocessing.MinMaxScaler()
    df = pd.DataFrame(min_max_scaler.fit_transform(x))
    series = df.copy()
    window_size = 50
    series_s = series.copy()
    for i in range(window_size):
        series = pd.concat([series, series_s.shift(-(i+1))], axis = 1)
    series.dropna(axis=0, inplace=True)
    nrow = round(0.25*series.shape[0])
    #print (nrow)
    self.train = series.iloc[:nrow, :]
    self.test = series.iloc[nrow:,:]
    train_X = self.train.iloc[:,:-1]
    train_y = self.train.iloc[:,-1]
    test_X = self.test.iloc[:,:-1]
    test_y = self.test.iloc[:,-1]
    train_X = train_X.values
    self.train_y = train_y.values
    self.test_X = test_X.values
    self.test_y = test_y.values
    self.train_X = train_X.reshape(train_X.shape[0],train_X.shape[1],1)

我正在通过以下方式进行预测

x_test,y_test = data.get_test_data()
#print (x_test)
predicted_data = []
for data in x_test:
data = data.reshape(1,data.shape[0],1)
predicted = model.predict(data)
predicted = np.reshape(predicted,predicted.size)
#print (predicted)
predicted_data.append(predicted)

数据具有以下模式:

  1. 首先是2000行的正弦波
  2. 然后将2000行的0和1交替交替显示
  3. 最后一次是1000行的正弦波 我希望它像以前一样使用50的窗口训练500行,然后希望它在预测数据集的其余部分时进行更新,同时继续进行预测,并学习中间如何交替使用0和1趋势和正弦波可以忘记。任何对此的建议将不胜感激。

我还认为可能的解决方案是使LSTM有状态。那会帮助吗?

0 个答案:

没有答案