如何使用 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 的内核。
-希望对您有所帮助:)
我正在进行一些优化,以使卷积层和全连接层运行得更快。我需要预训练的 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 的内核。
-希望对您有所帮助:)