目录
介绍:
RNN,全称为循环神经网络(Recurrent Neural Network),是一种深度学习模型,它主要用于处理和分析序列数据。与传统的前馈神经网络不同,RNN具有循环连接,允许信息在网络中进行循环传递。
RNN的特点在于它可以利用前面的输入信息来影响当前的输出,从而捕捉序列数据中的时序关系。这使得它在处理语音识别、自然语言处理、机器翻译等任务时表现出色。
RNN的核心思想是将前一个时间步的输出作为当前时间步的输入,从而在神经网络中引入了记忆机制。这种记忆机制使得RNN可以处理任意长度的序列数据,并且能够对序列中的每个元素做出预测或生成。
然而,RNN在处理长序列时容易出现梯度消失或梯度爆炸的问题,导致模型无法有效学习长期依赖关系。为了解决这个问题,研究者提出了许多改进的RNN变体,如长短期记忆网络(LSTM)和门控循环单元(GRU)等。
总而言之,RNN是一种用于处理序列数据的神经网络模型,它的循环连接和记忆机制使得它能够捕捉序列中的时序关系,并在语音识别、自然语言处理等任务中取得了显著的成果。
LSTM,全称为长短期记忆网络(Long Short-Term Memory),是一种循环神经网络(RNN)的改进型结构,旨在解决传统RNN在处理长序列时可能出现的梯度消失或梯度爆炸问题。
LSTM的核心思想是引入了称为“门”的机制,以控制信息的流动和遗忘。具体来说,LSTM包含了三个关键的门:输入门(input gate)、遗忘门(forget gate)和输出门(output gate)。
输入门负责决定当前输入信息中哪些部分应该被保留下来,遗忘门负责决定前一个时间步的记忆中哪些信息应该被遗忘,输出门负责决定当前时间步的输出。
通过这些门的控制机制,LSTM能够有效地处理长期依赖关系,并且可以在需要的时候保留关键信息,遗忘不重要的信息。
LSTM模型在自然语言处理、机器翻译、语音识别等任务中被广泛使用,取得了显著的效果。它的设计思想也启发了其他一些门控型循环神经网络结构,比如门控循环单元(GRU)。
总而言之,LSTM是一种改进的循环神经网络结构,通过引入门控机制,解决了传统RNN模型中的梯度消失和梯度爆炸问题,能够有效地处理长序列和长期依赖关系。
数据:
from numpy import sqrt
from numpy import asarray
from pandas import read_csv
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
# load the dataset 汽车销售数据集
df = read_csv('monthly-car-sales.csv', header=0, index_col=0, squeeze=True)
# split a univariate sequence into samples 拆分数据集,每n_steps个预测下一个月的销售量
def split_sequence(sequence, n_steps):
X, y = list(), list()
for i in range(len(sequence)):
# find the end of this pattern
end_ix = i + n_steps
# check if we are beyond the sequence
if end_ix > len(sequence)-1:
break
# gather input and output parts of the pattern
seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
X.append(seq_x)
y.append(seq_y)
return asarray(X), asarray(y)
# retrieve the values
#values = df.values.astype('float32')
values = df.values
# specify the window size
n_steps = 5
# split into samples
X, y = split_sequence(values, n_steps)
# reshape into [samples, timesteps, features]
X = X.reshape((X.shape[0], X.shape[1],1))
# split into train/test
n_test = 12
X_train, X_test, y_train, y_test = X[:-n_test], X[-n_test:], y[:-n_test], y[-n_test:]
模型:
# define model
model = Sequential()
model.add(LSTM(100, activation='relu', kernel_initializer='he_normal', input_shape=(n_steps,1)))
model.add(Dense(50, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(50, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(1))
# compile the model
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
# fit the model
model.fit(X_train, y_train, epochs=350, batch_size=32, verbose=1, validation_data=(X_test, y_test))
# evaluate the model
mse, mae = model.evaluate(X_test, y_test, verbose=1)
'''结果:1/1 [==============================] - 0s 53ms/step - loss: 9514635.0000 - mae: 2585.3484'''
预测:
print('MSE: %.3f, RMSE: %.3f, MAE: %.3f' % (mse, sqrt(mse), mae))
# make a prediction
row = asarray([18024.0, 16722.0, 14385.0, 21342.0, 17180.0]).reshape((1, n_steps, 1))
yhat = model.predict(row)
print('Predicted: %.3f' % (yhat))