Recentemente, encontrei tf.nn.sparse_softmax_cross_entropy_with_logits e não consigo descobrir qual é a diferença em comparação com tf.nn.softmax_cross_entropy_with_logits .
É a única diferença que os vetores de treinamento y
precisam ser codificados em um ponto ao usar sparse_softmax_cross_entropy_with_logits
?
Lendo a API, não consegui encontrar nenhuma outra diferença em comparação com softmax_cross_entropy_with_logits
. Mas então por que precisamos da função extra?
Não deve softmax_cross_entropy_with_logits
produzir os mesmos resultados que sparse_softmax_cross_entropy_with_logits
, se for fornecido com dados / vetores de treinamento codificados em um único ponto?
neural-network
tensorflow
softmax
cross-entropy
daniel451
fonte
fonte
Respostas:
Ter duas funções diferentes é uma conveniência , pois elas produzem o mesmo resultado.
A diferença é simples:
sparse_softmax_cross_entropy_with_logits
, os rótulos devem ter a forma [batch_size] e o dtype int32 ou int64. Cada rótulo é um int no intervalo[0, num_classes-1]
.softmax_cross_entropy_with_logits
, os rótulos devem ter a forma [batch_size, num_classes] e dtype float32 ou float64.As etiquetas usadas em
softmax_cross_entropy_with_logits
são a única versão quente das etiquetas usadas emsparse_softmax_cross_entropy_with_logits
.Outra pequena diferença é que com
sparse_softmax_cross_entropy_with_logits
, você pode dar -1 como um rótulo para ter perda0
neste rótulo.fonte
Eu gostaria apenas de adicionar 2 coisas à resposta aceita que você também pode encontrar na documentação do TF.
Primeiro:
Segundo:
fonte
Ambas as funções calculam os mesmos resultados e sparse_softmax_cross_entropy_with_logits calcula a entropia cruzada diretamente nos rótulos esparsos em vez de convertê-los com codificação one-hot .
Você pode verificar isso executando o seguinte programa:
Aqui, crio um
logits
vetor aleatório de comprimentodims
e gero rótulos codificados com um único elemento (em que o elemento inpos
é 1 e os outros são 0).Depois disso, calculo o softmax e o softmax esparso e comparo sua saída. Tente executá-lo novamente algumas vezes para se certificar de que sempre produz o mesmo resultado
fonte