web-dev-qa-db-ja.com

プーリング層または畳み込み層の後のアクティベーション機能?

これらのリンクからの理論は、たたみ込みネットワークの順序が次のとおりであることを示しています:Convolutional Layer - Non-linear Activation - Pooling Layer

  1. ニューラルネットワークとディープラーニング(式(125)
  2. ディープラーニングブック(ページ304、最初の段落)
  3. Lenet(方程式)
  4. この見出しのソース

しかし、それらのサイトからの最後の実装では、順序は次のとおりです:Convolutional Layer - Pooling Layer - Non-linear Activation

  1. network3.py
  2. ソースコード、LeNetConvPoolLayerクラス

私もConv2D操作の構文を探求しようとしましたが、アクティブ化機能はありません。反転したカーネルでのたたみ込みのみです。誰かがなぜこれが起こるのかを説明するのを手伝ってくれる?

22
malioboro

まあ、最大プーリングと単調に増加する非線形性は通勤します。これは、任意の入力に対してMaxPool(Relu(x))= Relu(MaxPool(x))であることを意味します。したがって、その場合の結果は同じです。したがって、技術的には、最初にmax-poolingを介してサブサンプリングし、次に非線形性を適用することをお勧めします(シグモイドのようにコストがかかる場合)。実際には、多くの場合、逆の方法で行われます。パフォーマンスに大きな変化はないようです。

Conv2Dに関してはnotカーネルを反転します。畳み込みの定義を正確に実装します。これは線形操作であるため、次のステップで非線形性を自分で追加する必要があります。 theano.tensor.nnet.relu

30
eickenberg

多くの論文で、人々は_conv -> pooling -> non-linearity_を使用しています。別の注文を使用して妥当な結果を得られないという意味ではありません。最大プーリングレイヤーとReLUの場合、順序は関係ありません(どちらも同じものを計算します)。

enter image description here

ReLUは要素ごとの演算であり、減少しない関数であることを思い出すことで、これが事実であることを証明できます。

enter image description here

同じことがほとんどすべてのアクティベーション関数で起こります(それらのほとんどは減少していません)。ただし、一般的なプーリングレイヤー(平均プーリング)では機能しません。


それでも、両方の順序で同じ結果が得られますが、Activation(MaxPool(x))は、実行する操作の量が少ないため、処理速度が大幅に向上します。サイズがkのプーリングレイヤーの場合、アクティベーション関数の呼び出しが_k^2_倍少なくなります。

悲しいことに、この最適化はCNNでは無視できます。これは、ほとんどの時間が畳み込み層で使用されるためです。

13
Salvador Dali