2017-03-16 99 views
0

我写了一个简单的脚本来计算给定体系结构的参数数量。这就是:GoogleNet有多少个参数?

#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中添加了所有他们列出的参数,参数的总数成为670万!而且这表格似乎也不准确!我现在的问题是,我是否正确地做到了这一点?我在不同的体系结构上使用了相同的脚本,并获得了正确的结果。
例如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

偏向条款呢?注意不要统计''BatchNorm''图层的参数。 – Shai

+0

@Shai:不考虑Batchnorm层和鳞片。我测试了蝙蝠蛾和没有批量标准,并获得相同数量的参数 – Breeze

回答