深度学习CNN+LSTM

在处理(373,1000,16,8)的数据时,其中373为样本数,1000为1000张具有时间顺序的的图片,图片大小为16×8。使用CNN+LSTM做二分类时,batch_size=1(由于要做实时预测,所以选择了1),学习率为0.0001,训练集和测试机划分比列为8:2。模型如下
出现过拟合,请问怎么解决,模型应该怎么搭建!

img

img

这两类的比例大概为1:1

  • 这篇博客也许可以解决你的问题👉 :LSTM的训练和测试长度(batch_size)不一样报错的解决方案
  • 除此之外, 这篇博客: 时间序列预测03:如何为CNN/LSTM模型构建数据集中的 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时间序列预测问题相关的博客还是论文中经常提及:

    • 特征(feature):转换后数据的每一列,比如降水量预测中的温度、湿度、风速、气压等特征;
    • 样本(sample):转换后数据的每一行,包含输入数据和输出标签;

    如下例,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准备数据时要求数据具有三维结构,而不是目前描述的二维结构。