Função de perda para segmentação semântica


9

Desculpa-se pelo uso indevido de termos técnicos. Estou trabalhando em um projeto de segmentação semântica via redes neurais convolucionais (CNNs); tentando implementar uma arquitetura do tipo Encoder-Decoder, portanto, a saída é do mesmo tamanho que a entrada.

Como você cria os rótulos? Que função de perda se deve aplicar? Especialmente na situação de desequilíbrio de classe pesado (mas a proporção entre as classes é variável de imagem para imagem).

O problema lida com duas classes (objetos de interesse e histórico). Estou usando o Keras com back-end de tensorflow.

Até agora, vou projetar as saídas esperadas para ter as mesmas dimensões que as imagens de entrada, aplicando a rotulação em pixels. A camada final do modelo possui ativação softmax (para 2 classes) ou ativação sigmóide (para expressar a probabilidade de os pixels pertencerem à classe de objetos). Estou tendo problemas para projetar uma função objetiva adequada para essa tarefa, do tipo:

function(y_pred,y_true),

de acordo com Keras .

Por favor, tente ser específico com as dimensões dos tensores envolvidos (entrada / saída do modelo). Quaisquer pensamentos e sugestões são muito apreciados. Obrigado !


Leia isto arxiv.org/pdf/1511.00561.pdf "Usamos a perda de entropia cruzada como a função objetiva para treinar a rede."
Miss Palmer

Respostas:


5

A entropia cruzada é definitivamente o caminho a percorrer. Eu não conheço Keras, mas o TF tem isso: https://www.tensorflow.org/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

Aqui está um artigo implementando diretamente isso: Redes totalmente convolucionais para segmentação semântica por Shelhamer et al.

O documento U-Net também é uma implementação muito bem-sucedida da idéia, usando conexões puladas para evitar perda de resolução espacial. Você pode encontrar muitas implementações disso na rede.

Da minha experiência pessoal, você pode querer começar primeiro com uma rede simples de codificador-decodificador, mas não use avanços (ou avanços = 1); caso contrário, você perde muita resolução porque a amostragem não é perfeita. Vá com tamanhos pequenos de kernel. Não conheço seu aplicativo específico, mas mesmo uma rede de camada oculta de 2 a 3 dará resultados muito bons. Use 32-64 canais em cada camada. Comece simples, 2 camadas ocultas, 32 canais cada, núcleos 3x3, passo = 1 e experimente os parâmetros de maneira isolada para ver seu efeito. Mantenha as dimensões sempre iguais às dimensões de entrada dos iniciantes para evitar perda de resolução. Posteriormente, você pode ativar avanços e upsampling e implementar idéias como U-Net. O U-Net funciona extremamente bem na segmentação de imagens médicas.

Para desequilíbrio de classe, consulte https://swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/ Aqui a idéia é ponderar as diferentes classes com e parâmetros.αβ


Não sou especialista neste domínio, mas as aulas não devem ser exclusivas nessa configuração? Se sim, a perda softmax não seria a melhor opção? tensorflow.org/api_docs/python/tf/nn/…
Harald Thomson

11
@HaraldThomson, A segmentação é um problema binário. Muitas pessoas usam o softmax para problemas binários, mas é completamente desnecessário e exagerado. Em vez de ter dois nós de saída, tenha um nó de saída que represente P (y = 1) e use a entropia cruzada.
Ricardo Cruz

2

Use perda ponderada de dados e perda ponderada de entropia cruzada. A perda de dados é muito boa para segmentação. Os pesos com os quais você pode começar devem ser as frequências da classe invertidas, ou seja, pegue uma amostra de 50 a 100, encontre o número médio de pixels pertencentes a cada classe e faça com que as classes pesem 1 / média. Você pode ter que implementar dados sozinho, mas é simples. Além disso, você pode procurar por perda inversa de dados e perda focal


-1

Deixe-me ser mais específico a princípio e depois mais geral. Peço desculpas se não entendi bem.

Eu acho que você está falando sobre a necessidade de uma rede neural de autoencoder porque você mencionou a codificação e decodificação e o tamanho da entrada igual ao tamanho da saída. Nesse caso, sua função de perda é baseada na reprodução do vetor de entrada, mas também na compactação dos dados em um vetor mais curto na camada oculta do meio. As opções seriam atingir o erro quadrado médio mínimo (para regressão) ou a razão de perda de log ou classificação incorreta (para classificação). No entanto, as CNNs não são algo que eu já vi usado em um autoencoder, mas acho que seria possível e útil fazê-lo nos casos em que a invariância da tradução é importante, como detecção de borda e objeto em imagens.

Em geral, você parece estar construindo um modelo muito complexo de aprendizado de máquina desde que mencionou as CNNs. CNNs e outros modelos de aprendizado profundo são alguns dos modelos de aprendizado de máquina mais complexos que existem.

A escolha de dimensões, rótulos e funções de perda é mais como um aprendizado de máquina elementar. Eu acho que você pode estar pensando em algo profundo. Você teve uma aula sobre aprendizado de máquina antigo e simples primeiro?


Isso é mesmo necessário? Por exemplo, consulte Método Pixon .
Carl Carl

é uma abordagem válida: arxiv.org/pdf/1511.00561.pdf
Miss Palmer

"CNNs e outros modelos de aprendizado profundo são alguns dos modelos de aprendizado de máquina mais complexos que existem". Eu tendo a discordar. O modelo em si pode ser complexo, mas, na verdade, é incrivelmente simples de usar, com muito pouco entendimento teórico. Essa é a razão de todo o hype sobre DL, pouca teoria, modelos fáceis de escrever e precisão muito alta ...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.