web-dev-qa-db-ja.com

畳み込みニューラルネットワークのパラメーター数を計算する方法

Lasagneを使用してMNISTデータセットのCNNを作成しています。この例に密接に従っています: 畳み込みニューラルネットワークとPythonによる特徴抽出

私が現在持っているCNNアーキテクチャは、ドロップアウトレイヤーを含んでいません。

NeuralNet(
    layers=[('input', layers.InputLayer),        # Input Layer
            ('conv2d1', layers.Conv2DLayer),     # Convolutional Layer
            ('maxpool1', layers.MaxPool2DLayer), # 2D Max Pooling Layer
            ('conv2d2', layers.Conv2DLayer),     # Convolutional Layer
            ('maxpool2', layers.MaxPool2DLayer), # 2D Max Pooling Layer
            ('dense', layers.DenseLayer),        # Fully connected layer
            ('output', layers.DenseLayer),       # Output Layer
            ],
    # input layer
    input_shape=(None, 1, 28, 28),

    # layer conv2d1
    conv2d1_num_filters=32,
    conv2d1_filter_size=(5, 5),
    conv2d1_nonlinearity=lasagne.nonlinearities.rectify,

    # layer maxpool1
    maxpool1_pool_size=(2, 2),

    # layer conv2d2
    conv2d2_num_filters=32,
    conv2d2_filter_size=(3, 3),
    conv2d2_nonlinearity=lasagne.nonlinearities.rectify,

    # layer maxpool2
    maxpool2_pool_size=(2, 2),


    # Fully Connected Layer
    dense_num_units=256,
    dense_nonlinearity=lasagne.nonlinearities.rectify,

   # output Layer
    output_nonlinearity=lasagne.nonlinearities.softmax,
    output_num_units=10,

    # optimization method params
    update= momentum,
    update_learning_rate=0.01,
    update_momentum=0.9,
    max_epochs=10,
    verbose=1,
    )

これにより、次のレイヤー情報が出力されます。

  #  name      size
---  --------  --------
  0  input     1x28x28
  1  conv2d1   32x24x24
  2  maxpool1  32x12x12
  3  conv2d2   32x10x10
  4  maxpool2  32x5x5
  5  dense     256
  6  output    10

学習可能なパラメーターの数を217,706として出力します

この数がどのように計算されるのだろうか?このStackOverflowの question を含む多くのリソースを読みましたが、計算を明確に一般化するものはありません。

可能であれば、レイヤーごとの学習可能なパラメーターの計算を一般化できますか?

たとえば、畳み込み層:フィルターの数xフィルターの幅xフィルターの高さ。

34
Waddas

最初に、学習可能なパラメーターの数が各レイヤーのタイプごとにどのように計算されるかを見てから、例のパラメーターの数を計算します。

  • 入力レイヤー:入力レイヤーは入力画像を読み取るだけなので、ここで学習できるパラメーターはありません。
  • たたみ込み層:入力でl特徴マップを取り、出力としてk特徴マップを持つたたみ込み層を考えます。フィルターサイズはn x mです。たとえば、これは次のようになります。

    Visualization of a convolutional layer

    ここで、入力にはl=32機能マップが入力として、k=64機能マップが出力として、フィルターサイズはn=3 x m=3です。入力が32次元であるため、3x3フィルターだけでなく、実際には3x3x32フィルターがあることを理解することが重要です。そして、64種類の3x3x32フィルターを学習します。したがって、重みの合計数はn*m*k*lです。次に、各機能マップにバイアス項もあるため、(n*m*l+1)*kのパラメーターの総数があります。

  • プール層:プール層「2x2近傍を最大値で置き換える」を実行します。したがって、プーリング層で学習できるパラメーターはありません。
  • 完全に接続されたレイヤー:完全に接続されたレイヤーでは、すべての入力ユニットが各出力ユニットに対して個別の重みを持ちます。 n入力およびm出力の場合、重みの数はn*mです。さらに、各出力ノードにバイアスがあるため、(n+1)*mパラメーターになります。
  • 出力層:出力層は通常の完全に接続された層であるため、(n+1)*mパラメーター、ここでnは入力およびmは出力の数です。

最後の困難は、最初に完全に接続されたレイヤーです。畳み込みレイヤーであるため、そのレイヤーへの入力の次元はわかりません。それを計算するには、入力画像のサイズから始めて、各畳み込み層のサイズを計算する必要があります。あなたの場合、ラザニアはすでにこれをあなたのために計算し、サイズを報告します-それは私たちにとって簡単です。各レイヤーのサイズを自分で計算する必要がある場合は、もう少し複雑です。

  • 最も単純な場合(例のように)、畳み込み層の出力のサイズはinput_size - (filter_size - 1)で、あなたの場合は28-4 = 24です。これは畳み込みの性質によるものです。ポイントを計算する5x5の近傍-ただし、最も外側の2つの行と列には5x5の近傍がないため、これらのポイントの出力を計算することはできません。これが、出力が入力より2 * 2 = 4行/列小さい理由です。
  • 出力を入力より小さくしたくない場合は、画像をゼロで埋めることができます(Lasagneの畳み込み層のpadパラメーターを使用)。例えば。画像の周りにゼロの2行/列を追加すると、出力サイズは(28 + 4)-4 = 28になります。したがって、パディングの場合、出力サイズはinput_size + 2*padding - (filter_size -1)です。
  • 畳み込み中に画像を明示的にダウンサンプリングする場合は、ストライドを定義できます。 stride=2。つまり、フィルターを2ピクセルずつ移動します。次に、式は((input_size + 2*padding - filter_size)/stride) +1になります。

あなたの場合、完全な計算は次のとおりです。

  #  name                           size                 parameters
---  --------  -------------------------    ------------------------
  0  input                       1x28x28                           0
  1  conv2d1   (28-(5-1))=24 -> 32x24x24    (5*5*1+1)*32   =     832
  2  maxpool1                   32x12x12                           0
  3  conv2d2   (12-(3-1))=10 -> 32x10x10    (3*3*32+1)*32  =   9'248
  4  maxpool2                     32x5x5                           0
  5  dense                           256    (32*5*5+1)*256 = 205'056
  6  output                           10    (256+1)*10     =   2'570

したがって、ネットワークには合計で832 + 9'248 + 205'056 + 2'570 = 217'706の学習可能なパラメーターがあり、これはまさにLasagneが報告しているものです。

81
hbaderts

@hbadertsの優れた返信の上に構築し、I-C-P-C-P-H-Oネットワークの式を考え出しました(私は同様の問題に取り組んでいたので)、それを下の図で共有すると役立つかもしれません。

enter image description here

また、(1)2x2ストライドのコンボリューションレイヤーと(2)2x2ストライドのコンボリューションレイヤー1x1ストライド+(最大/ avg)プーリングは、それぞれ以下のように「同じ」パディングで同じ数のパラメーターを提供します。

enter image description here

7
Sandipan Dey