私はによって仮定しますC1
、C2
など、あなたが、とによる畳み込み層を意味しP1
、P2
あなたの平均プーリング層、およびFC
完全に接続手段レイヤーを。
次のように、フォワードパスに必要なメモリを計算できます。
1つの画像
float32値を使用している場合は、上記の@Alexandru Burlacuによって提供されているリンクをたどります。
Input
:50x50x3 = 7,500 = 7.5K
C1
:50x50x32 = 80,000 = 80K
P1
:25x25x32 = 20,000 = 20K
C2
:25x25x64 = 40,000 = 40K
P2
:12x12x64 = 9,216 = 9.2K <-これは問題です(そして、私の概算は、ここでは非常に波打った推測です)。50、25、「12.5」で作業する代わりに、32の倍数で作業する方が理にかなっています。32の倍数で作業することも、メモリの観点から効率的であると聞きました。これが悪い考えである理由は、2x2プーリングではスペースを適切に分割できないためです。私が間違っている場合は、遠慮なく訂正してください。
FC
:1x500 = 500 = 0.5K
Output
:1 x 10 = 10 = 0.01K(隣に何もない)
合計メモリ:7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4バイト= 628.8 KB
これは1つの画像です。
ミニバッチ
64のミニバッチサイズで作業している場合、これらの64を一度にメモリに読み込み、すべての操作を同時に実行して、次のようにすべてをスケールアップします。
Input
:64x50x50x3 = 480,000 = 480K = 0.48M
C1
:64x50x50x32 = 5,120,000 = 5.12M
P1
:64x25x25x32 = 1,280,000 = 1.28M
C2
:64x25x25x64 = 2,560,000 = 2.56M
P2
:64x12x12x64 = 589,824 = 590K = 0.59M
FC
:64x500 = 32,000 = 32K = 0.032M
Output
:1x10x64 = 640 = 0.64K = 0.00064M(気にしない、これは小さい)
総メモリ:10M x 4バイト〜40MB(ウェブサイトにも概算値が記載されているため、概算と言っています)
編集:申し訳ありませんが、ウェブサイトを誤って読みました。
ウェブサイトによると、以下を保存する必要があるため、逆方向パスにはこれの約3倍が必要です。
C1
の場合50x50x32
、それはレイヤーアクティベーションマップの値になり32x3x3
ますが、カーネル自体の学習値()はどうでしょうか。