为什么在PyCaffe中为ndarray分配ndarray会引发属性错误?

时间:2015-08-18 18:25:44

标签: python numpy attributes caffe pycaffe

在阅读Caffe教程(http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb)时,我发现了以下声明:

net.blobs['data'].data[...] = transformer.preprocess('data',
                                  caffe.io.load_image
                                         (caffe_root + 'examples/images/cat.jpg'))

它基本上用于将单个图像分配给net.blobs['data'].data

net.blobs['data'].data[...]是4D ndarray,transformer...返回3D ndarray,因此省略号用于在第0轴上复制3D数组。这让我觉得我应该能够重写代码以避免省略如下:

z3=transformer.preprocess('data', 
                           caffe.io.load_image
                                 (caffe_root + 'examples/images/cat.jpg'))

z4 = z3[np.newaxis,...]
net.blobs['data'].data = z4

然而,当我这样做时,我得到了

>> net.blobs['data'].data = z4
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: can't set attribute

尽管如此,

net.blobs['data'].data[...] = z3

工作正常。这对任何人都有意义吗?

我已经验证了变量的形状和类型如下:

>>> print net.blobs['data'].data.shape, z3.shape, z4.shape
(1, 3, 227, 227) (3, 227, 227) (1, 3, 227, 227)

>>> print type(net.blobs['data'].data),type(z3),type(z4)
<type 'numpy.ndarray'> <type 'numpy.ndarray'> <type 'numpy.ndarray'>

为什么net.blobs['data'].data = z4会导致问题?

2 个答案:

答案 0 :(得分:10)

执行obj.attr = blah是在对象obj上设置属性,因此obj会对此进行控制。执行obj.attr[...] = blah是在obj.attr引用的对象上设置(例如,某些类似数组的对象的“内容”),因此对象{{1}控制这个。

在您的示例中,obj.attr是某种不允许设置其net.blobs['data']属性的对象,因此您无法执行data。但net.blobs['data'].data = blah 允许您更改其内容的数组,因此您可以执行net.blobs['data'].data。您使用这两种语法对两个不同的对象进行操作(一种情况为net.blobs['data'].data[...] = stuff,另一种情况为net.blobs['data']

答案 1 :(得分:0)

第一种方法(net.blobs['data'].data = z4)的问题在于数据&#39;是net.blobs [&#39; data&#39;](即Caffe Blob 对象)的属性,无法分配。如果将numpy数组分配给数据属性,则表示&#34;而不是使用为数据分配的内存,而是使用numpy数组的内存&#34;,不可接受

但是,如果您使用net.blobs['data'].data[...] = z4,则表示&#34;将数据从numpy数组复制到为数据属性&#34;分配的内存,可接受。< / p>

有关详细信息,请参阅Caffe用户组中的a similar question