Я пытаюсь осуществить отбеливание ZCA для маленькой CNN.Входные данные будут 72x72x3 (HWC) BGR-изображения.
Пока что моя функция отбеливания от Pascal Timshels отвечает на ZCA-отбеливание :
def zca_whitening_matrix(X):
"""
Function to compute ZCA whitening matrix (aka Mahalanobis whitening).
INPUT: X: [M x N] matrix.
Rows: Variables
Columns: Observations
OUTPUT: ZCAMatrix: [M x M] matrix
"""
# Covariance matrix [column-wise variables]: Sigma = (X-mu)' * (X-mu) / N
sigma = np.cov(X, rowvar=True) # [M x M]
# Singular Value Decomposition. X = U * np.diag(S) * V
U,S,V = np.linalg.svd(sigma)
# U: [M x M] eigenvectors of sigma.
# S: [M x 1] eigenvalues of sigma.
# V: [M x M] transpose of U
# Whitening constant: prevents division by zero
epsilon = 1e-6
# ZCA Whitening matrix: U * Lambda * U'
ZCAMatrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T)) # [M x M]
return ZCAMatrix
Для изображенияВ процессе предварительной обработки я делаю следующее:
data = data / 255.0 # data.shape = (batch_size, H * W * C)
data_norm = data - data.mean(axis=0)
ZCA_M = zca_whitening_matrix(data_norm)
xZCA = np.dot(ZCA_M, data_norm)
xZCA = (xZCA - xZCA.min()) / (xZCA.max() - xZCA.min())
Теперь этот код работает для пакетов в обучении.Насколько я понимаю, каждый рассчитывает матрицу отбеливания zca для всего обучающего набора и отбеливает все данные.
Поскольку эта матрица зависит от размера пакета, как применить эту матрицу к выводу позже (точно для одногокартина) ?Я просто усредняю это?Или я здесь неправильно понимаю что-то фундаментальное ...
Спасибо за ответы!