Прежде всего, я предполагаю, что у вас не очень много сэмплов (что типично для задач такого типа). Для нахождения оценки сходства не очень оптимально просто обучать CNN со счетом 0 и 1 и решать как проблему регрессии.
Вместо этого, из предыдущего опыта, я обнаружил, что сиамская сеть и потеря триплета Идея, основанная на принципе, работает намного лучше, так как это несколько метаобучающий подход и работает с несколькими примерами (обучение в несколько шагов).
Идея состоит в том, что у вас будет CNN с последним слоем, являющимся слоем внедрения, вы выберите один якорь (наиболее характерное грязное изображение из всех имеющихся у вас грязных изображений и наиболее представительное чистое изображение из всех имеющихся у вас чистых изображений). Теперь вы пропустите чистое изображение (+) и грязное изображение (-) через сети, сравните их с изображением привязки, если привязка чистая, то вы пытаетесь сделать вектор внедрения привязки (чистым) и знак + похожим, и попытаетесь сделать вектор внедрения привязки (чистым) и + будет отличаться, и наоборот.
Вы можете просто взять L2-норму вложений и Возьмите разницу, для того же типа вы установите выход 0, а для разных случаев вы установите 1.
Существует множество реализаций, доступных в Keras, PyTorch, Tensorflow. Вот простой пример: https://medium.com/@prabhnoor0212 / siamese-network-keras-31a3a8f37d04