Aracılığıyla paylaş


Deconvolution ve unpooling kullanarak Otomatik Kodlayıcı görüntüsü

İçindekiler Tablosu

Özet

image

Image\GettingStarted\07_Deconvolution_PY.py örneği, basit bir görüntü otomatik kodlayıcı (07_Deconvolution_BS.cntk karşılık gelen BrainScript sürümüdür) oluşturmak için Deconvolution ve Unpooling'in nasıl kullanılacağını gösterir. 28x28x1 çözünürlüğe sahip MNIST veri kümesini kullanır, convolution ve pooling kullanarak 7x7x1 gösterimine kodlar ve özgün çözünürlüğe kodlar. Eğitim ölçütü kök ortalama kare hatasıdır (RMSE). Yukarıdaki şekilde özgün görüntünün görselleştirmeleri, kodlanmış görüntü ve MNIST test kümesinin ilk beş görüntüsü için kodlanmış görüntü gösterilmektedir.

Kurulum

Örneği çalıştırmak için MNIST veri kümesine ihtiyacınız vardır. Klasöründen aşağıdaki komutu Examples\Image\DataSets\MNIST çalıştırarak verileri alabilirsiniz:

python install_mnist.py

Örneği çalıştırma

Örnek, klasöründe bulunur Examples\Image\GettingStarted . Bu örneği çalıştırmak için aşağıdaki komutu kullanarak Python sürümünü çalıştırın (Python CNTK ortamından):

python 07_Deconvolution_PY.py

veya BrainScript sürümü için şu komutu kullanın:

cntk configFile=07_Deconvolution_BS.cntk

Eğitim ve test için RMSE değerleri sırasıyla 0,225 ve 0,223'tir. Kodlanmış ve kodu çözülen görüntüleri görselleştirmek için aşağıdaki komutu çalıştırın:

python 07_Deconvolution_Visualizer.py

BrainScript modeli ve False Python modeli için ayarlanıruse_brain_script_model=True. Görselleştirmeler, kodlayıcının Output metin gösterimi ve kod çözücü çıkışı ile birlikte altındaki Examples\Image\GettingStarted klasöründe depolanır.

Teknik ayrıntılar

BrainScript'teki basit görüntü otomatik kodlayıcı için model tanımı aşağıdadır (tam yapılandırma dosyası için bkz . Image\GettingStarted\07_Deconvolution_BS.cntk)

    cMap = 1
    model = inputFeatures => {
        conv1   = ConvolutionalLayer {cMap, (5:5), pad = true, activation=ReLU}(inputFeatures)
        pool1   = MaxPoolingLayer    {(4:4), stride=(4:4)}(conv1)
        unpool1 = MaxUnpoolingLayer  {(4:4), stride=(4:4)}(pool1, conv1)
        deconv1 = DeconvLayer        {1, (5:5), cMap, lowerPad=(2:2:0), upperPad=(2:2:0), bias=false}(unpool1)
    }.deconv1

07_Deconvolution_PY.py dosyasında karşılık gelen model tanımı şudur:

    cMap = 1
    conv1   = cntk.layers.Convolution  ((5,5), cMap, pad=True, activation=cntk.ops.relu)(scaled_input)
    pool1   = cntk.layers.MaxPooling   ((4,4), (4,4))(conv1)
    unpool1 = cntk.layers.MaxUnpooling ((4,4), (4,4))(pool1, conv1)
    z       = cntk.layers.Deconvolution((5,5), num_channels, cMap, lower_pad=(0,2,2), upper_pad=(0,2,2), bias=False, init=cntk.glorot_uniform(0.001))(unpool1)
    

BrainScript sürümünü burada açıklıyoruz, Python sürümü benzerdir. Model ilk olarak giriş özelliklerine derinliği cMap=1 ve ardından ReLU etkinleştirmesi içeren bir ConvolutionalLayer uygular ve maxpoolingLayer filtre şekli ve adımını (4:4)kullanır. Bu, boyut 7x7x1olarak kodlanmış bir tensor ile sonuçlanır. Ardından, özgün çözünürlüğe geri döndürmek için ilgili filtre şekilleriyle birlikte bir MaxUnpoolingLayer ve bir DeconvLayer kullanır.

Kod çözücü bölümü, özgün 784 (28x28) sayıları 49 bir faktörü 16olan (7x7) olarak sıkıştırır. ConvolutionalLayer için yalnızca bir derinlik 1 kullanılması, kodlayıcı sonuçlarının anlamlı bir şekilde görselleştirilme avantajına sahiptir (bu sayfanın en üstündeki şekil). Daha az sıkıştırma ve umarım daha iyi kod çözme sonuçları elde etmek cMap=3 gibi kıvrımlı filtrelerin sayısını artırabilirsiniz. Bu örnekte hem eğitim hem de test için RMSE değeri olarak azaltılır 0.196. Daha az sıkıştırmaya sahip olmak için bir diğer yol da havuz katmanı için daha küçük bir filtre şekli ve adım kullanmaktır. Hem (2:2) havuza alma hem de biriktirmeyi kaldırma için kullanılması, kodlanmış bir boyut 14x14x1 tensörü verir ve bu örnekteki 0.136 RMSE'yi eğitim ve 0.131 test için olarak küçültür. Aşağıdaki şekilde, tartışılan üç ayar için MNIST test kümesinin ilk beş görüntüsü için özgün görüntünün görselleştirmesi ve kodu çözülen görüntü gösterilmektedir.

image

Deconvolution ve Unpooling

MaxUnpoolingLayer ve DeconvLayer'a biraz daha yakından bakalım.

MaxUnpoolingLayer {(4:4), stride=(4:4)}(pool1, conv1)

MaxPoolingLayer, karşılık gelen havuz katmanının (pool1 bu örnekte) çıkışı ve ilgili havuz katmanının (conv1 bu örnekte) girişi olan iki giriş gerektirir. conv1CNTK anahtar değişkenleri olarak adlandırılan değişkenleri depolamadığından CNTK'da Biriktirilmeyen işlemin hedefini belirlemek için gereklidir (ayrıntılar için buraya bakın).

DeconvLayer {1, (5:5), cMap, lowerPad=(2:2:0), upperPad=(2:2:0)}

DeconvLayer'ın ilk parametresi çıkış biriminin derinliği, ikincisi çekirdek şekli (width:height) ve üçüncüsü giriş biriminin derinliğidir. Çıkış tensörünün istenen genişliğine ve yüksekliğine ulaşmak için doldurma parametrelerinin çekirdek şekline uygun olarak ayarlanması gerekir (bu durumda 28x28). DeconvLayer hakkında daha fazla ayrıntı için Katman Başvurusu sayfasına bakın.

Çok katmanlı otomatik kodlayıcı

Daha karmaşık bir otomatik kodlayıcı için daha fazla Conv/Deconv ve Pool/Unpool katmanı yığabilirsiniz. Aşağıda, içinde kullanabileceğiniz 07_Deconvolution_BS.cntk her türden iki katman içeren bir örnek verilmiştir (dosyadaki modeli değiştirmeniz yeterlidir):

    inputDim = 1
    cMap1 = 5
    cMap2 = 1
    model = inputFeatures => {
        conv_A   = ConvolutionalLayer {cMap1, (5:5), pad = true, activation=ReLU}(inputFeatures)
        pool_A   = MaxPoolingLayer    {(2:2), stride=(2:2)}(conv_A)
        conv_B   = ConvolutionalLayer {cMap2, (5:5), pad = true, activation=ReLU}(pool_A)
        pool_B   = MaxPoolingLayer    {(2:2), stride=(2:2)}(conv_B)
        unpool_B = MaxUnpoolingLayer  {(2:2), stride=(2:2)}(pool_B, conv_B)
        deconv_B = DeconvLayer        {cMap1, (5:5), cMap2, lowerPad=(2:2:0), upperPad=(2:2:0)}(unpool_B)
        unpool_A = MaxUnpoolingLayer  {(2:2), stride=(2:2)}(deconv_B, conv_A)
        deconv_A = DeconvLayer        {inputDim, (5:5), cMap1, lowerPad=(2:2:0), upperPad=(2:2:0)}(unpool_A)
    }.deconv_A

Sonuçları görselleştirmek için, kodlayıcı çıkışı için doğru düğüm adını ele almak üzere çalıştırmadan önce değerini ile değiştirmeniz z.pool1z.pool_B07_Deconvolution_Visualizer.py gerekir. Modeldeki tüm düğüm adlarını araştırmak için Python betiğindeki açıklamayı print_all_node_names(model_file) kaldırmanız yeterlidir.