代码之家  ›  专栏  ›  技术社区  ›  Whitedevil4648

我的测试损失在增加,但神经网络的训练损失在减少。我该怎么办?

  •  -1
  • Whitedevil4648  · 技术社区  · 1 年前

    My Neural Network

    def buildModel(optimizer):
        model = tf.keras.models.Sequential([
        Dense(100, activation = 'relu'),
        Dense(82, activation = 'relu'),
        Dense(20, activation = 'relu'),
        Dense(6, activation = 'relu'),
        Dense(20, activation = 'softmax')
        ])
        model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
        return model
    
    tf.keras.optimizers.legacy.Adam()
    
    model = buildModel('adam')
    history = model.fit(train_x,train_y_lst, validation_data=(test_x, test_y_lst),epochs = 50,batch_size = 32,verbose = 0)
    

    绘图

    plt.figure()
    plt.plot(history.history['loss'], label='Training Loss')
    plt.plot(history.history['val_loss'], label='Validation Loss')
    plt.xlabel('Epoch')
    plt.ylabel('Loss')
    plt.title('Training and Validation Loss Curves')
    plt.legend()
    
    # Plot training and validation accuracy
    plt.figure()
    plt.plot(history.history['accuracy'], label='Training Accuracy')
    plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
    plt.xlabel('Epoch')
    plt.ylabel('Accuracy')
    plt.title('Training and Validation Accuracy Curves')
    plt.legend()
    
    plt.show()
    

    Loss vs Epochs

    测试的准确性也很差

    Accuracy vs Epoch

    我是新来的,有什么建议吗?

    我原以为考试损失会像火车损失一样减少。

    我的test_x看起来像这样

      -0.84335711]
     [-0.1898388  -1.4177287   0.24718753 ... -0.33010045  0.77921928
      -1.56813293]
     [ 0.51887204 -1.34965479  0.19069737 ...  0.56236361 -0.03741466
      -0.24596578]
     ...
     [-0.11631875  0.46366703 -1.04400684 ...  0.23282911 -2.10649511
      -0.41883463]
     [-1.03632829  0.05419996 -2.22371652 ...  0.47133847 -1.70391277
      -1.42387687]
     [-0.12011524 -0.72294703 -0.74587529 ...  0.11331488 -1.81362912
      -0.11828704]]
    

    测试_y_lst

    array([[1, 0, 0, ..., 0, 0, 0],
           [1, 0, 0, ..., 0, 0, 0],
           [1, 0, 0, ..., 0, 0, 0],
           ...,
           [0, 0, 0, ..., 0, 0, 0],
           [0, 0, 0, ..., 0, 0, 0],
           [0, 0, 0, ..., 0, 0, 0]])
    

    多分类问题。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Milad Shani    1 年前

    由于看起来你对这个概念还很陌生,我会告诉你一些方法,你可以在这里或使用NeuralNets来提高你的成绩。

    您的模型与输入的列车数据过拟合。以避免:

    1. 总是 规模 您的输入数据。根据您的用例,将它们范围在[0,1]或[-1,1]之间,99%的时间都足够了。它有助于反向传播。
    2. 在知情的情况下使用指标。 ReLu 激活通过将负值设置为零,从计算矩阵中删除所有负值。将负值输入到模型中。尽管ReLu即使在负输入的情况下也可能有用,但这取决于用例。它不是万能钥匙。
    3. 使用 辍学者 。只需添加dropout,就可以减少过拟合的很大一部分。它将该层的一些系数随机设置为零。所以它不会过度适应您输入的某个特定部分。并且所训练的模型更加通用。
    4. 提前停车。长时间的训练并不总是意味着更好的模式。你可以将训练设置为比你的训练提前停止&测试精度开始相互拉开距离。
    5. 任务的数据和功能的合理数量。如果您正在为输出中的20个不同类别训练模型,则输入数据必须足够让模型概括输入的特征。输入数据的维度(显示can中的数据量)也必须足够好(不多也不少)。

    首先,尝试在(0,1)之间缩放输入数据,并对一个或两个层使用dropout,然后查看结果。