Softmax激活会带来最差的性能,并且损失sparse_categorical_crossentropy

问题描述

我有一个简单的Keras顺序模型。 我有N个类别,我必须根据上一个类别预测下一个要落入哪个类别。

奇怪的是,当我从输出删除softmax激活功能时,性能会更好(损耗更低,sparse_categorical_accuracy最高)。 作为损失,我使用sparse_categorical_crossentropy和logits = True。

有什么理由吗?不应该相反吗?

预先感谢您的任何建议!

def build_model(vocab_size,embedding_dim,rnn_units,batch_size):
  model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size,batch_input_shape=[batch_size,None]),tf.keras.layers.GRU(rnn_units,return_sequences=True,stateful=True,recurrent_initializer='glorot_uniform'),tf.keras.layers.Dense(vocab_size,activation='softmax')
    ])
  return model

model = build_model(
  vocab_size = vocab_size,embedding_dim=embedding_dim,rnn_units=rnn_units,batch_size=BATCH_SIZE)

def loss(labels,logits):
  return tf.keras.losses.sparse_categorical_crossentropy(labels,logits,from_logits=True)


model.compile(optimizer='adam',loss=loss,metrics=['sparse_categorical_accuracy'])

EPOCHS = 5
history = model.fit(train_set,epochs=EPOCHS,validation_data=val_set,)

解决方法

简而言之,当您使用选项from_logits = True时,您在告诉损失函数您的神经网络输出未标准化。由于您在最后一层中使用softmax激活,因此您的输出确实已标准化,因此有两个选择:

  1. 按照已尝试的方法删除softmax激活。请记住,此后,您的输出概率将不会被标准化。
  2. 使用from_logits = False