我使用Lasagne为MNIST数据集创建CNN。我紧跟这个例子:Convolutional Neural Networks and Feature Extraction with 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滤镜高度。
答案 0 :(得分:73)
让我们首先看看如何为您拥有的每种类型的图层计算可学习参数的数量,然后计算示例中的参数数量。
卷积层:考虑一个卷积层,它在输入端采用l
个要素贴图,并将k
个要素贴图作为输出。过滤器尺寸为n
x m
。例如,这将如下所示:
此处,输入有l=32
个要素图作为输入,k=64
要素图作为输出,过滤尺寸为n=3
x m=3
。重要的是要理解,我们不是简单地使用3x3滤波器,而是实际上是3x3x32滤波器,因为我们的输入具有32维。我们学习了64种不同的3x3x32过滤器。
因此,权重总数为n*m*k*l
。
然后,每个要素图还有一个偏差项,因此我们的参数总数为(n*m*l+1)*k
。
n
输入和m
输出,权重数为n*m
。此外,您对每个输出节点都有偏差,因此您处于(n+1)*m
参数。(n+1)*m
参数,其中n
是输入数量,m
是产出数量。最后的难点是第一个完全连接的层:我们不知道该层输入的维数,因为它是卷积层。要计算它,我们必须从输入图像的大小开始,并计算每个卷积层的大小。在您的情况下,Lasagne已经为您计算并报告尺寸 - 这使我们很容易。如果你必须自己计算每一层的大小,那就更复杂了:
input_size - (filter_size - 1)
,在您的情况下:28 - 4 = 24.这是由于卷积的性质:我们使用例如计算一个点的5x5邻域 - 但是两个最外面的行和列没有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&0 396 + 2' 570 = 217˂ 706可学习的参数,这正是Lasagne报道的内容。
答案 1 :(得分:6)
建立在@ hbaderts的优秀回复之上,刚刚想出了ICPCPHO网络的一些公式(因为我正在处理类似的问题),在下图中分享它可能会有帮助。
此外,(1)具有2x2步幅的卷积层和(2)卷积层1x1步幅+(max / avg)汇集2x2步幅,每个参数与相同的'相同。填充,如下所示:
答案 2 :(得分:0)
计算卷积层大小=((n + 2p-k)/ s)+1 在这里
在上述情况下