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属性を設定しているobjので、これobjを制御します。行うことは、 によって参照されるオブジェクトにアイテム(たとえば、配列のようなオブジェクトの「コンテンツ」) をobj.attr[...] = blah設定することであり、オブジェクトがこれを制御します。obj.attrobj.attr

あなたの例でnet.blobs['data']は、属性の設定を許可しないある種のオブジェクトであるdataため、実行できませんnet.blobs['data'].data = blah。しかし、その内容を変更できるnet.blobs['data'].data配列なのでnet.blobs['data'].data[...] = stuff、 . これらの 2 つの構文を使用して 2 つの異なるオブジェクトを操作しています (net.blobs['data']一方の場合と他方の場合net.blobs['data'].data)。

于 2015-08-18T18:31:11.597 に答える
0

最初の method( net.blobs['data'].data = z4) の問題は、'data' が net.blob['data'] (Caffe Blobオブジェクト) の属性であり、割り当てることができないことです。numpy 配列を data 属性に割り当てる場合、「データに割り当てられたメモリを使用する代わりに、numpy 配列のメモリを使用する」ことを意味し、これは受け入れられません

ただし、を使用する場合はnet.blobs['data'].data[...] = z4、「numpy 配列から data 属性に割り当てられたメモリにデータをコピーする」ことを意味し、これは許容されます。


詳細については、Caffe Users Group で同様の質問を読むことができます。

于 2016-05-17T09:04:34.873 に答える