2016-04-25 31 views
6

caffe.NetSpec() arabirimini kullanarak python ile bir caffe CNN kurmak istiyorum. Her ne kadar test ağını solver.prototxt'a koyabildiğimizi görsem de, farklı fazda model.prototxt'a yazmak istiyorum. Örneğin, caffe model prototxt farklı aşamaları ile iki veri katmanı uygulamak:caffe: model tanımı: caffe.NetSpec kullanarak farklı faz ile aynı katmanı yazın()

layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
.... 
} 
layer { 
    name: "data" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
.... 
} 

nasıl böyle uygulanmasını almak için python yapmalıyım?

+0

açık [bvlc/caffe github sorunu] (https://github.com/BVLC/caffe/issues/4044). – Shai

cevap

5

caffe.NetSpec kullanarak bir prototxt yazarken fazın nasıl tanımlanacağı anlamına mı geliyor?

from caffe import layers as L, params as P, to_proto 
import caffe 

ns = caffe.NetSpec() 
ns.data = L.Data(name="data", 
       data_param={'source':'/path/to/lmdb','batch_size':32}, 
       include={'phase':caffe.TEST}) 

aynı prototxt treni ve test katmanları İKİ olmasını istiyorsanız

, ben genellikle sadece yinelenen katmanlardan yalnızca test sürümü ile tek TÜM katmanlarıyla tren için ns ve başka ns_test yapıyor ne. Gerçek prototxt dosyasını yazarken Sonra:

with open('model.prototxt', 'w') as W: 
    W.write('%s\n' % ns_test.to_proto()) 
    W.write('%s\n' % ns.to_proto()) 

Bu şekilde aynı prototxt içinde İKİ fazları gerekecek. Biraz hacky, biliyorum.

+0

evet, caffe.NetSpec() kullanıyorum, ancak soru aynı adı taşıyan ancak farklı aşamaları olan iki katman tanımlamak istiyorum: ns.data = L.Data (name = "data", data_param = {'source ':'/yol/to/lmdb ',' batch_size ': 32}, include = {' phase ': caffe.TEST}) ns.data = L.Data (name = "data", data_param = {' source ':'/path/to/lmdb ',' batch_size ': 32}, include = {' phase ': caffe.TRAIN}) – user3162707

+0

Ancak bu yalnızca TEST aşaması – user3162707

+0

@ user3162707 için ns.data yapar lütfen benim düzenle – Shai

1

şebeke gibi ise:

layer {phase: TRAIN} 
layer {phase: TEST} 
layer {} 
layer {phase: TRAIN} 
layer {} 
layer {phase: TEST} 
layer {} 
layer {} 
layer {phase: TEST} 

tren ağı ns oluşturma ns_test
Şimdi temelde iki dizeleri str(ns.to_proto()) ve str(ns_test.to_proto())
piton regex alma kullanarak bu ikisini birleştirme sahip net bir test oluşturma gerekli katman sırasını dikkate alınız.

0

Başka bir yol buldum.
Proto dizesini döndürerek bu sorunu çözebilirim.
Temel olarak, değiştirilecek katmanlara sahip dizeler ekleyebilirsiniz (benim durumumda, ilk katman).

def lenet(path_to_lmdb_train, path_to_lmdb_test, 
      batch_size_train, batch_size_test): 
    n = caffe.NetSpec() 
    n.data, n.label = L.Data(batch_size=batch_size_train, backend=P.Data.LMDB, source=path_to_lmdb_train, 
          include=dict(phase=caffe.TRAIN), transform_param=dict(scale=1./255), ntop=2) 
    first_layer = str(n.to_proto()) 

    n.data, n.label = L.Data(batch_size=batch_size_test, backend=P.Data.LMDB, source=path_to_lmdb_test, 
          include=dict(phase=caffe.TEST), transform_param=dict(scale=1./255), ntop=2) 
    n.conv1 = L.Convolution(n.data, kernel_size=5, num_output=20, weight_filler=dict(type='xavier')) 
    n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX) 
    n.conv2 = L.Convolution(n.pool1, kernel_size=5, num_output=50, weight_filler=dict(type='xavier')) 
    n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX) 
    n.ip1 = L.InnerProduct(n.pool2, num_output=500, weight_filler=dict(type='xavier')) 
    n.relu1 = L.ReLU(n.ip1, in_place=True) 
    n.ip2 = L.InnerProduct(n.relu1, num_output=10, weight_filler=dict(type='xavier')) 
    n.loss = L.SoftmaxWithLoss(n.ip2, n.label) 
    n.accuracy = L.Accuracy(n.ip2, n.label, include=dict(phase=caffe.TEST)) 

    return first_layer + str(n.to_proto()) 
2

Yararlı bir yöntem buluyorum.

Sen test aşaması katmanı için name adlı bir anahtar ekleyin ve anahtarlarını değiştirebilir ntop ve sadece bu gibi top : yoktur

net.data = L.Data(name='data', 
       include=dict(phase=caffe_pb2.Phase.Value('TRAIN')), 
       ntop=1) 
net.test_data = L.Data(name='data', 
        include=dict(phase=caffe_pb2.Phase.Value('TEST')), 
        top='data', 
        ntop=0)