BatchNorm меняет правило после обучения
Во время обучения слой Batch Normalization берёт активации мини-батча, вычисляет для каждого признака среднее и дисперсию, нормализует значения и параллельно накапливает скользящие оценки. Но при обычном запуске на новых данных он использует уже эти сохранённые оценки, а не статистику текущей пачки.
Если забыть переключить модель в режим оценки, ответ одного объекта может зависеть от соседей по батчу. Один и тот же пример, запущенный отдельно и вместе с другими, способен дать разные результаты — особенно при маленьких батчах.
Поэтому модели нужен правильный inference-режим: например, model.eval() в PyTorch. У BatchNorm репетиция и выступление идут по разным правилам.