2017-03-16 5 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) 

あなたは、彼らが表1にリストしたすべてのパラメータを追加した場合、その紙には、パラメータの総数がなっている間、私は、GoogleNetでこれを使用し、使用されるパラメータの数の11,193,984を得ました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

どのようなバイアス用語ですか? '' BatchNorm "'層のパラメータを数えないように注意してください。 – Shai

+0

@Shai:Batchnormのレイヤーとスケールは考慮されていません。私はbatchnormとバッチノルムの両方を使ってテストし、同じ数のパラメータを得ました – Breeze

答えて

0

用紙(http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf)と短い計算では正しいと思われます。 GoogLeNetのパラメータの数は、ネットワークのアンサンブルを使用して生成されます。彼らは、そのようなネットワークを7つ組み合わせて出力しました。

+0

ありがとう、実際にはパラメータの数は実際に1100万ですね? – Breeze

+0

はい、これは正しいです。 –

関連する問題