【问题标题】:Why does assigning an ndarray to an ndarray in PyCaffe raise an Attribute Error?为什么在 PyCaffe 中将 ndarray 分配给 ndarray 会引发属性错误?
【发布时间】:2015-08-18 18:25:44
【问题描述】:

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

【问题讨论】:

  • 澄清一下,您是在问它与[...] 一起使用而不是在没有它的情况下,还是在问为什么它与z3 一起使用而不是z4?您在两个示例中都没有做同样的事情,因为其中一个在分配目标的末尾有 [...] 而另一个没有。

标签: python numpy attributes caffe pycaffe


【解决方案1】:

执行obj.attr = blah 是在对象obj 上设置一个属性,所以obj 控制它。执行obj.attr[...] = blah 是在obj.attr 引用的对象上设置一个item(例如,一些类似数组的对象的“内容”),所以对象obj.attr 控制它。 p>

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

【讨论】:

  • 谢谢。这是有道理的。
【解决方案2】:

第一种方法(net.blobs['data'].data = z4)的问题是'data'是net.blobs['data'](即Caffe Blob对象)的一个属性,不能赋值.如果给data属性赋值numpy数组,意思是“不使用分配给数据的内存,而是使用numpy数组的内存”,这是不可接受的

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


更多信息,您可以阅读 Caffe 用户组中的a similar question

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 2016-01-01
    • 2020-07-03
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2023-03-13
    相关资源
    最近更新 更多