2015-08-18 2 views
2

При чтении с помощью обучающей программы Caffe (http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb), я наткнулся на следующее утверждение:Почему назначение ndarray в ndarray в PyCaffe вызывает ошибку атрибута?

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, поэтому эллипсис служит для копирования 3D-массива на 0-ю ось. Это заставило меня думать, что я должен быть в состоянии переписать код, чтобы избежать многоточие следующим образом:

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 проблемы вызывают?

+0

Чтобы уточнить, спрашиваете ли вы, что это работает с '[...]' и не без него, или вы спрашиваете, почему он работает с 'z3', а не' z4'? Вы не делаете то же самое в обоих своих примерах, потому что один из них имеет '[...]' в конце целевого назначения, а другой - нет. – BrenBarn

ответ

9

Выполнение obj.attr = blah устанавливает атрибут объекта obj, поэтому obj управляет этим. Выполнение obj.attr[...] = blah устанавливает пункт (например, «содержимое» какого-либо объекта, подобного массиву) на объекте, на который ссылается obj.attr, поэтому объект obj.attr контролирует это.

В вашем примере 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 в другом).

+0

Спасибо.В этом есть смысл. – user1245262

0

Проблема с первым способом (net.blobs['data'].data = z4) является то, что «данные» является атрибутом net.blobs [ «данные»] (который является Caffe Blob объект), который не может быть назначен. Если вы назначаете массив numpy атрибуту данных, вы имеете в виду «вместо использования памяти, выделенной для данных, используйте память массива numpy», то есть неприемлемо.

Но если вы используете net.blobs['data'].data[...] = z4, вы имеете в виду «скопировать данные из массива numpy в память, выделенную для атрибута данных», что соответствует .


Для получения дополнительной информации вы можете прочитать a similar question в Caffe Users Group.