Arquiteturas da CNN para regressão?

32

Eu tenho trabalhado em um problema de regressão em que a entrada é uma imagem e o rótulo é um valor contínuo entre 80 e 350. As imagens são de alguns produtos químicos após a reação. A cor que aparece indica a concentração de outro produto químico que resta, e é isso que o modelo deve produzir - a concentração desse produto químico. As imagens podem ser giradas, invertidas, espelhadas e a saída esperada ainda deve ser a mesma. Esse tipo de análise é feita em laboratórios reais (máquinas muito especializadas produzem a concentração dos produtos químicos usando a análise de cores, exatamente como estou treinando neste modelo).

Até agora, experimentei apenas modelos baseados em VGG (várias seqüências de blocos conv-conv-conv-pool). Antes de experimentar arquiteturas mais recentes (Inception, ResNets etc.), pensei em pesquisar se existem outras arquiteturas mais comumente usadas para regressão usando imagens.

O conjunto de dados fica assim:

insira a descrição da imagem aqui

O conjunto de dados contém cerca de 5.000 amostras 250x250, que foram redimensionadas para 64x64, para facilitar o treinamento. Depois de encontrar uma arquitetura promissora, experimentarei imagens de maior resolução.

Até agora, meus melhores modelos têm um erro quadrático médio nos conjuntos de treinamento e validação de cerca de 0,3, o que está longe de ser aceitável no meu caso de uso.

Meu melhor modelo até agora se parece com isso:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Questão

O que é uma arquitetura apropriada para saída de regressão de uma entrada de imagem?

Editar

Eu reformulei minha explicação e removi as menções de precisão.

Editar 2

Eu reestruturei minha pergunta, então espero que fique claro o que eu estou procurando

rodrigo-silveira
fonte
4
A precisão não é uma medida que pode ser aplicada diretamente a problemas de regressão. O que você quer dizer quando diz que sua precisão é de 30%? A precisão realmente se aplica apenas às tarefas de classificação, não à regressão.
595 Nuclear Wang
1
O que você quer dizer com "prediz corretamente 30% das vezes" ? Você está realmente fazendo regressão?
precisa
1
Por que você chama esse problema de regressão? Você não está tentando se classificar em rótulos? os rótulos são cardeais?
Aksakal
2
Eu não quero exatamente a mesma coisa que vgg. Estou fazendo algo parecido com vgg, ou seja, uma série de convs seguidas por max pooling, seguidas por totalmente conectadas. Parece uma abordagem genérica para trabalhar com imagens. Mas, novamente, esse é o ponto principal da minha pergunta original. Parece que todos esses comentários, embora perspicazes para mim, perdem completamente o objetivo do que estou perguntando.
Rodrigo-silveira 21/03
1
Além disso, poderemos fornecer uma ajuda melhor se você fornecer uma descrição melhor do problema. 1) Quais são as imagens? Qual é a resolução deles? Que relação existe entre as imagens e sua resposta, ? É esta relação de rotação invariante, ou seja, se eu girar sua imagem circular por um ângulo arbitrário , eu espero a mudança? 2) Você sabe que 5000 imagens para treinar uma arquitetura de rede VGG são uma miséria? Você calculou o número de parâmetros da sua arquitetura? Existe alguma maneira de obter mais imagens? Se você não pode, então talvez você precisa ...yy[80,350]θy
DeltaIV

Respostas:

42

Antes de tudo, uma sugestão geral: faça uma pesquisa bibliográfica antes de começar a fazer experiências sobre um tópico que você não conhece. Você economizará muito tempo.

Nesse caso, olhando documentos existentes, você deve ter notado que

  1. As CNNs foram usadas várias vezes para regressão: este é um clássico, mas é antigo (sim, 3 anos de idade no DL). Um artigo mais moderno não teria usado o AlexNet para esta tarefa. Isso é mais recente, mas é para um problema muito mais complicado (rotação 3D) e, de qualquer forma, não estou familiarizado com isso.
  2. A regressão com CNNs não é um problema trivial. Olhando novamente para o primeiro artigo, você verá que eles têm um problema no qual podem basicamente gerar dados infinitos. Seu objetivo é prever o ângulo de rotação necessário para retificar imagens 2D. Isso significa que eu posso basicamente pegar meu conjunto de treinamento e aumentá-lo girando cada imagem em ângulos arbitrários, e vou obter um conjunto de treinamento maior e válido. Portanto, o problema parece relativamente simples, tanto quanto os problemas de Aprendizado Profundo. A propósito, observe os outros truques de aumento de dados que eles usam:

    Usamos traduções (até 5% da largura da imagem), ajuste de brilho no intervalo [-0,2, 0,2], ajuste de gama com γ ∈ [−0,5, 0,1] e ruído de pixel gaussiano com um desvio padrão no intervalo [0 0,02].

    Não conheço bem o seu problema para dizer se faz sentido considerar variações de posição, brilho e ruído gama para suas fotos, filmadas cuidadosamente em laboratório. Mas você sempre pode tentar removê-lo se não melhorar a perda de seu conjunto de testes. Na verdade, você realmente deve usar um conjunto de validação ou validação cruzada fold para esses tipos de experimentos e não deve olhar para o conjunto de testes até ter definido sua configuração, se desejar que a perda do conjunto de testes seja representativa da erro de generalização.k

    De qualquer forma, mesmo em suas condições ideais, a abordagem ingênua não funcionou tão bem (seção 4.2 ). Eles retiraram a camada de saída (a camada softmax) e a substituíram por uma camada com duas unidades que previam o seno e o cosseno do ângulo de rotação. O ângulo real seria então calculado como . A rede neural também foi pré-treinada no ImageNet (isso é chamado de aprendizado de transferênciayxα=atan2(y,x)> 11 %) É claro que o treinamento no ImageNet tinha sido para uma tarefa diferente (classificação), mas ainda assim o treinamento da rede neural deve ter dado resultados tão horríveis que eles decidiram não publicá-las. Então você tinha todos os ingredientes para fazer uma boa omelete: dados de treinamento potencialmente infinitos, uma rede pré-treinada e um problema de regressão aparentemente simples (preveja dois números entre -1 e 1). No entanto, o melhor que eles conseguiram com essa abordagem foi um erro de 21 °. Não está claro se este é um erro RMSE, um erro MAD ou o quê, mas ainda não é ótimo: como o erro máximo que você pode cometer é 180 °, o erro médio é do máximo possível. Eles se saíram um pouco melhor usando duas redes em série: a primeira realizaria a classificação (preveja se o ângulo estaria no>11%[180°,90°],[90°,0°],[0°,90°] ou ) e, em seguida, a imagem, girada pela quantidade prevista pela primeira rede , seriam alimentados a outra rede neural (para regressão, desta vez), que preveria a rotação adicional final no intervalo .[90°,180°][45°,45°]

    Em um problema muito mais simples (MNIST girado), você pode obter algo melhor , mas ainda assim não fica abaixo de um erro RMSE que é do erro máximo possível.2.6%

Então o que podemos aprender com isso? Antes de tudo, essas 5000 imagens são um pequeno conjunto de dados para sua tarefa. O primeiro artigo utilizou uma rede pré-treinada em imagens semelhantes àquelas para as quais eles queriam aprender a tarefa de regressão: não apenas é necessário aprender uma tarefa diferente daquela para a qual a arquitetura foi projetada (classificação), mas seu conjunto de treinamento não parece-se com os conjuntos de treinamento nos quais essas redes geralmente são treinadas (CIFAR-10/100 ou ImageNet). Portanto, você provavelmente não obterá nenhum benefício com a transferência de aprendizado. O exemplo do MATLAB tinha 5.000 imagens, mas eram em preto e branco e semanticamente todas muito parecidas (bem, esse também pode ser o seu caso).

Então, quão realista é melhor que 0,3? Antes de tudo, devemos entender o que você quer dizer com perda média de 0,3. Você quer dizer que o erro RMSE é 0,3,

1Ni=1N(h(xi)yi)2

onde é a dimensão do seu conjunto de treino (assim, ), é a saída do seu CNN para imagem e é a concentração correspondente do produto químico? Desde , assumindo que você as previsões da sua CNN entre 80 e 350 (ou você apenas usa um logit para ajustá-las nesse intervalo), você está recebendo menos de erro. Sério, o que você espera? não me parece um grande erro.NN<5000h(xi)xiyiyi[80,350]0.12%

Além disso, tente calcular o número de parâmetros em sua rede: estou com pressa e posso estar cometendo erros tolos, então, por todos os meios, verifique meus cálculos com alguma summaryfunção de qualquer estrutura que você esteja usando. No entanto, aproximadamente eu diria que você tem

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(observe que pulei os parâmetros das camadas de norma do lote, mas são apenas 4 parâmetros para a camada, para que não façam diferença). Você tem meio milhão de parâmetros e 5000 exemplos ... o que você esperaria? Claro, o número de parâmetros não é um bom indicador da capacidade de uma rede neural (é um modelo não identificável), mas ainda assim ... acho que você não pode fazer muito melhor que isso, mas pode tentar um poucas coisas:

  • normalize todas as entradas (por exemplo, redimensione as intensidades RGB de cada pixel entre -1 e 1 ou use a padronização) e todas as saídas. Isso ajudará especialmente se você tiver problemas de convergência.
  • vá para a escala de cinza: isso reduziria seus canais de entrada de 3 para 1. Todas as suas imagens parecem (para meus olhos altamente destreinados) serem de cores relativamente semelhantes. Tem certeza de que é a cor necessária para prever , e não a existência de áreas mais escuras ou mais brilhantes? Talvez você tenha certeza (não sou especialista): nesse caso, pule esta sugestão.y
  • Aumento de dados: desde que você disse que lançando, girando por um ângulo arbitrário ou espelhar suas imagens deve resultar na mesma saída, você pode aumentar o tamanho do seu conjunto de dados muito . Observe que, com um conjunto de dados maior, o erro no conjunto de treinamento aumenta: o que estamos procurando aqui é uma diferença menor entre a perda do conjunto de treinamento e a perda do conjunto de teste. Além disso, se a perda de um conjunto de treinamento aumentar muito, isso pode ser uma boa notícia: pode significar que você pode treinar uma rede mais profunda nesse conjunto de treinamento maior, sem o risco de super ajuste. Tente adicionar mais camadas e veja se agora você tem um conjunto menor de treinamento e perda de conjunto de teste. Por fim, você pode tentar também os outros truques de aumento de dados que citei acima, se eles fizerem sentido no contexto do seu aplicativo.
  • use o truque de classificação e regressão: uma primeira rede determina apenas se deve estar em um dos, digamos, 10 compartimentos, como , etc. Uma segunda rede calcula uma correção : centralizar e normalizar também podem ajudar aqui. Não posso dizer sem tentar.y[80,97],[97,124][0,27]
  • tente usar uma arquitetura moderna (Inception ou ResNet) em vez de uma arquitetura vintage. O ResNet tem, na verdade, menos parâmetros que o VGG-net. Obviamente, você deseja usar as pequenas ResNets aqui - não acho que o ResNet-101 possa ajudar em um conjunto de dados de 5000 imagens. Você pode aumentar muito o conjunto de dados ....
  • Como sua saída é invariável à rotação, outra ótima idéia seria usar CNNs equivalentes a grupos , cuja saída (quando usada como classificadores) é invariante a rotações discretas ou CNNs orientáveiscuja saída é invariável a rotações contínuas. A propriedade invariância permitiria obter bons resultados com muito menos aumento de dados ou, idealmente, nenhum (para o que diz respeito às rotações: é claro que você ainda precisa dos outros tipos de da). As CNNs equivalentes a grupos são mais maduras que as CNNs orientáveis ​​do ponto de vista da implementação, então eu tentaria primeiro agrupar CNNs. Você pode tentar a classificação-em-regressão, usando o G-CNN para a parte de classificação, ou pode experimentar a abordagem de regressão pura. Lembre-se de alterar a camada superior de acordo.
  • experimente o tamanho do lote (sim, sim, eu sei que hackers com hiperparâmetros não são legais, mas esse é o melhor que eu poderia obter em um período de tempo limitado e de graça :-)
  • finalmente, há arquiteturas que foram especialmente desenvolvidas para fazer previsões precisas com pequenos conjuntos de dados. A maioria deles usava convoluções dilatadas : um exemplo famoso é a rede neural convolucional densa em escala mista . A implementação não é trivial, no entanto.
DeltaIV
fonte
3
Obrigado pela resposta detalhada. Eu já estava fazendo um aumento significativo de dados. Tentei algumas variantes do modelo de criação (onde uma variação significa que o número de filtros é dimensionado igualmente em todo o modelo). Vi melhorias incríveis. Ainda tem um caminho a percorrer. Vou tentar algumas de suas sugestões. Obrigado novamente.
Rodrigo-silveira 22/03
@ rodrigo-silveira de nada, deixe-me saber como vai. Talvez possamos conversar no chat assim que você tiver resultados.
DeltaIV 23/03
1
Grande resposta, merece mais ^
Gilly
1
Muito bem composto!
Karthik Thiagarajan
1
Eu daria 10 mil pontos por isso, se pudesse. Resposta surpreendente
Boppity Bop