Deconvolution ve unpooling kullanarak Otomatik Kodlayıcı görüntüsü
İçindekiler Tablosu
Özet
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 7x7x1
olarak 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ü 16
olan (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.
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. conv1
CNTK 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.pool1
z.pool_B
07_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.