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