如何使用 Caffe 框架提取预训练 Alex Net 模型的卷积参数

How to extract Convolution Parameter of a Pre-Trained Alex Net model using Caffe Framework

我正在进行一些优化,以使卷积层和全连接层运行得更快。我需要预训练的 Alex Net 模型的卷积核权重,以便与实际图像执行卷积。

我尝试通过编写一个简单的 python 代码来提取第一个卷积层的内核参数。

# Load the original network and extract the fully connected layers'    parameters.
import caffe
import sys

f1=open('./testfile', 'w')

net = caffe.Net('models/bvlc_alexnet/deploy.prototxt', 
            '/media/ubuntu/sdcard/bvlc_alexnet.caffemodel', 
            caffe.TEST)

print >> f1, net.params['conv1'][0].data

这给出了 Alex Net 第一层的内核权重,但内核大小存在差异。

我的输出文件是这样的

[[[[ -2.83153467e-02  -6.76262565e-03   1.69464536e-02 ...,
 -1.89594068e-02  -1.02251852e-02   6.16483716e-03]
[ -3.29505093e-02  -1.28040602e-02   1.36566022e-02 ...,
 -2.06015427e-02  -3.66760854e-04   2.51943078e-02]
[ -3.83224562e-02  -1.63374413e-02   1.71793532e-02 ...,
 -2.37888489e-02   1.93770428e-03   3.10342778e-02]
...,
[ -1.32519063e-02   1.20311677e-02   1.48218526e-02 ...,
 -1.09308660e-02   1.10638803e-02   3.24864089e-02]
[ -1.22069763e-02   8.22285190e-03   1.70185007e-02 ...,
 -8.42322689e-03   1.14848586e-02   3.08694635e-02]
[ -3.33898212e-03   1.44736944e-02   9.51856188e-03 ...,
 -1.00268638e-02   6.68688724e-03   2.11901478e-02]]

由于我们在 alex net 的第一个卷积层中有 96 个大小为 (11*11*3) 的内核,因此预期输出为 96 个大小为 (11*11*3) 的内核。

我没有为第二个甚至第三个卷积层获得适当的权重。

我能够获得卷积核权重,问题出在记事本文件的大小上。

这是我修改后的代码,我在其中循环打印内核权重。

import caffe
import sys 
import numpy as np

f1=open('./testfile', 'w')
print >> f1,"";
f1.close();
net = caffe.Net('models/bvlc_alexnet/deploy.prototxt', 
            '/media/ubuntu/sdcard/bvlc_alexnet.caffemodel', 
            caffe.TEST)
f1=open('./testfile', 'a')
for num in range(0,95):
    print >> f1,net.params['conv1'][0].data[num]
f1.close()

我得到了 96 个大小为 11*11*3 的内核。

-希望对您有所帮助:)