2016-12-09 100 views
1

自分のデータセットのグレースケール画像のサイズが200x200の私の分類問題にDeep Learningを適用したいと思います。現在、大規模なデータセット(15,000以上の画像)の非常に小さなサブセット(152画像)でDLをテストしています。 Pyano(Python 2.7.12 :: Anaconda 4.2.0(64-bit))でTheano(バージョン '0.9.0.dev4')バックエンドのKeras(バージョン1.1.2)ライブラリを使用しています。私のコードはCPUで動作しますが、非常に遅いです。そこで、私はGPUに切り替えました。しかし、私はエラーの下に取得しています:GPUでKerasを使用しているメモリが不足している

Using Theano backend. 
Using gpu device 0: GeForce GTS 450 (CNMeM is enabled with initial size: 70.0% of memory, cuDNN not available) 

Train on 121 samples, validate on 31 samples 
Epoch 1/200 
Traceback (most recent call last): 

    File "<ipython-input-6-247bada3ec1a>", line 2, in <module> 
    verbose=1, validation_data=(X_test, Y_test)) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/models.py", line 652, in fit 
    sample_weight=sample_weight) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/engine/training.py", line 1111, in fit 
    initial_epoch=initial_epoch) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/engine/training.py", line 826, in _fit_loop 
    outs = f(ins_batch) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/keras/backend/theano_backend.py", line 811, in __call__ 
    return self.function(*inputs) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/compile/function_module.py", line 886, in __call__ 
    storage_map=getattr(self.fn, 'storage_map', None)) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/gof/link.py", line 325, in raise_with_op 
    reraise(exc_type, exc_value, exc_trace) 

    File "/home/user1/anaconda2/envs/keras_env/lib/python2.7/site-packages/theano/compile/function_module.py", line 873, in __call__ 
    self.fn() if output_subset is None else\ 

MemoryError: Error allocating 160579584 bytes of device memory (CNMEM_STATUS_OUT_OF_MEMORY). 
Apply node that caused the error: GpuElemwise{Composite{(i0 * (i1 + Abs(i1)))},no_inplace}(CudaNdarrayConstant{[[[[ 0.5]]]]}, GpuElemwise{Add}[(0, 0)].0) 
Toposort index: 60 
Inputs types: [CudaNdarrayType(float32, (True, True, True, True)), CudaNdarrayType(float32, 4D)] 
Inputs shapes: [(1, 1, 1, 1), (32, 32, 198, 198)] 
Inputs strides: [(0, 0, 0, 0), (1254528, 39204, 198, 1)] 
Inputs values: [CudaNdarray([[[[ 0.5]]]]), 'not shown'] 
Outputs clients: [[GpuContiguous(GpuElemwise{Composite{(i0 * (i1 + Abs(i1)))},no_inplace}.0)]] 

HINT: Re-running with most Theano optimization disabled could give you a back-trace of when this node was created. This can be done with by setting the Theano flag 'optimizer=fast_compile'. If that does not work, Theano optimizations can be disabled with 'optimizer=None'. 
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node. 

私は提案ソリューション(optimizer=fast_compileoptimizer=None)を試みたが、それがうまくいきませんでした。問題が画像サイズに関連していることはわかっています。なぜなら、画像を50x50にサイズ変更したときに機能していたからです。

200x200イメージに適用できるように問題を解決する方法を知っていますか? cuDNNを使用して私の問題への正しい解決策がある場合

02:00.0 VGA compatible controller: NVIDIA Corporation GF106 [GeForce GTS 450] (rev a1) 
[ 64.299] (--) NVIDIA(0): Memory: 1048576 kBytes 
[ 64.313] (II) NVIDIA: Using 12288.00 MB of virtual memory for indirect memory 
[ 64.439] (==) NVIDIA(0): Disabling shared memory pixmaps 

私はわからないが、私はすでに.theanorcoptimizer_including=cudnnを含むことにより、それを使用して試してみました:私はLinuxのMageia 5と私のGPU情報を使用しています

です;私は、エラーの下に取得しています:

AssertionError: cuDNN optimization was enabled, but Theano was not able to use it. We got this error: 
Device not supported 

私は私のGPUコンピューティングの互換性は、(cudnn GPUのCC要件(3.0以上)未満である)2.1であるので、それがかもしれないと思います。

大規模なデータセットで問題を修正してDLを実行してもらえると感謝します。

+0

コードを見ることなく言うのは難しいですが、小さなバッチでイメージをGPUにロードできますか? – Atirag

+0

cuDNNはあなたのGTS450 Fermi(GF106)GPUでは動作しません。 cuDNNにはケプラーGPUが必要です。あなたのGPUのメモリが不足しているようですが、GTS450はかなり古いメモリ(1GB)のないローエンドのGPUです。 –

+0

@Atirag小さなバッチサイズを試しましたが、同様のエラーが発生しています。 – SaraG

答えて

0

GPUのメモリが不足していると言われています。バッチサイズを変更し、共有変数を使用してGPUにすべてのデータを直接ロードせず、それらの間で繰り返します。そうでなければ、より高いメモリ容量を持つ別のGPUを見つける

+0

バッチサイズを小さい値に変更しましたが、問題は解決しませんでした。 2つ目の提案された解決策(共有変数を使用して、それらの間で反復)をもう少し詳しく説明してください。入力画像を別のサブセットに分割し、共有変数を使用して各エポックの異なる繰り返しでCNNにフィードする必要があることを意味しますか? – SaraG

+0

画像を共有変数に入れたときに、完全なデータセットではなくパッチサイズの量を追加するだけです。各反復で新しいイメージを再度ロードし、共有変数を更新します。ここで私が言っていることは、あなたのGPUにロードされるデータの量を減らすことです – Feras

関連する問題