我编写了一个简单的脚本来计算给定体系结构的参数数量。这是:
#python caffe_param_calc.py deploy.prototxt
#or just call the script without any arguments, and it will search and show any deploy you have in the current directory
import sys
import os
import caffe
import numpy as np
from numpy import prod, sum
from pprint import pprint
def print_net_parameters (deploy_file):
print "Net: " + deploy_file
caffe.set_mode_cpu()
net = caffe.Net(deploy_file, caffe.TEST)
print "Layer-wise parameters: "
pprint([(k, v[0].data.shape) for k, v in net.params.items()])
num = sum( [prod(v[0].data.shape) for k, v in net.params.items()] )
print ("Total number of parameters: {0:,} ".format(num))
print (len(sys.argv))
if len(sys.argv) > 1 :
deploy_file = sys.argv[1]
else:
for file in os.listdir('.'):
if (file.endswith('.prototxt')):
deploy_file = file
print_net_parameters(deploy_file)
我在GoogleNet上使用了这个,并获得了11,193,984
所用参数的数量,而在他们的论文中,如果你将它们列在表1中列出的所有参数相加,那么参数总数就会变成6.7M!似乎表也不准确!我现在的问题是,我这样做是否正确?我在不同的架构上使用了相同的脚本,并得到了正确的结果
例如,VGGNet(Link)的参数总数为102,897,440。
Layer-wise parameters:
[('conv1', (96L, 3L, 7L, 7L)),
('conv2', (256L, 96L, 5L, 5L)),
('conv3', (512L, 256L, 3L, 3L)),
('conv4', (512L, 512L, 3L, 3L)),
('conv5', (512L, 512L, 3L, 3L)),
('fc6', (4096L, 18432L)),
('fc7', (4096L, 4096L)),
('fc8', (1000L, 4096L))]
Total number of parameters: 102,897,440
答案 0 :(得分:0)
根据论文(http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf)和一个简短的计算似乎是正确的。 GoogLeNet中的参数数量是通过使用一组网络生成的。他们将7个这样的网络合并为输出。