问题描述
我有一个简单的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激活,因此您的输出确实已标准化,因此有两个选择:
- 按照已尝试的方法删除softmax激活。请记住,此后,您的输出概率将不会被标准化。
- 使用
from_logits = False
。