Aracılığıyla paylaş


BrainScript ile Model Düzenleme

(Not: CNTK eski sürümleri bu amaçla "MEL" (Model Düzenleme Dili) kullanıyordu. Örnekleri dönüştürme işlemi devam ediyor. MEL ile ilgili belgeler için lütfen buraya bakın.)

CNTK, modellerin bundan sonra düzenlenmesine izin verir. Bu, değişiklikler uygulanmış mevcut bir modeli klonlarken (parçaları) yeni bir model oluşturularak gerçekleştirilir. Bunun için CNTK üç temel işlev sağlar:

  • BS.Network.Load() var olan bir modeli yüklemek için
  • BS.Network.CloneFunction() mevcut modelin bir bölümünü yeniden kullanmak üzere ayıklamak için
  • BS.Network.Edit() düğümler arası değişiklikler uygulanmış bir modeli kopyalamak için

Düzenleme işlemi ayrı bir adım değildir. Bunun yerine, değiştirilmiş bir modelin üzerinde çalışması gereken bir komut modeli yüklemek için değil, BrainScriptNetworkBuilder modelin içine yükleyen ve yüklenenden anında yeni bir model oluşturan bir bölüm belirtirmodelPath.

Örnek: Ayrımcı ön eğitim

Ayrımcı ön eğitim, bir dizi sığ ağ eğitilerek derin bir ağın oluşturulduğu bir tekniktir. 1 gizli katman ağıyla başlayın, kısmi yakınsama için eğitin, ardından çıkış katmanını kaldırın, yeni bir gizli katman ekleyin ve yeni bir çıkış katmanı ekleyin. İstenen gizli katman sayısına ulaşılana kadar bu işlemi yineleyin.

Çok basit bir başlangıç modeliyle varsayalım

BrainScriptNetworkBuilder = [
    N = 40; M = 9000; H = 512
    W1   = Parameter (H, N); b1   = Parameter (H)
    Wout = Parameter (M, H); bout = Parameter (M)
    x = Input (N, tag=‘feature’) ; labels = Input (M, tag=‘labels’)
    h1 = Sigmoid (W1 * x  + b1)
    z  = Wout * h1 + bout
    ce = CrossEntropyWithSoftmax (labels, z, tag=‘criterion’)
]

Bu modeli eğitelim ve "model.1.dnn" bölümünden tasarruf edelim. Ardından, yukarıda eğitilen değerlerden ilk gizli katmanın başlatıldığı iki gizli katmana sahip bir model eğitmek istiyoruz. Bunu yapmak için, aşağıdaki gibi yeni bir model oluşturan ancak önceki modelin bölümlerini yeniden kullanan ayrı bir eğitim eylemi oluştururuz:

BrainScriptNetworkBuilder = {
    # STEP 1: load 1-hidden-layer model
    inModel = BS.Network.Load ("model.1.dnn")
    # get its h1 variable --and also recover its dimension
    h1 = inModel.h1
    H = h1.dim
    # also recover the number of output classes
    M = inModel.z.dim

    # STEP 2: create the rest of the extended network as usual
    W2   = Parameter (H, H); b2   = Parameter (H)
    Wout = Parameter (M, H); bout = Parameter (M)
    h2 = Sigmoid (W2 * h1  + b2)
    z  = Wout * h2 + bout
    ce = CrossEntropyWithSoftmax (labels, z, tag=‘criterion’)
}

İlk olarak, ADIM 1 ağı bir BrainScript değişkenine yüklemek için kullanır Load() . Ağ, tüm üst düzey düğümlerin (düğüm adlarında veya [ içermeyen tüm düğümler) kayıt söz dizimi aracılığıyla erişilebildiği bir . BrainScript kaydı gibi davranır. Yeni bir ağ, yüklü bir ağdaki herhangi bir düğüme başvurabilir. Bu örnekte, yüklenen ağ ilk gizli katmanın çıktısı olan bir düğüm h1 ve çıkış sınıflarının (Softmax işlevine giriş) normalleştirilmemiş günlük posterior olasılığı olan bir düğüm z içerir. Her iki düğüme de BrainScript'ten nokta söz dizimi aracılığıyla erişilebilir, örneğin inModel.h1 ve inModel.z.

Sabitlerin modellerde depolanmadığını, bu nedenle modelde ne de NM modelde kullanılamadığını unutmayın. Ancak, bunları yüklenen modelden yeniden yapılandırmak mümkündür. Bu amaçla, hesaplama düğümleri de BrainScript kayıtları gibi davranır ve bir dim özelliği kullanıma sunar.

Ardından 2. ADIM, normal BrainScript kullanarak yeni ağın geri kalanını oluşturur. Bu yeni bölümün giriş modelindeki düğümü h1 giriş olarak kullandığına dikkat edin. Diğer düğümler gibi. Giriş ağından bir düğüme başvurmak, bu düğümün bağımlı olduğu tüm düğümleri otomatik olarak yeni oluşturulan ağın bir parçası yapar. Örneğin, giriş düğümü x otomatik olarak yeni ağın bir parçası olur.

Ayrıca çıkış katmanının yeniden oluşturduğunu unutmayın. Bu şekilde model parametreleri yeni oluşturulur. (Bunu yapmak ve bunun yerine mevcut parametreleri yeniden kullanmak inModel.Woutiçin kullanabilirsiniz, ancak bu örnekte ağ tasarımı açısından anlamlı olmadığını unutmayın.)

Örnek: Önceden eğitilmiş bir model kullanma

Aşağıda, önceden eğitilmiş bir modelin (dosyadan "./featext.dnn") özellik ayıklayıcısı olarak kullanılmasına bir örnek verilmiştir:

BrainScriptNetworkBuilder = {
    # STEP 1: load existing model
    featExtNetwork = BS.Network.Load ("./featext.dnn")

    # STEP 2: extract a read-only section that is the feature extractor function
    featExt = BS.Network.CloneFunction (
                  featExtNetwork.input,    # input node that AE model read data from
                  featExtNetwork.feat,     # output node in AE model that holds the desired features
                  parameters="constant")   # says to freeze that part of the network

    # STEP 3: define the part of your network that uses the feature extractor
    # from the loaded model, which above we isolated into featExt().
    # featExt() can be used like any old BrainScript function.
    input = Input (...)
    features = featExt (input)  # this will instantiate a clone of the above network

    # STEP 4: and add the remaining bits of the network in BrainScript, e.g.
    h = Sigmoid (W_hid * features + b_hid) # whatever your hidden layer looks like
    z = W_out * h + b_out
    ce = CrossEntropyWithSoftmax (labels, z)
    criterionNodes = (ce)
}

ADIM 1, ağı bir BrainScript değişkenine yüklemek için kullanır Load() .

ADIM 2, yüklenen ağdan özellik ayıklamayla ilgili bölümü kopyalamak için featExtNetwork.featkullanırCloneFunction(). Bu, öğesine bağlanan featExtNetwork.input alt grafiktir. belirttiğimiz parameters="constant"için, bağımlı olan featExtNetwork.feat tüm parametreler de kopyalanıp salt okunur hale getirilir.

ADIM 3 ve 4'te yeni ağ tanımlanır. Bu, diğer Tüm BrainScript modellerinde olduğu gibi yapılır, ancak artık işlevini kullanabiliriz featExt() .

ve ile düğüm adlarıyla .[ ilgili sorunlar ]

veya []içeren . bir ağdaki düğüme başvurmak için bu karakterleri ile _değiştirin. Örneğin, network adlı result.znetwork.result.z bir düğüm içeriyorsa başarısız olur; bunun yerine deyinnetwork.result_z.

Örnek: Mevcut bir ağın düğümlerini değiştirme

Var olan bir ağın iç kısımlarını değiştirmek için, değişiklikler kopyalama işleminin bir parçası olarak uygulanırken, aslında ağı kopyalayabilirsiniz. Bu, tarafından BS.Network.Edit()gerçekleştirilir. Edit() bir ağın tüm düğümleri üzerinde yinelenir ve çağıran tarafından geçirilen lambda işlevlerine her düğümü birer birer sunar. Bu lambda işlevleri daha sonra düğümü inceleyebilir ve düğümü değiştirilmemiş olarak döndürebilir veya yerine yeni bir düğüm döndürebilir. Edit() belirtilmemiş sırada düğümler üzerinde yinelenir. Değiştirme düğümü, değiştirilen bir ağ düğümüne başvuruyorsa, Edit() son adım olarak bu tür tüm başvuruları ilgili değiştirmelere ("doğru şeyi yap") güncelleştirir.

TODO: Örnek.

Sonraki: Tam İşlev Başvurusu