当前位置:   article > 正文

算法学习笔记:Bi-LSTM和Bi-GRU_bi-gru讲解

bi-gru讲解
这篇文章的作为前几篇RNN\LSTM\RNN的后续之作,主要就是补充一个这两个哥的变体,想详细了解RNN\LSTM\GRU的详细理论和公式推导以及代码的请前往下面链接:

算法学习笔记:循环神经网络(Recurrent Neural Network)-CSDN博客

算法学习笔记:长短期记忆网络(Long Short Term Memory Network)-CSDN博客

算法学习笔记:门控循环单元(Gate Recurrent Unit)-CSDN博客

一、Bi-LSTM

Bi-LSTM(Bidirectional Long Short Term Memory)网络是是一种基于长短期记忆网络(LSTM)的时间序列预测方法;它结合了双向模型和LSTM的门控机制,由2个独立的LSTM网络构成。当Bi-LSTM处理序列数据时,输入序列会分别以正序和逆序输入到2个LSTM网络中进行特征提取,并将将2个输出向量(即提取后的特征向量)进行拼接后形成的输出向量作为该时间步的最终输出

(其实就是两个LSTM组合在一起,具体的原理和结构和LSTM一样啦)

Bi-LSTM的模型设计理念是使t时刻所获得特征数据同时拥有过去和将来之间的信息;此外,值得一提的是,Bi-LSTM中的2个LSTM网络参数是相互独立的,它们只共享同一批序列数据。

二、Bi-GRU

Bi-GRU(Bidirectional Gated Recurrent Unit)是一种基于门控循环单元(GRU)的时间序列预测方法;它结合了双向模型和门控机制,整体结构与单元体结构与GRU一致,因此也能够有效地捕捉时间序列数据中的时序关系。Bi-GRU的整体结构由两个方向的GRU网络组成,一个网络从前向后处理时间序列数据,另一个网络从后向前处理时间序列数据;这种双向结构可以同时捕捉到过去和未来的信息,从而更全面地建模时间序列数据中的时序关系。

(也就是两个GRU组会在一起啦,结构啥的都一样!)

三、Bi-LSTM和Bi-GRU源码

  1. import numpy as np
  2. from numpy import savetxt
  3. import pandas as pd
  4. from pandas.plotting import register_matplotlib_converters
  5. from pylab import rcParams
  6. import matplotlib.pyplot as plt
  7. from matplotlib import rc
  8. from sklearn.model_selection import train_test_split
  9. from sklearn.preprocessing import MinMaxScaler, StandardScaler
  10. from sklearn.metrics import r2_score
  11. import tensorflow as tf
  12. from tensorflow import keras
  13. from keras.optimizers import Adam,RMSprop
  14. import os
  15. import tensorflow as tf
  16. tf.config.set_visible_devices(tf.config.list_physical_devices('GPU'), 'GPU')
  17. register_matplotlib_converters()
  18. #plt.rcParams["font.sans-serif"] = [""]# 指定默认字体
  19. pd.set_option('display.max_columns', None) # 结果显示所有列
  20. pd.set_option('display.max_rows', None) # 结果显示所行行
  21. #>>>>>>>>>>>>数据预处理
  22. #1.训练集(New-train)数据处理
  23. source = 'New-train.csv'
  24. df_train = pd.read_csv(source, index_col=None)
  25. df_train = df_train[['设置你的数据表头']]
  26. source = 'New-test.csv'
  27. df_test = pd.read_csv(source, index_col=None)
  28. df_test = df_test[['设置你的数据表头']]
  29. train_size = int(len(df_train))
  30. test_size = int(len(df_test))
  31. train = df_train.iloc[0:train_size]
  32. test = df_test.iloc[0:test_size]
  33. print(len(train), len(test))
  34. def training_data(X, y, time_steps=1):
  35. Xs, ys = [], []
  36. for i in range(len(X) - time_steps):
  37. v = X.iloc[i:(i + time_steps)].values
  38. Xs.append(v)
  39. ys.append(y.iloc[i + time_steps])
  40. return np.array(Xs), np.array(ys)
  41. time_steps = 10
  42. X_train, y_train = training_data(train.loc[:, '设置你的数据表头'], train.*, time_steps)
  43. x_test, y_test = training_data(test.loc[:,'设置你的数据表头'], test.*, time_steps)
  44. #构建模型
  45. # 单层双尾lstm
  46. def model_BiLSTM(units):
  47. model = keras.Sequential()
  48. #Input Layer
  49. model.add(keras.layers.Bidirectional(
  50. keras.layers.LSTM(
  51. units=units,
  52. activation="relu",
  53. input_shape=(X_train.shape[1], X_train.shape[2])
  54. )))
  55. model.add(keras.layers.Dropout(0.2))
  56. #Hidden Layer
  57. model.add(keras.layers.Dense(1))
  58. model.compile(loss='mse', optimizer=Adam(learning_rate=0.001, clipvalue = 0.2))
  59. return model
  60. # 单层双尾GRU
  61. def model_BiGRU(units):
  62. model = keras.Sequential()
  63. #input
  64. model.add(keras.layers.Bidirectional(
  65. keras.layers.GRU(
  66. units=units,
  67. activation="relu",
  68. input_shape=(X_train.shape[1], X_train.shape[2])
  69. )))
  70. model.add(keras.layers.Dropout(0.2))
  71. model.add(keras.layers.Dense(1))
  72. model.compile(loss='mse', optimizer='adam')
  73. return model
  74. #训练模型
  75. def fit_model(model):
  76. #早停机制,防止过拟合
  77. early_stop = keras.callbacks.EarlyStopping(
  78. monitor='val_loss',
  79. min_delta=0.0,#min_delta=0.0 表示如果训练过程中的指标没有发生任何改善,即使改善非常微小,也会被视为没有显著改善
  80. patience=2000)#表示如果在连续的 2000 个 epoch 中,指标没有超过 min_delta 的改善,训练将被提前停止
  81. history = model.fit( # 在调用model.fit()方法时,模型会根据训练数据进行参数更新,并在训练过程中逐渐优化模型的性能
  82. X_train, y_train, # 当训练完成后,模型的参数就被更新为训练过程中得到的最优值
  83. epochs=400, # 此时model已经是fit之后的model,直接model.predict即可(千万不要model=model.fit(),然后再model.predict)
  84. validation_split=0.1,
  85. batch_size=12600,
  86. shuffle=False,
  87. callbacks=[early_stop])
  88. return history
  89. lstm_n64 = model_BiLSTM(64)
  90. GRU = model_BiGRU(64)
  91. #这里只是写了训练模型的代码,预测的话要根据自己的数据结构以及想要的效果来写喔

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/449833
推荐阅读
相关标签
  

闽ICP备14008679号