我正在训练 1000 张 28x28 大小的图像。但在训练之前,我通过参考如何实施 ZCA 美白?蟒蛇。
由于我有 1000 个大小为 28x28 的数据图像,经过展平后,它变为 1000x784。但如下代码所示,X 是否是我的 1000x784 图像数据集?
如果是这样,则意味着 ZCAMatrix 大小为 1000x1000。在这种情况下,对于预测,我有一个大小为 28x28 的图像,或者我们可以说,大小为 1x784。因此将 ZCAMatrix 与图像相乘是没有意义的。
所以我认为,X 是图像数据集的转置。我对吗?如果我是对的,那么 ZCAMatrix 的大小是 784x784。
现在我应该如何计算 ZCA 白化图像,我应该使用np.dot(ZCAMatrix, transpose_of_image_to_be_predict)
还是np.dot(image_to_be_predict, ZCAMatrix)
?建议将不胜感激。
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-5
# 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
以及一个使用示例:
X = np.array([[0, 2, 2], [1, 1, 0], [2, 0, 1], [1, 3, 5], [10, 10, 10] ]) # Input: X [5 x 3] matrix
ZCAMatrix = zca_whitening_matrix(X) # get ZCAMatrix
ZCAMatrix # [5 x 5] matrix
xZCAMatrix = np.dot(ZCAMatrix, X) # project X onto the ZCAMatrix
xZCAMatrix # [5 x 3] matrix