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フィルターの高さ。
最初に、学習可能なパラメーターの数が各レイヤーのタイプごとにどのように計算されるかを見てから、例のパラメーターの数を計算します。
たたみ込み層:入力でl
特徴マップを取り、出力としてk
特徴マップを持つたたみ込み層を考えます。フィルターサイズはn
x m
です。たとえば、これは次のようになります。
ここで、入力にはl=32
機能マップが入力として、k=64
機能マップが出力として、フィルターサイズはn=3
x m=3
です。入力が32次元であるため、3x3フィルターだけでなく、実際には3x3x32フィルターがあることを理解することが重要です。そして、64種類の3x3x32フィルターを学習します。したがって、重みの合計数はn*m*k*l
です。次に、各機能マップにバイアス項もあるため、(n*m*l+1)*k
のパラメーターの総数があります。
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行/列小さい理由です。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が報告しているものです。