前言
这个项目真的好烦,我感觉我每次都能学到很多不一样的想法,每一次的学习都告诉我,我之前做错了,想错了。一个人的路真的好难走,就跟踩着牛粪一样,忍着臭往前走,饿了就用牛粪烤些馍吃继续走
LSTM数据准备
- 将时间序列转化为监督学习问题。
- 将时间序列转换为平稳时序。
- 将观察结果转换成具体的比例。
思考
所以我之前出现的shape问题是不是因为我的数据不能跟之前玩目标检测一样无脑的导入,而是还要转化一下???
LSTM建模步骤
LSTM 层输入格式:为矩阵,矩阵内容 [ samples, time steps, features ]
samples:来自 domain 的独立观测值,通常是 data 的行数据–就是行数
time steps:对于给定的观测值,给定变量有单独的时间步–就是时间窗口
features:在得到观测值的时刻,观测到的单独的 measures–就是列数(属性个数)
1、数据reshape为LSTM输入格式
鉴于训练数据集被定义为x输入和y输出,它必须被重塑成样本/时间步/功能格式。
在tensorflow里面我们看到RNN的文档,他的inpu为三维【batchsize样本,max-time时间步长,features特征维度】
例如:
X, y = train[:, 0:-1], train[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])
2、LSTM层定义
layer = LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True)
batch_input_shape=表示每个batch需要读取的数据格式(batch_size=每batch读的数据行数,步长,属性数)
neurons=神经元个数,即记忆单元个数,1~5 就很高效了
batch通常和epoch一起
epochs:确定网络学习数据快慢,即权重的更新频率
3、输出定义
输出层是单一的神经元,用的线性激活函数来预测下一时间步的数据
4、编译
一旦指定了网络,就必须使用后端数学库(如TensorFlow或Theano)将其编译为高效的符号表示形式。
在编译网络时,咱们必须指定一个损失函数和优化算法。咱们将使用“ mean_squared_error ”做为损失函数,由于它与咱们感兴趣的RMSE紧密匹配,以及高效的ADAM优化算法。
#定义一个名为fit_lstm()的函数,它将训练并返回一个LSTM模型
def fit_lstm(train, batch_size, nb_epoch, neurons):
X, y = train[:, 0:-1], train[:, -1]#获取数据集
X = X.reshape(X.shape[0], 1, X.shape[1]) #重塑数据,转化成矩阵
model = Sequential() #使用Sequential Keras API来定义网络,即调用模型
model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))#添加模型,设置模型参数
model.add(Dense(1)) #model.add 添加神经层,添加的是 Dense 全连接神经层
model.compile(loss='mean_squared_error', optimizer='adam')
#使用“ mean_squared_error ”做为损失函数,因为他和我们感兴趣的RMSE紧密匹配。再使用ADAM优化算法
for i in range(nb_epoch): #下面是一个手动使网络适应训练数据的循环(#按照给定的训练周期循环训练)
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
#默认状况下,一个时间点的样本在暴露在神经网络以前是会被搅乱的,因此我们希望网络经过观察的顺序来构建状态。所以将“shuffle”设置为“False”。
#同样默认状况下,神经网络在每一个时间点末尾都会报告大量关于模型的学习进度和性能的调试信息。所以将“ verbose ”参数设置为“ 0 ”来禁止此行为
model.reset_states()
return model
#batch_size必须设置为1.这是由于它必须是训练和测试数据集大小的一个因素。