首页 > 解决方案 > Keras 模型精度没有提高

问题描述

我正在尝试训练一个神经网络来预测 FIFA 18 中球员的 easports 评分(评分在 64-99 之间)。我正在使用他们的球员数据库(https://easports.com/fifa/ultimate-team/api/fut/item?page=1),我已经将数据处理成 training_x、testing_x、training_y、testing_y。每个训练样本都是一个包含 7 个值的 numpy 数组……前 6 个是球员的不同统计数据(投篮、传球、运球等),最后一个值是球员的位置(我在 1 -8,取决于位置),每个测试值都是 64-99 之间的单个整数,代表该玩家的评分。

我尝试了许多不同的超参数,包括将激活函数更改为 tanh 和 relu,并且我尝试在第一个密集层之后添加一个批量归一化层(我认为它可能很有用,因为我的一个特征非常小而且其他特征在 50-99 之间),我玩过 SGD 优化器(更改了学习率、动量,甚至尝试将优化器更改为 Adam),尝试了不同的损失函数,添加/删除了 dropout 层,并尝试了不同的模型权重的正则化器。

model = Sequential()
model.add(Dense(64, input_shape=(7,), 
          kernel_regularizer=regularizers.l2(0.01)))
//batch normalization?
model.add(Activation('sigmoid'))
model.add(Dense(64, kernel_regularizer=regularizers.l2(0.01), 
          activation='sigmoid'))
model.add(Dropout(0.3))
model.add(Dense(32, kernel_regularizer=regularizers.l2(0.01), 
          activation='sigmoid'))
model.add(Dense(1, activation='linear'))
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_absolute_error', metrics=['accuracy'], 
          optimizer=sgd)
model.fit(training_x, training_y, epochs=50, batch_size=128, shuffle=True)

当我训练模型时,损失总是 nan 并且准确率总是 0,即使我已经尝试调整了很多不同的参数。但是,如果我从数据中删除最后一个特征,即球员的位置,并更新第一个密集层的输入形状,那么无论我更改什么参数,模型实际上都会“训练”并最终以 6% 左右的准确率结束。在这种情况下,我发现模型只预测 79 是玩家的评分。我做错了什么?

标签: machine-learningkerasneural-network

解决方案


您可以尝试以下步骤:

  1. 使用均方误差损失函数。
  2. 使用Adam,它将帮助您以 0.0001 或 0.001 等低学习率更快地收敛。否则,请尝试使用RMSprop 优化器
  3. 使用默认的正则化器。这实际上是没有的。
  4. 由于这是一个回归任务,因此在除输出层(包括输入层)之外的所有层中都使用类似 ReLU 的激活函数。在输出层使用线性激活
  5. 正如@pooyan 的评论中提到的,规范化功能。见这里。甚至尝试标准化功能。使用最好的套件。

推荐阅读