python如何知道对象属性(方法)以及如何知道dict的层次结构

时间:2016-09-11 19:03:46

标签: python object

我正在使用caffe Python包装器。关于使用Python访问数据细节我有两个问题。

我首先通过以下方式加载了caffe net定义:

net = caffe.Net('deploy_full.prototxt',caffe.TEST)

我知道网络将是Python中的一个对象,我想知道其中的属性,所以我使用bulit-in dir()方法:

>>> dir(net)
['__class__', '__delattr__', '__dict__', '__doc__',         '__format__','__getattribute__', '__hash__', '__init__', '__module__','__new__',    '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_backward', '_batch', '_blob_loss_weights', '_blob_names', '_blobs', '_forward', '_inputs', '_layer_names', '_outputs', '_set_input_arrays', 'backward', 'blob_loss_weights', 'blobs', 'copy_from', 'forward', 'forward_all', 'forward_backward_all', 'inputs', 'layers', 'outputs', 'params', 'reshape',     'save', 'set_input_arrays', 'share_with']

然后我使用params属性来查找net.params的键属性:

>>> net.params.keys()
['conv1a', 'bn1a', 'conv1b', 'bn1b', 'conv2a', 'bn2a', 'conv2b', 'bn2b',  'conv3a', 'bn3a', 'conv3b', 'bn3b', 'fc8-conv']

问题出在这里,我想知道net.params的详细信息[&#​​39; bn1a']:

>>> net.params['bn1a']
<caffe._caffe.BlobVec object at 0x7f274b71fbb0>
>>> dir(net.params['bn1a'])
['__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__instance_size__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add_blob', 'append', 'extend']

这些输出不是我想要的,在谷歌搜索之后,我发现我希望看到是通过这些命令实现的:

>>> net.params['bn1a'][0].data.shape
(1, 16, 1, 1)
>>> net.params['bn1a'][1].data.shape
(1, 16, 1, 1)

我的问题是我怎么知道这个词中应该有[0],[1]和[x]?由于net.params.keys()只告诉我有关键字&#39; bn1a&#39;,但没有告诉我[num]。

此外,如果我不知道[&#39; bn1a&#39;]之后有[数字],我无法知道net.params [&#39; bn1a&#39]的属性;] [x],所以我无法知道这些数据和形状。

我想知道在事先没有知识的情况下剥离数据/对象的正确方法。

1 个答案:

答案 0 :(得分:0)

通常在这种情况下,我会去检查BlobVec类源代码并找出__iter__方法实现和所有其他方法。但是在你的情况下它不会那么有用,因为caffe._caffe.BlobVec实际上指向C++ implementation当你发现它是向量并且在迭代它时如果你知道关于C ++的事情以及它如何绑定Python和其他很棒的东西:)

所以在你的情况下,检查文档真的更好。在Python section下你会找到

  

Caffe blob暴露为numpy ndarray,易于使用和提高效率。

然后你应该找到关于numpy数组的文档,你完成了。