2015-07-22 131 views
0

目前,我正在使用卷積神經網絡進行紋理分類。我試圖通過使用Matlab代碼here來實現ZCA白化來預處理我的圖像。ZCA白化(MATLAB) - 內存不足

請注意,我的圖像的大小是512x512與RGB JPEG格式導致矩陣乘法內存不足。 (但是,我有我自己的理由,我不能減少我的研究中的圖像大小)

下面是我的代碼實現,例如,採取lena.jpg(512x512)作爲示例。

I = double(imread('lena.jpg')); % image size of 512x512 
x = reshape(I, [], 3); % RGB vectors 
avg = mean(x, 1);  % Compute the mean pixel intensity value separately for each channel. 
sigma = x * x'/size(x, 2); % <== I get error here 
x = x - repmat(avg, size(x, 1), 1); 
[U,S,V] = svd(sigma); 
xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x; 

下面是我memory狀態

Maximum possible array:  4338 MB (4.548e+09 bytes) * 
Memory available for all arrays:  4338 MB (4.548e+09 bytes) * 
Memory used by MATLAB:  1363 MB (1.429e+09 bytes) 
Physical Memory (RAM):  8052 MB (8.443e+09 bytes) 

* Limited by System Memory (physical + swap file) available. 

任何建議嗎?

回答

0

我懷疑你的reshape是錯誤的...

當你閱讀的圖像,它返回一個512 * 512 * 3陣列I。當你用reshape(I,[],3)重塑它時,它將變成262144 * 3陣列x。現在x*x'會產生一個262144 * 262144陣列,這對您的內存來說太大了。

編輯:

顯然,這是ZCA美白正確的步驟,但你應該應用此對圖像的小補丁,以保持size(x,1)*size(x,1)聽話......

+0

這是我在[網站](http://ufldl.stanford.edu/wiki/index.php/Implementing_PCA/Whitening)中找到了什麼:「這裏,我們假設'x'是一個數據結構,每個* *列**(所以,'x'是一個'n'-by -'m'矩陣)「 因此,我的列分別是R,G,B,行應該是每個chan的像素NEL。 如果我的想法錯了,請糾正我。 – karfai

+0

@EdwardSiew是的,顯然你的操作在這種情況下是正確的,但它通常是在圖像的補丁(比如16 * 16補丁)上產生的,它可以產生易處理的「n = 256」 –