在训练以下用于多类分类的 NN 模型时,我遇到了一种非常奇怪的行为:
METRICS = [
keras.metrics.AUC(name='auc')
]
model = keras.Sequential()
model.add(layers.Dense(hidden_units, activation='relu', kernel_regularizer=l2(0.1), input_shape=(input_len,)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(dropout_rate))
for i in range(hidden_layers-1):
model.add(layers.Dense(hidden_units, activation='relu', kernel_regularizer=l2(0.1)))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Dropout(dropout_rate))
model.add(keras.layers.Dense(output_len, activation="softmax"))
model.compile(
optimizer=tf.keras.optimizers.Adamax(learning_rate=lr),
loss='categorical_crossentropy',
metrics=METRICS)
测试不同的参数组合,我的模型总是过拟合,但测试准确率总是低于 0.001 的训练准确率,就 AUC 而言。以下是使用 3 种不同组合(学习率、时期、批量大小、隐藏层和每层隐藏单元)获得的输出示例。
lr: 0.001, e: 10, b: 128, l: 1, u: 200
Train : 0.992
Test : 0.991
lr: 0.001, e: 10, b: 128, l: 2, u: 200
Train : 0.984
Test : 0.983
lr: 0.001, e: 10, b: 500, l: 1, u: 200
Train : 0.988
Test : 0.987
lr: 0.001, e: 10, b: 500, l: 2, u: 200
Train : 0.974
Test : 0.973
这就是我评估模型的方式:
train_auc = roc_auc_score(y_train, model.predict(X_train), average='weighted')
test_auc = roc_auc_score(y_test, model.predict(X_test), average='weighted')
请注意,我正在使用 average='weighted' 因为我正在处理不平衡的数据集。
我尝试过使用或不使用 Dropout 和正则化器来训练模型,但我得到了同样的奇怪行为。我究竟做错了什么?