name: GoogleNet on ImageNet

SINGA version: 1.0.1

SINGA commit: 8c990f7da2de220e8a012c6a8ecc897dc7532744

parameter_url: https://s3-ap-southeast-1.amazonaws.com/dlfile/bvlc_googlenet.tar.gz

parameter_sha1: 0a88e8948b1abca3badfd8d090d6be03f8d7655d

license: unrestricted https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet


用GoogleNet做图像分类

这个例子中,我们将caffe训练好的GoogleNet转换为SINGA模型以用作图像分类。

操作说明

  • 下载参数的checkpoint文件到如下目录

      $ wget https://s3-ap-southeast-1.amazonaws.com/dlfile/bvlc_googlenet.tar.gz
      $ tar xvf bvlc_googlenet.tar.gz
    
  • 运行程序

      # use cpu
      $ python serve.py -C &
      # use gpu
      $ python serve.py &
    
  • 提交图片进行分类

      $ curl -i -F image=@image1.jpg http://localhost:9999/api
      $ curl -i -F image=@image2.jpg http://localhost:9999/api
      $ curl -i -F image=@image3.jpg http://localhost:9999/api
    

image1.jpg, image2.jpg和image3.jpg应该在执行指令前就已被下载。

详细信息

我们首先从Caffe的checkpoint文件中提取参数值,并转换为pickle版本。下载checkpoint文件后进入caffe_root/python文件夹,运行如下脚本:

# to be executed within caffe_root/python folder
import caffe
import numpy as np
import cPickle as pickle

model_def = '../models/bvlc_googlenet/deploy.prototxt'
weight = 'bvlc_googlenet.caffemodel'  # must be downloaded at first
net = caffe.Net(model_def, weight, caffe.TEST)

params = {}
for layer_name in net.params.keys():
    weights=np.copy(net.params[layer_name][0].data)
    bias=np.copy(net.params[layer_name][1].data)
    params[layer_name+'_weight']=weights
    params[layer_name+'_bias']=bias
    print layer_name, weights.shape, bias.shape

with open('bvlc_googlenet.pickle', 'wb') as fd:
    pickle.dump(params, fd)

然后我们使用SINGA的FeedForwardNet结构构建GoogleNet。 请注意,我们添加了一个EndPadding层来解决Caffe(下取整)和cuDNN(上取整)之间池化图层舍入策略差异的问题。 只有MaxPooling图层以外的启动块才有此问题。 参考这里更多详情。