2016-04-14 64 views
0

我有一個數據集(71094火車圖像和17000測試),我需要訓練一個CNN。在預處理過程中,我嘗試使用numpy創建一個矩陣,結果是荒謬的大(火車數據爲71094 * 100 * 100 * 3)[所有圖像都是RGB 100乘100]。因此,我收到了一個內存錯誤。我該如何解決這個問題。請幫忙。 這是我的代碼..預處理CNN的numpy圖像數據集:內存錯誤

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 


data_dir = './fashion-data/images/' 
train_data = './fashion-data/train.txt' 
test_data = './fashion-data/test.txt' 


f = open(train_data, 'r').read() 
ims = f.split('\n') 
print len(ims) 

train = np.zeros((71094, 100, 100, 3)) #this line causes the error.. 

for ix in range(train.shape[0]): 
    i = cv2.imread(data_dir + ims[ix] + '.jpg') 
    label = ims[ix].split('/')[0] 

    train[ix, :, :, :] = cv2.resize(i, (100, 100)) 

print train[0] 


train_labels = np.zeros((71094, 1)) 
for ix in range(train_labels.shape[0]): 
    l = ims[ix].split('/')[0] 
    train_labels[ix] = int(l) 
print train_labels[0] 

np.save('./data/train', train) 
np.save('./data/train_labels', train_labels) 

回答

0

我最近遇到了同樣的問題,並與圖像數據時,我相信它是一個常見的問題。

根據您想要做的事情,您可以使用多種方法來解決此問題。

1)訓練時從每幅圖像中採樣數據是有意義的,所以不要在所有71094 * 100 * 100像素上訓練。這可以簡單地通過創建一次加載一個圖像的函數並對像素進行採樣來完成。有一種觀點認爲,對每個時期隨機做這件事可以減少過度擬合,但也取決於確切的問題。如果您正在使用像素分類,分層採樣也可能有助於平衡類別。 2)小批量培訓 - 將您的培訓數據分成小的「小批量」並分別進行培訓。您的時代將在您完成所有小批量的培訓幷包含所有數據後結束。在這裏,您應該在每個時代對數據的順序進行隨機排列,以避免過度擬合。

3)一次加載和訓練一個圖像 - 類似於小批量訓練,但是每次迭代只使用一個圖像作爲「小批量」,然後運行for循環遍歷所有圖像文件夾。這種方式一次只能將1x100x100x3存儲在內存中。取決於你的內存大小,你可能可以使用多個圖像每個小批量,即 - Nx100x100x3,並運行71094/N迭代遍歷所有訓練數據

我希望這很清楚..而且它有些幫助!