79) whitening изображений
В процессе работы над s1_sparse_code_01.ipynb критичным моментом оказался whitening изображений (или “sphering” - устранение корреляции?). Для whitened версий изображений фильтры рассчитывались успешно (т.е. так, что напоминают фильтры в кортикальной зоне). Для raw версий изображений получалось что-то наподобие шума.
Т.к. в будущем предстоит работать с картинками, то решил попробовать вручную завайтенить изображения, чтобы набрать практического опыта (hands-on experience). Olshausen/Field вайтенили через Фурье преобразование. В интернетах везде пишут про PCA/ZCA вайтенинг, например тут [HadrienImWhite] и ссылки внутри. Тут (K. K. Pal and K. S. Sudeep, “Preprocessing for image classification by convolutional neural networks”, 2016) вообще утверждается, что ZCA - это самый кошер: > The results that we have achieved, clearly shows that the Zero Component Analysis(ZCA) outperforms both the Mean Normalization and Standardization techniques for all the three networks and thus it is the most important preprocessing technique for image classification with Convolutional Neural Networks.
В итоге. 1) что центрирование (mean normalization), что стандартизация (Standardization) не дали хороших результатов 2) PCA вайтенинг вообще не возможен для изображений 512x512, т.к. для такой ковариационной матрицы такого размера (262144x262144) не хватает памяти. Если воспользоваться transpose trick, то можно получить eigenvectors, но из-за того, этих векторов мало, обратно сформировать изображения не получается 3) ZCA вайтенинг с горем пополам удалось сделать. Опять же через transpose trick. И даже вроде выглядит на тестовых примерах из CIFAR правдоподобно. Но фильтры на таких картинках всё равно каким-то ненатуральными получаются. Да и визуально видно, что завайтененные изображения из sparsenet выглядят иначе. 4) при этом ZCA пробовал по разному: per-pixel mean + no rescale, per-pixel mean + per-pixel rescale, per-pixel mean + per-sample rescale, per-sample mean + no rescale, per-sample mean + global rescale. Одна фигня
Возможно, что для данной модели (s1_sparse_code_01.ipynb) ZCA и не применим… Копать вглубь Фурье преобразования решил не копать, т.к. хочется двинуться дальше по плану. Но тема заинтересовала.
UPD 2025-12-18: как это часто бывает, без интуитивного понимания что и зачем, весь смысл теряется. Так и сейчас. Вот вайтенинг, вот типа становится лучше для оработки. А почему? Какие проблемы решает? Непонятно. И только в [KrizhevskyLearnMult] боле менее ясно вычитал: “When learning a statistical model of images, it might be nice to force the model to focus on higher-order correlations rather than get distracted by modelling twoway correlations. The hypothesis is that this might make the model more likely to discover interesting regularities in the images rather than merely learn that nearby pixels are similar… One way to force the model to ignore second-order structure is to remove it. “
Т.е. мы убираем все попарные корреляции пикселей с надеждой, что модели придётся искать более высокоуровневые закономерности. И тогда становится понятым, что если сделать простой PCA вайтенинг, то мы получим картинку, которая выглядит как шум. Ведь PCA вайтенинг - это по факту декорреляция (с которой много упражнялся в cov_mat_test.ipynb). И действительно, читаем в https://stats.stackexchange.com/questions/117427/what-is-the-difference-between-zca-whitening-and-pca-whitening:”I think these examples give an idea as to when ZCA whitening might be preferable to the PCA one. Namely, ZCA-whitened images still resemble normal images, whereas PCA-whitened ones look nothing like normal images. … For most other machine learning algorithms it should be absolutely irrelevant whether the data is whitened with PCA or ZCA.”
Но! Тут важно помниать, что вайтенинг осуществляется по массиву картинок. А поэтому применение его для одной картинки может оставить некоторые смежные пиксели одинаковаыми. При этом для другой картинки смежные пиксели поменяются кардинально. ГЛАВНОЕ, ЧТОБЫ ИСЧЕЗЛА ПОПАРНАЯ КОРРЕЛЯЦИЯ ПИКСЕЛЕЙ НА ВСЁМ МАССИВЕ КАРТИНОК.

Слева - исходное изображение. Справа - ZCA вайтенед. Видно, что многие пиксели на однородных участках перепутаны (но не до неузнаваемости), а также появилось своего рода свечение вокруг контура лошади.
UPD 2025-12-23: создан отдельный ноутбук whitening_test.ipynb с целью отладить ZCA вайтенинг. Удалось добиться результатов таких же, как и в keras.preprocessing.image.ImageDataGenerator. Ещё важно, что явно получается ковариационная матрица близкая к $I$.