2016-04-14 21 views
0

CNNをトレーニングする必要のあるデータセット(71094列車画像と17000テスト)があります。前処理をして、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ピクセルでトレーニングするのは意味がありません。これは、一度に1つの画像を読み込み、ピクセルをサンプリングする関数を作成することで簡単に行うことができます。各エポック毎にこれをランダムに行うことは、過適合を減らすことができるが、正確な問題に依存するという議論もある。層別サンプリングは、ピクセル分類を扱う場合にもクラスのバランスをとるのに役立ちます。

2)ミニバッチトレーニング - トレーニングデータを小さな「ミニバッチ」に分割し、それぞれを個別にトレーニングします。すべてのデータを使って、すべてのミニバッチのトレーニングを完了したら、エポックは終了します。ここでは、過不足を避けるために、各エポックでデータの順序をランダム化する必要があります。

3)一度に1つの画像をロードして訓練する - ミニバッチトレーニングに似ていますが、反復ごとに1つの画像を「ミニバッチ」として使用し、すべての画像をforループで実行しますフォルダ。この方法では、一度に1x100x100x3だけがメモリに格納されます。メモリサイズに応じて、Nx100x100x3のミニバッチごとに複数の画像を使用し、71094/Nの繰り返しですべてのトレーニングデータを実行することができます。

これは明らかです。いくぶん役立ちます!