Softmax激活的性能最差,损失稀疏_类别_交叉熵



我有一个简单的Keras序列模型。我有N个类别,我必须在前一个的基础上预测下一个点将落在哪个类别中。

奇怪的是,当我从输出层中删除Softmax激活函数时,性能会更好(损失更低,稀疏性最高(。作为损失,我使用的是logits=True的稀疏分类交叉熵。

这有什么原因吗?不应该是相反的吗?

提前感谢您的任何建议!

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim,
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

最新更新