2

在阅读 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导致问题?

4

2 回答 2

11

obj.attr = blah的是在 object 上设置一个属性obj,所以obj控制它。做的是在 引用的对象上obj.attr[...] = blah设置一个项目obj.attr(例如,一些类似数组的对象的“内容”) ,因此对象obj.attr控制它。

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

于 2015-08-18T18:31:11.597 回答
0

第一种方法(net.blobs['data'].data = z4)的问题是'data'是net.blobs['data'](它是Caffe Blob对象)的一个属性,它不能被分配。如果将 numpy 数组分配给 data 属性,则表示“不使用为数据分配的内存,而是使用 numpy 数组的内存”,这是不可接受的。

但是如果你使用net.blobs['data'].data[...] = z4,你的意思是“将数据从 numpy 数组复制到为 data 属性分配的内存中”,这是可以接受的。


有关更多信息,您可以阅读Caffe 用户组中的类似问题

于 2016-05-17T09:04:34.873 回答