3

CNNのベンチマークを行うとき、完全に接続されたレイヤーで最も多くの時間が費やされていることがわかりました。 pをパディングすることなく、複雑さがconv-layerよりも小さくても、完全に接続されたレイヤーで最も多くの時間を費やすのはなぜですか?

O(conv) = N*(D * (W+P) * (H+P) * h *w)/S 
O(fully_connected) = D*W*H*N 

例えば

D = Dimensions Input 
W,w = Width Input, width Filter 
H, h = Height Input, height Filter 
S = Stride 
P = Padding 
N = number of outputs 

、私は1024x11x11 feature map input DxWxH5x5 filter h,wを持っている、とStride S of 1と、と:それは計算の複雑さを計算するために来るときしかし、私はあることが分かりましたnumber of outputs N shall be 512

この結果、畳み込みの計算は次のようになります。

O(CONV)= * 512(1024 * 11 * 11 * 5 * 5)と同じ入力が完全に接続された層のために使用され、所望される場合/ 1 = 1 585 971 200

出力は、依然として512:

O(fully_connected)= 512×1024×11×11 = 63 438 848

は、GPU上で畳み込み層をparallesingするためのより高度な方法と、このによるものですconv層はより多くの操作を有するが、麻痺の問題?または、各層の複雑さを単に間違って計算する方法は間違っていますか?

+1

こんにちは、あなたのベンチマーク実験のNNアーキテクチャは何ですか? 512カーネル後にmaxpoolingをしますか? –

+0

私はAlexNet、GoogleNet、LeNetでこの振る舞いを振り返りました。そのため、プール層は場合によっては含まれていますが、完全に接続されたレイヤーでもほとんどの場合、ベンチマークはcaffe timeコマンド – Kev1n91

答えて

3

完全に接続された接続を等価な畳み込みに変換することで実装のみであるかどうかを確認できます。完全に接続されたレイヤーごとに、同等の畳み込みレイヤーがあります(詳細と例についてはmy questionを参照)。

  1. あなたはnノードに完全に接続された層が続くサイズw × h(したがって形状c × w × h)のcチャネルを有します。
  2. (c ⋅ w ⋅ h) × 1 × 1を取得するために、チャネルの後にリシェイプレイヤーを追加します。
  3. nサイズのフィルタ1 × 1で畳み込みレイヤを追加します。

時刻を確認します。それが完全に接続されたレイヤーより速い場合は、単純にコンボリューションのより良い実装によるものです。

関連する問題