在处理(373,1000,16,8)的数据时,其中373为样本数,1000为1000张具有时间顺序的的图片,图片大小为16×8。使用CNN+LSTM做二分类时,batch_size=1(由于要做实时预测,所以选择了1),学习率为0.0001,训练集和测试机划分比列为8:2。模型如下
出现过拟合,请问怎么解决,模型应该怎么搭建!
这两类的比例大概为1:1
时间序列数据在训练有监督的学习模型(如LSTM神经网络)之前需要准备。例如,一元时间序列表示为观测向量:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
监督学习算法要求将数据作为样本集合提供,其中每个样本具有输入分量X和输出分量y。
模型将学习如何从提供的示例中将输入映射到输出。
y=f(X)y = f(X) y=f(X)
时间序列必须转换成具有输入和输出分量的样本。例如,预测输入数据X和预测输出标签y。对于一个对一步预测感兴趣的单变量时间序列问题,可以使用先前时间点的观测值作为输入,当前时间点的观测值作为输出。例如,上述10步单变量序列可以表示为一个有监督学习问题,其输入为3个时间步,输出为1个时间步,如下所示:
X, y
[1, 2, 3], [4]
[2, 3, 4], [5]
[3, 4, 5], [6]
...
可以编写代码来执行此转换,下面的 split_sequence()
函数实现了转换,它将一个给定的单变量序列分割成多个样本,其中每个样本都有指定数量的时间步长,输出是单个时间步长。将数据转换为适合训练监督学习模型的形式后,用行和列表示。每一列表示模型的一个特征,每一行表示一个输入样本。这两个概念需要明确,在与LSTM时间序列预测问题相关的博客还是论文中经常提及:
如下例,3个特征,4个样本,数据集的形状(shape)为 [4,3]:
x1, x2, x3, y
1, 2, 3, 4
2, 3, 4, 5
3, 4, 5, 6
4, 5, 6, 7
5, 6, 7, 8
6, 7, 8, 9
7, 8, 9, 10
使用代码实现:
import numpy as np
def split_sequence(sequence, sliding_window_width):
X, y = [], []
for i in range(len(sequence)):
# 找到最后一次滑动所截取数据中最后一个元素的索引,
# 如果这个索引超过原序列中元素的索引则不截取;
end_element_index = i + sliding_window_width
if end_element_index > len(sequence) - 1: # 序列中最后一个元素的索引
break
sequence_x, sequence_y = sequence[i:end_element_index], sequence[end_element_index] # 取最后一个元素作为预测值y
X.append(sequence_x)
y.append(sequence_y)
#return X,y
return np.array(X), np.array(y)
if __name__ == '__main__':
seq_test = [1,2,3,4,5,6,7,8,9,10]
sw_width = 3
seq_test_x, seq_test_y = split_sequence(seq_test, sw_width)
print(seq_test_x.shape,seq_test_y.shape)
for i in zip(seq_test_x,seq_test_y):
print(i)
for i in range(len(seq_test_x)):
print(seq_test_x[i], seq_test_y[i])
输出:
(7, 3) (7,)
(array([1, 2, 3]), 4)
(array([2, 3, 4]), 5)
(array([3, 4, 5]), 6)
(array([4, 5, 6]), 7)
(array([5, 6, 7]), 8)
(array([6, 7, 8]), 9)
(array([7, 8, 9]), 10)
[1 2 3] 4
[2 3 4] 5
[3 4 5] 6
[4 5 6] 7
[5 6 7] 8
[6 7 8] 9
[7 8 9] 10
这种形式的数据可以直接用于训练一个简单的神经网络,比如一个多层感知器。在为CNNs和LSTMs准备数据时要求数据具有三维结构,而不是目前描述的二维结构。