@StatsSorceress TL; DR:
このアクティビティを実行して、必要なメモリを自分で計算できるかどうかを確認します。
アクティベーション: 532,752 * 2 * 4 /(1024 ^ 2)= 4.06 MB
パラメーター: 19,072,984 * 4 /(1024 ^ 2)* 3 = 218.27 MB
その他: 128 * 9,000 * 4 /(1024 ^ 2)= 4.39 MB
合計メモリ:(4.06 * 128)+ 218.27 + 4.39 = 742.34 MB
(私が間違っている場合、誰かがこれを修正してください。参考までに、あなたはすでに128を雑多に掛けていたので、上記の128を掛けなかったのはそのためです)
この記事と対応するビデオを紹介します。彼らは何が起こっているのかをより良く理解するのを助けてくれました。
注: 予測にネットワークを使用するために必要なメモリは、次の2つの理由でトレーニングに必要なメモリよりもはるかに少ないです。
- 予測時には、ネットワークでは画像を前方に送信するだけで、後方には送信しません(したがって、メモリX 3を乗算しません。以下を参照)
- 画像ごとに1つの予測があります(予測にバッチを使用しないため、1つの画像に必要なメモリにバッチサイズを掛ける必要はありません)。
プロセス(トレーニングするメモリ)
- 1つの画像でトレーニングするために必要なメモリを計算する
- この数にバッチ内の画像の数を掛けます
(覚えておいてください: ミニバッチ処理では、データのサブセットを取得し、そのサブセット内の各画像の勾配と誤差を計算し、それらを平均して、平均の方向に進みます。アクティベーションの数は、バッチ内の画像の数によって複数になります。
ステップ1:1つのイメージのメモリ
1つのイメージをトレーニングするには、次のためにメモリを予約する必要があります。
モデルパラメータ:
各レイヤーの重みとバイアス、勾配、および運動量変数(Adam、Adagrad、RMSPropなどの場合、オプティマイザーが使用されます)
このメモリを概算するには、重みとバイアスを格納するために必要なメモリを計算し、それに3を掛けます(つまり、重みとバイアスを格納するために必要なメモリの量は(おおよそ)に等しいため、「3」勾配と運動量変数に必要な)
式:
畳み込み:
weights(n)= depth(n)*(kernel_width * kernel_height)* depth(n-1)
バイアス(n)=深さ(n)
完全に接続された(密な)レイヤー:
重み(n)=出力(n)*入力(n)
バイアス(n)=出力(n)
ここで、nは現在のレイヤー、n-1は前のレイヤー、outputsはFCレイヤーからの出力の数、inputsはFCレイヤーへの入力の数です(前のレイヤーが完全に接続されたレイヤーでない場合、入力の数は、平坦化されたレイヤーのサイズに等しくなります)。
注:重みとバイアスのみのメモリ、および1つの画像のアクティベーションのメモリ(以下を参照)は、予測に必要なメモリの総量です(畳み込みなどのメモリのオーバーヘッドを除く)。
- アクティベーション(これらはCaffeの「Blob」です):
(私はここで緩く用語を使用しています、我慢してください)
畳み込み層の各畳み込みは、「画像内のピクセル数」アクティベーションを生成します(つまり、1つの畳み込みに画像を渡すと、「m」アクティベーションで構成される単一の特徴マップが得られます。「m」は、画像/入力)。
完全に接続されたレイヤーの場合、生成するアクティベーションの数は出力のサイズに等しくなります。
畳み込み:
activations(n)= image_width * image_height * image_num_channels
完全に接続された(密な)レイヤー:
activations(n)= outputs(n)
入力は実際にはネットワークの最初の画像にすぎないことに注意してください。畳み込みの後、それは何かに変わります(機能マップ)。より正確にするには、実際に「image_width」、「image_height」、および「image_num_channels」を「input_width」、「input_height」、および「layer_depth」に置き換えます。(この概念を画像の観点から考えるのは簡単です。)
各レイヤーでのアクティベーションのエラーも保存する必要があるため(バックワードパスで使用)、アクティベーションの数に2を掛けて、ストレージスペースにスペースを空ける必要があるエンティティの総数を取得します。アクティブ化の数はバッチ内の画像の数とともに増加するため、この数にバッチサイズを掛けます。
ステップ2:バッチをトレーニングするためのメモリ
重みとバイアスの数(3倍)とアクティベーションの数(バッチサイズの2倍)を合計します。これに4を掛けると、バッチのトレーニングに必要なバイト数が得られます。GB単位で答えを得るには、1024 ^ 2で割ることができます。