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:
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
fonte
Respostas:
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
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:
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ênciay x α=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,
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.N N<5000 h(xi) xi yi yi∈[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
summary
função de qualquer estrutura que você esteja usando. No entanto, aproximadamente eu diria que você tem(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:
fonte