print net.blob
output:
OrderedDict([('data', ), ('conv1', ), ('pool1', ), ('norm1', ), ('conv2', ), ('pool2', ), ('norm2', ), ('conv3', ), ('conv4', ), ('conv5', ), ('pool5', ), ('fc6', ), ('fc7', ), ('fc8', ), ('prob', )])
可以看出blob是一个OrderedDict,即有序字典,这个有序字典的key值分别是data,conv1,pool1,norm1等等----即不同层的名字
这个有序字典key所对应的是一个blob对象
如
print net.blob['data']
output:
然后这个blob对象里面有属性就是两个个四维数组,数组的维度是:维度是:(num,channels,height,width)
这个维度如下:
print net.blob['data'].data.shape
output:
(10, 3, 227, 227)
这个维度由deploy.prototxt中的输入数据维度定义的
每个数组里保存了data和gradient:
net.blobs['data'].data.shape # >> (64, 1, 28, 28)
net.blobs['data'].diff.shape # >> (64, 1, 28, 28)
net.blobs['conv1'].data.shape # >> (64, 20, 24, 24)
net.blobs['conv1'].diff.shape # >> (64, 20, 24, 24)
net.blobs['ip1'].data.shape # >> (64, 500)
net.blobs['ip1'].diff.shape # >> (64, 500)
同理,net.layers是一个对象,如下:
layers对象里面的一个属性blobs,如blobs[0]还是一个对象:
这个blobs对象的属性data就是数据了,分别保存weights和bias
这是layers的第一层,第一层为数据层所以没有weights和bias,输出len为0
len(net.layers[0].blobs) # >> 0
看第二层:可以看到blobs[0]是里面的data属性是一个四维数组,且保存的是权重
blobs[1]的data属性也是一个四维数组,里面保存的是bias
len(net.layers[1].blobs) # >> 2
net.layers[1].blobs[0].data.shape # >> (20, 1, 5, 5) conv1 weights
net.layers[1].blobs[1].data.shape # >> (20,) bias
net.params还没有去细研究:
以后如果要用到再细细研究:
添加代码如下:
print net.params['conv1'][0].data.shape # (20, 1, 5, 5) conv1 weights
print net.params['conv1'][1].data.shape # (20,) bia
参考:https://blog.csdn.net/wonengguwozai/article/details/54376046