J'ai travaillé sur un problème de régression où l'entrée est une image et l'étiquette est une valeur continue entre 80 et 350. Les images sont de certains produits chimiques après qu'une réaction ait lieu. La couleur qui apparaît indique la concentration d'un autre produit chimique qui reste, et c'est ce que le modèle doit produire - la concentration de ce produit chimique. Les images peuvent être pivotées, retournées, mises en miroir et la sortie attendue doit toujours être la même. Ce type d'analyse est effectué dans de vrais laboratoires (des machines très spécialisées produisent la concentration des produits chimiques en utilisant l'analyse des couleurs, tout comme j'entraîne ce modèle à le faire).
Jusqu'à présent, je n'ai expérimenté que des modèles basés à peu près sur VGG (plusieurs séquences de blocs conv-conv-conv-pool). Avant d'expérimenter avec des architectures plus récentes (Inception, ResNets, etc.), je pensais rechercher s'il existe d'autres architectures plus couramment utilisées pour la régression à l'aide d'images.
L'ensemble de données ressemble à ceci:
L'ensemble de données contient environ 5 000 échantillons 250 x 250, que j'ai redimensionnés à 64 x 64, ce qui facilite la formation. Une fois que j'ai trouvé une architecture prometteuse, je vais expérimenter avec des images de plus grande résolution.
Jusqu'à présent, mes meilleurs modèles ont une erreur quadratique moyenne sur les ensembles de formation et de validation d'environ 0,3, ce qui est loin d'être acceptable dans mon cas d'utilisation.
Jusqu'à présent, mon meilleur modèle ressemble à ceci:
// 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)
Question
Quelle est une architecture appropriée pour la sortie de régression d'une entrée d'image?
modifier
J'ai reformulé mon explication et supprimé les mentions d'exactitude.
Modifier 2
J'ai restructuré ma question donc j'espère qu'il est clair ce que je recherche