Soru Caffe / pycaffe için hile sayfası?


Tüm önemli pycaffe komutları için bir hile sayfası olup olmadığını bilen var mı? Ben sadece Matlab arayüzü ve terminal + bash betikleri ile caffe kullanıyordum.

Ipython'u kullanmaya ve ipython dizüstü bilgisayar örnekleriyle çalışmaya geçmek istedim. Bununla birlikte, python için caffe modülünün içindeki tüm işlevlerin bir özetini almayı zor buluyorum. (Ben de piton için oldukça yeni).


43
2017-09-03 15:32


Menşei




Cevaplar:


pycaffe testleri ve bu dosya python kodlama arayüzüne giden ana geçittir.

Her şeyden önce, Caffe'yi CPU veya GPU ile kullanıp kullanmayacağınızı seçmek istersiniz. Aramak için yeterlidir caffe.set_mode_cpu() veya caffe.set_mode_gpu(), sırasıyla.

Pycaffe arayüzünün ortaya koyduğu ana sınıftır. Net. İki kurucu var:

net = caffe.Net('/path/prototxt/descriptor/file', caffe.TRAIN)

sadece bir Net (bu durumda Veri Katmanı eğitim için belirtilen) veya

net = caffe.Net('/path/prototxt/descriptor/file', '/path/caffemodel/weights/file', caffe.TEST)

hangi bir oluşturur Net ve sağlanan ağırlıklardaki ağırlıkları otomatik olarak yükler caffemodel dosya - bu durumda kullanarak Veri Katmanı test için belirtildi.

bir Net nesnenin çeşitli öznitelikleri ve yöntemleri vardır. Bulunabilirler İşte. Daha sık kullandığım şeylerden bahsedeceğim.

Ağ bloblarına erişim yoluyla ulaşabilirsiniz. Net.blobs. Örneğin.

data = net.blobs['data'].data
net.blobs['data'].data[...] = my_image
fc7_activations = net.blobs['fc7'].data

Parametrelere (ağırlıklara) da benzer şekilde erişebilirsiniz. Örneğin.

nice_edge_detectors = net.params['conv1'].data
higher_level_filter = net.params['fc7'].data

Tamam, şimdi ağın bazı verilerle beslenmesinin zamanı geldi. Yani kullanacaksın backward() ve forward() yöntemleri. Yani, tek bir resmi sınıflandırmak istiyorsanız

net.blobs['data'].data[...] = my_image
net.forward() # equivalent to net.forward_all()
softmax_probabilities = net.blobs['prob'].data

backward() hesaplama gradyanları ile ilgileniyorsanız, yöntem eşdeğerdir.

Net ağırlıklarını daha sonra yeniden kullanmak için kaydedebilirsiniz. Bu sadece meselesi

 net.save('/path/to/new/caffemodel/file')

Çözücü

Pycaffe tarafından maruz kalan diğer çekirdek bileşen Solver. Birkaç çeşit çözücü var, ama sadece kullanacağım SGDSolver açıklık için. Bir caffe modeli yetiştirmek için gereklidir. Çözücü ile başlayabilirsiniz.

solver = caffe.SGDSolver('/path/to/solver/prototxt/file')

Solver antrenman yaptığınız ağı ve varsa test için kullanılan ağı kapsülleyecektir. Genellikle aynı ağ olduklarını, sadece farklı bir ağ olduğunu unutmayın. Veri Katmanı. Ağları ile erişilebilir

 training_net = solver.net
 test_net = solver.test_nets[0] # more than one test net is supported

Sonra, bir çözücü yineleme, yani, ağırlık güncellemesi ile ileri / geri bir geçiş gerçekleştirebilirsiniz, sadece yazarak

 solver.step(1)

veya çözücüyü son iterasyona kadar

 solver.solve()

Diğer özellikler

Pycaffe gibi daha fazla şey yapmanıza izin verdiğini unutmayın. Ağ mimarisini bir Python sınıfı ile belirtmek veya yeni oluşturuluyor tabaka tip. Bu özellikler daha az sıklıkla kullanılmaktadır, ancak test durumlarını okuyarak anlamak oldukça kolaydır.


95
2017-09-10 18:16



Çok güzel cevap. Teşekkür ederim. Sadece üç noktanın anlamı için googled net.blobs['data'].data[...]. Görünüşe göre normalde yazılacak olan matris içindeki tüm öğeleri ele alan kısa bir formdur. [:,:,:]. - mcExchange
Harika mesaj. Teşekkür ederim. Bir küçük öğe: net.params ['conv'] 'a (örneğin) eriştiğimde bunun BlobVec olduğunu, BlobVec olduğunu, yani nets.params [' conv1 '] gibi bir erişim olduğunu anlıyorum. Bunun yerine, bu vektörün ayıklayabileceğiniz bir Blob elde etmek için endekslenmesi gerekmektedir (ör. Net.params ['conv1'] [0] .data). Belki bir başkasının neden yukarıdaki hile sayfasına (belki daha yeni sürüm?) Uyuşmayacağı hakkında yorum yapabilir, ancak paylaşmaya değer göründü. - user3162307
@FlavioFerrara: Rotasyon, makas vb. Gibi gerçek zamanlı büyütme yapmak istiyorum. net.blobs['data'].data[...] = my_altered_image. Yaptıktan sonra net.forward(), modelin ağırlıklarını kullanarak diske kaydetmeden nasıl güncellerim net.save? - VeilEclipse
Modelin ağırlığını güncellemek istediğinizde, muhtemelen bir Çözücü istersiniz. İleri / geri geçişi ve sizin için ağırlık güncellemesini yönetir. Gerçek zamanlı veri artışı, bir özel DataLayerPython'da yapmak oldukça kolay. Görmek İşte - Flavio Ferrara
İle veri belirtildikten sonra net.blobs['data'].data[...] = my_imagegibi bir şey kullanmamalıyız net.forward(start='conv1')? Aksi halde ağ, prototxt tanımlayıcı dosyasında belirtilen verileri yeniden yükler. - beaver


Lütfen Flavio Ferrara'nın cevabının çok zaman kaybetmenize neden olabilecek bir litte problemine sahip olduğunu unutmayın:

net.blobs['data'].data[...] = my_image
net.forward()

Yukarıdaki katmanın ilk katmanı Veri türü katmanı ise yukarıdaki kod geçersizdir, çünkü net.forward() çağrılır, ilk katmandan başlayacak ve ardından eklediğiniz veriler my_imagekapsanacak. Bu yüzden hiçbir hata göstermeyecek, ancak size tamamen alakasız çıktı verecektir. Doğru yol, başlangıç ​​ve bitiş katmanını atamaktır, örneğin:

net.forward(start='conv1', end='fc')

Burada, PFL Veri Kümesi üzerinde, Picocaffe ve bazı matlab kodları kullanan bir Yüz Doğrulama Denemesi'nin bir Github deposu var. Sanırım çok yardımcı olabilir, özellikle caffe_ftr.py dosya.

https://github.com/AlfredXiangWu/face_verification_experiment

Ayrıca, burada görüntü sınıflandırması için piliç kullanmanın bazı kısa örnek kodları :

http://codrspace.com/Jaleyhd/caffe-python-tutorial/ http://prog3.com/sbdm/blog/u011762313/article/details/48342495


10
2017-07-18 02:59



Verileri görüntüde ayarlama hakkındaki notunuzda. Solver.step (1) ile de sorun yaratır mı? - mkuse