Machine learning 预测数字序列的Keras模型

Machine learning 预测数字序列的Keras模型,machine-learning,neural-network,keras,lstm,recurrent-neural-network,Machine Learning,Neural Network,Keras,Lstm,Recurrent Neural Network,我试图训练Keras LSTM模型来预测序列中的下一个数字 下面我的模型有什么问题,当一个模型没有学习时我如何调试 如何决定使用哪种图层类型 在编译时,我应该根据什么选择loss和optimizer参数 我输入的训练数据的形状(16000,10)如下所示 [ [14955 14956 14957 14958 14959 14960 14961 14962 14963 14964] [14731 14732 14733 14734 14735 14736 14737 14738 1

我试图训练Keras LSTM模型来预测序列中的下一个数字

  • 下面我的模型有什么问题,当一个模型没有学习时我如何调试
  • 如何决定使用哪种图层类型
  • 在编译时,我应该根据什么选择loss和optimizer参数
  • 我输入的训练数据的形状(16000,10)如下所示

    [
        [14955 14956 14957 14958 14959 14960 14961 14962 14963 14964]
        [14731 14732 14733 14734 14735 14736 14737 14738 14739 14740]
        [35821 35822 35823 35824 35825 35826 35827 35828 35829 35830]
        [12379 12380 12381 12382 12383 12384 12385 12386 12387 12388]
        ...
    ]
    
    [[14965] [14741] [35831] [12389] ...]
    
    相应的输出训练数据的形状(16000,1)如下所示

    [
        [14955 14956 14957 14958 14959 14960 14961 14962 14963 14964]
        [14731 14732 14733 14734 14735 14736 14737 14738 14739 14740]
        [35821 35822 35823 35824 35825 35826 35827 35828 35829 35830]
        [12379 12380 12381 12382 12383 12384 12385 12386 12387 12388]
        ...
    ]
    
    [[14965] [14741] [35831] [12389] ...]
    
    正如LSTM抱怨的那样,我重塑了培训/测试数据

    X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
    X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
    
    这是最终的培训/测试数据形状

    Total Samples: 20000
    X_train: (16000, 10, 1)
    y_train: (16000, 1)
    X_test: (4000, 10, 1)
    y_test: (4000, 1)
    
    这是我的模型

    # Model configuration
    epochs = 2
    batch_size = 32
    hidden_neurons = 100
    output_size = 1
    
    # Create the model
    model = Sequential()
    model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Dense(output_size))
    model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=['accuracy'])
    print(model.summary())
    model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)
    
    scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
    print("Model Accuracy: %.2f%%" % (scores[1]*100))
    
    这是我的输出

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    lstm_3 (LSTM)                (None, 100)               40800     
    _________________________________________________________________
    dense_3 (Dense)              (None, 1)                 101       
    =================================================================
    Total params: 40,901
    Trainable params: 40,901
    Non-trainable params: 0
    _________________________________________________________________
    None
    Epoch 1/2
    16000/16000 [==============================] - 11s - loss: 533418575.3600 - acc: 0.0000e+00    
    Epoch 2/2
    16000/16000 [==============================] - 10s - loss: 532474289.7280 - acc: 6.2500e-05    
    Model Accuracy: 0.00%
    
    请尝试以下代码:

    epochs = 30
    batch_size = 64
    hidden_neurons = 32
    output_size = 1
    
    # Create the model
    model = Sequential()
    model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(Dense(output_size, activation = 'elu'))
    
    model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
    print(model.summary())
    model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)
    
    scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
    print("Model Accuracy: %.2f%%" % (scores[1]*100))
    
    一般来说,很难帮助你,因为我们需要一种可重复的例子,我们可以测试。不过,以下是我的建议:

    玩你的神经网络的超参数,如:激活功能,选择功能,层数,学习率等

    更新:


    最好先规范化数据。

    准确度不是衡量模型性能的正确标准。您在这里尝试做的更多的是一项回归任务,而不是一项分类任务。从损失函数中也可以看出,您使用的是“均方误差”,而不是类似于“分类交叉熵”

    此外,50个时代的训练时间太少了。如果你看一下日志(在你最初的问题中),你会发现损失随着时间的推移而减少。在你看到损失已经稳定下来并且没有进一步减少之前,你需要继续进行更多的历次训练

    第三,在将数据传递给fit函数之前,必须对数据进行规范化。这些值非常大,如果不进行归一化,算法可能无法收敛


    如果您仍然需要解决此问题,并且需要更多帮助,请在注释中告诉我,以便我可以帮助您编写代码。

    您是否尝试了两个以上的纪元?是的,我尝试了10个纪元,但损失并没有减少多少,准确率保持0这看起来像是一个回归问题,在这种情况下,精确是没有意义的。所以,如何训练和评估没有精确性的回归问题呢。我该怎么看atHello@MatiasValdenegro,谢谢你指出回归的不恰当指标。我在这里阅读了更多关于回归度量的内容。现在我使用mse、mae,结果看起来更真实。谢谢。您好@Paddy,谢谢您的回复,我甚至在您的代码上运行了50个纪元,只获得了0.1%的准确率。你能详细介绍一下数据的标准化,并给出一些关于像我这样的数据集的例子吗。通过将输入/输出数据除以输入数据的最大值,我将所有数据规范化为介于0-1之间。最终的预测似乎很接近,但并不完美。让我知道,如果有任何其他想法,可以帮助改善预测。有很多事情,你可以尝试,与批正常化和辍学斯特拉特。我也会尝试GRU而不是LSTM(只是简单地用GRU替换LSTM)。此外,最好有一个学习率回调检查此链接: