CNNモデルでより多くの層を使用するとメモリエラーが発生する


7

デルのコアi7-16GB RAM-4GB 960m GPUラップトップで、3D CNNを使用して肺CT画像を分類するプロジェクトに取り組んでいます。CPUバージョンのtensorflowを使用しています。画像は、numpy配列サイズ(25、50、50)として準備されます。

私のCNNモデルには、2つの変換レイヤー、2つのmaxpoolレイヤー、1つのFCレイヤー、出力レイヤーがありました。このアーキテクチャでは、約(5000〜6000)サンプルでモデルをトレーニングできました。さらにレイヤーを追加した後、モデルには6つの変換レイヤー、3つの最大プールレイヤー、FCおよび出力レイヤーがあります。私の問題は、1000個を超えるサンプルでアーキテクチャを変更した後、メモリがいっぱいになり、メモリエラーが発生することです。小さいバッチを作成しようとしましたが、毎回同じエラーが発生しました。2つの質問があります。

  1. レイヤーを追加することで、モデルに必要なメモリが増えるのはなぜですか?

  2. この種の問題に対処する方法はありますか?


それはあなたが多くのパラメータを抱えていると、デフォルトでは、あなたのGPUを計算するために使用されており、4ギガバイトが合わない場合がありますので、おそらくです...
アーディティヤ

GPUではなくCPUバージョンのtensorflowを使用しています
Hunar A.Ahmed

回答:


4
  1. より多くのレイヤーは、ネットワークのより多くのパラメーターを意味します。これは、それらのパラメーターを格納するために必要なメモリ内のより多くのスペースを意味します。

  2. (コンピューターのメモリを増やす以外に)唯一の解決策は、ネットワークのサイズを小さくすることです。これに関するいくつかのポイント:まず、3D CNNは2D CNNよりもはるかに多くのスペースを必要とします。1つのアイデアは、2Dにシフトすることです。それ以外では、ほとんどのパラメーターを持つレイヤーはFCレイヤーです。これらは時々冗長です。最初にそれらのサイズを減らすことをお勧めします。


私は3d CNNを使用したため、3d CNNは2dよりも精度が高いと思います。FCレイヤーのノード数は1024ですが、それを減らすということですか?これは精度に影響しませんか?
Hunar A.Ahmed 2018年

1
1024204820481024+10242.1140m100m

4

によって作られたポイントに追加 MzdR、代わりにジェネレータを使用することもできます。あなたのモデルはトレーニング中にすべての画像をメモリに保持する必要はないので、ジェネレータはうまく機能すると思います。

stackoverflowからこの質問を確認してください。あなたがメモリバーゲンをしているとき、ジェネレータはかなりクールです。ただし、これも失敗する場合は、FCレイヤーのサイズを小さくしてみてください。


私はジェネレーターが私のケースにとって面白いアイデアだと思います、そして私はそれを試してみますが、私の問題は私がジェネレーターについての良い情報ではないということです。
Hunar A.Ahmed 2018年

ケラスでジェネレーターを使用することに関するこの中程度の投稿をご覧ください。アイデアを得るのに役立つかもしれません
gavin

kerasの方がはるかに簡単ですが、私のコードは生のテンソルフローで書かれており、kerasに変更できません。
Hunar A.Ahmed 2018年

stackoverflowからのこの質問は確かに役に立ちます
gavin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.