我有 5 个输出类的数据。训练数据有以下 5 个类别的样本数:[706326, 32211, 2856, 3050, 901]
我正在使用以下 keras (tf.keras) 代码:
class_weights = class_weight.compute_class_weight('balanced',
np.unique(y_train),
y_train)
model = tf.keras.Sequential([
tf.keras.layers.Dense(50, input_shape=(dataX.shape[1],)),
tf.keras.layers.Dropout(rate = 0.5),
tf.keras.layers.Dense(50, activation=tf.nn.relu),
tf.keras.layers.Dropout(rate = 0.5),
tf.keras.layers.Dense(50, activation=tf.nn.relu),
tf.keras.layers.Dropout(rate = 0.5),
tf.keras.layers.Dense(50, activation=tf.nn.relu),
tf.keras.layers.Dropout(rate = 0.5),
tf.keras.layers.Dense(5, activation=tf.nn.softmax) ])
adam = tf.keras.optimizers.Adam(lr=0.5)
model.compile(optimizer=adam,
loss='sparse_categorical_crossentropy',
metrics=[metrics.sparse_categorical_accuracy])
model.fit(X_train,y_train, epochs=5, batch_size=32, class_weight=class_weights)
y_pred = np.argmax(model.predict(X_test), axis=1)
class_weight 的第一行取自这个问题的一个答案:如何在 Keras 中为不平衡的类设置类权重?
我知道这个答案:Multi-class neural net always predicting 1 class after optimization。不同之处在于,在这种情况下,当我使用它时,没有使用类权重。
我正在使用 sparse_categorical_crossentropy 它接受类别为整数(不需要将它们转换为单热编码),但我也尝试了 categorical_crossentropy 并且仍然存在同样的问题。
我当然尝试过不同的学习率、batch_size、时期数、优化器和网络的深度/长度。但它总是停留在 ~0.94 的准确度上,如果我一直预测第一类,这基本上是我会得到的。
不确定这里缺少什么。有什么错误吗?或者我应该使用其他一些专门的深度网络吗?