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

问题描述 投票:0回答:1

我的神经网络

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()

损失与纪元

测试的准确性也很差

准确度与纪元

我是新人,有什么建议我可能会出错吗?

我预计测试损失会像火车损失一样减少。

我的 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]])

多分类问题。

python keras neural-network
1个回答
0
投票

由于您似乎对这个概念很陌生,我将告诉您一些可以在此处或一般情况下使用 NeuralNets 改进结果的方法。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.