前面几节讲到Blob,Layer,Net,下面直接实践看下Caffe中Blob,Layer,Net如何使用和输出。使用caffe minist中实例(输入python命令进入python的交互界面):
>>>import caffe
>>>net = caffe.Net("examples/mnist/lenet_train_test.prototxt", "examples/mnist/lenet_iter_71.caffemodel", caffe.TEST)
查看conv1的bottom层和top层
>>>net.bottom_names['conv1']
['data']
>>>net.top_names['conv1']
['conv1']
conv1 层的权重Weight数据
net.params[‘conv1’][1].data 输出bias数据
>>>net.params['conv1'][0].data
array([[[[ 0.08391787, -0.12885658, -0.26407543, 0.04432648,
0.2734467 ],
[ 0.00385197, 0.06610291, 0.00178612, 0.02617895,
-0.34734544],
[ 0.10969362, -0.19426614,
网络执行整网的运算,最终输出到loss层
>>> net.forward()
{'loss': array(0.31564763, dtype=float32), 'accuracy': array(0.89, dtype=float32)}
conv1的blob数据
>>> net.blobs['conv1'].data
array([[[[-0.0445267 , -0.0445267 , -0.0445267 , ..., -0.0445267 ,
-0.0445267 , -0.0445267 ],
[-0.0445267 , -0.0445267 , -0.0445267 , ..., -0.0445267 ,
-0.0445267 , -0.0445267 ],
[-0.0445267 , -0.0445267 , -0.0445267 , ..., -0.0445267 ,
-0.0445267 , -0.0445267 ],
blob的维度
>>> net.blobs['conv1'].data.shape
(100, 20, 24, 24)
输出网络所有layers
>>> for layer,blob in net.blobs.iteritems():
... print layer
...
data
label
label_mnist_1_split_0
label_mnist_1_split_1
conv1
pool1
conv2
pool2
ip1
ip2
ip2_ip2_0_split_0
ip2_ip2_0_split_1
accuracy
loss
这里我使用的是Caffe的python接口(C++接口不太常用,而且python更加直观点),可以看出,Caffe通过caffe.Net()加载网络后,各layer层信息(从.prototxt获取)和参数数据(从.caffemodel获取)均已取得,可以直接进行离线测试。
其实python运行调用的是Caffe C++接口,通过python/caffe/_caffe.cpp封装,代码通过pycaffe的实现python/caffe/pycaffe.py调用。