Softmax 激活给出了最差的性能损失 sparse_categorical_crossentropy
Softmax activation gives worst performance with loss sparse_categorical_crossentropy
我有一个简单的 Keras 顺序模型。
我有 N 个类别,我必须根据前一个点预测下一个点将属于哪个类别。
奇怪的是,当我从输出层移除 Softmax 激活函数时,性能更好(更低的损失和最高的 sparse_categorical_accuracy)。
作为损失,我使用 sparse_categorical_crossentropy with 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 激活,你的输出确实是标准化的,所以你有两个选择:
- 删除你已经尝试过的 softmax 激活。请记住,在此之后,您的输出概率将不会被归一化。
- 使用
from_logits = False
.
我有一个简单的 Keras 顺序模型。 我有 N 个类别,我必须根据前一个点预测下一个点将属于哪个类别。
奇怪的是,当我从输出层移除 Softmax 激活函数时,性能更好(更低的损失和最高的 sparse_categorical_accuracy)。 作为损失,我使用 sparse_categorical_crossentropy with 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 激活,你的输出确实是标准化的,所以你有两个选择:
- 删除你已经尝试过的 softmax 激活。请记住,在此之后,您的输出概率将不会被归一化。
- 使用
from_logits = False
.