Evrişim
Convolution (w, input,
{kernel dimensions},
mapDims = {map dimensions},
stride = {stride dimensions},
sharing = {sharing flags},
autoPadding = {padding flags (boolean)},
lowerPad = {lower padding (int)},
upperPad = {upper padding (int)},
maxTempMemSizeInSamples = 0)
Convolution()
bir ağırlık matrisinin konvolüsyonunu bir görüntü veya tensor ile hesaplar. Bu işlem görüntü işleme uygulamalarında ve dil işlemede kullanılır. Her türlü boyutu, adımı, paylaşımı veya doldurmayı destekler.
Bu işlev, formunun [M1 x M2 x ... x Mn x inChannels]
giriş tensorları üzerinde çalışır. Bu, her girişin bir boyutlu vektörden oluştuğu bir inChannels
rank-n
nesnesi olarak anlaşılabilir.
Örneğin, bir RGB görüntüsünün boyutları [W x H x 3]
(örneğin, her girişin (piksel) 3'lü bir demetden oluştuğu boyutlu bir [W x H]
yapı olabilir (bununla birlikte, bellek depolama biçiminin 3 boyutlu [W x H]
düzlemlerin birleştirmesi olduğunu unutmayın).
Convolution()
girişi -boyutlu filtrelerle n+1
bir arada kullanır; burada ilk n
boyutlar, filtrenin uzamsal kapsamıdır ve sonuncusuna inChannels
eşit olmalıdır. Filtreler vardır outChannels
. Her çıkış konumu için boyut vektörü outChannels
hesaplanır. Bu nedenle, filtre parametrelerinin toplam sayısı şeklindedir (M1*M2*...*Mn) * inChannels * outChannels
.
Convolution()
aşağıdaki parametrelere sahiptir:
w
- konvolüsyon filtre ağırlıkları, boyut[outChannels, (M1*M2*...*Mn)]
matrisi olarak depolanır; burada(M1*M2*...*Mn)
çekirdek boyutlarının ürünü olmalıdır; örneğin75
, 3 giriş kanalındaki boyutlu bir[5 x 5]
filtre için.input
- konvolüsyon girişi. Boyutları olan bir tensor[M1 x M2 x ... x Mn x inChannels]
.kernel dimensions
- BrainScript vektör olarak verilen giriş kanallarının sayısı da dahil olmak üzere filtrelerin boyutları. Son boyut, giriş kanalı sayısına eşit olmalıdır. Örneğin(5:5:3)
, 3 kanallı giriş filtresi için[5 x 5]
.mapDims
- [adlandırılmış, isteğe bağlı, varsayılan değer 0] çıkış kanalı sayısıdır (yukarıda=çağrılıroutChannels
; sonuçta elde edilen özellik eşlemesinin derinliğiyle aynıdır). 0, öğesinin satır boyutunun kullanıldığı anlamına gelirw
stride
- [adlandırılmış, isteğe bağlı, varsayılan değer 1] adım boyutlarıdır. Adım > 1, yalnızca adım değerinin katları olan piksel konumlarının hesaplandığını gösterir. Örneğin, 2'lik bir adım boyutların yarıya inmesine yol açar. Giriş kanallarının sayısıyla eşleşen son adım boyutu, giriş kanalı sayısına eşit olmalıdır.sharing
- [adlandırılmış, isteğe bağlı, varsayılan true] her giriş boyutu için paylaşım bayraklarıautoPadding
- [adlandırılmış, isteğe bağlı, varsayılan true] her giriş boyutu için otomatik olarak (simetrik olarak) doldurulması veya hiç doldurulmaması için bayraklar. Doldurma, kıvrım çekirdeğinin tüm piksel konumlarına uygulandığı ve alanın dışındaki tüm piksellerin sıfır olduğu varsayıldığı ("sıfırlarla doldurulmuş") anlamına gelir. Doldurma olmadan, çekirdekler yalnızca çekirdeğin tüm girişlerinin hala alanın içinde yer aldığı konumlar üzerinde kaydırılır. Bu durumda, çıkış boyutu giriş boyutundan küçük olacaktır. Giriş kanalı sayısıyla eşleşen son değer olmalıdırfalse
.lowerPad
- [adlandırılmış, isteğe bağlı, varsayılan değer 0] her giriş boyutu için hassas daha düşük doldurmadır.upperPad
- Her giriş boyutu için [adlandırılmış, isteğe bağlı, varsayılan değer 0] tam üst doldurmadır.maxTempMemSizeInSamples
- [isteğe bağlı olarak adlandırılır] konvolüsyon işlemlerini gerçekleştirmek için ayrılması gereken maksimum yardımcı bellek miktarı (örneklerde). Bazı kıvrımlı altyapılar (örn. cuDNN ve GEMM tabanlı altyapılar) çalışma alanının kullanılması performansı artırabileceği için yararlanabilir. Ancak, bu bazen daha yüksek bellek kullanımına yol açabilir. Varsayılan değer 0'dır ve giriş örnekleriyle aynıdır.
Formun {...}
tüm değerleri aslında çekirdek boyutları için iki nokta üst üste ayrılmış bir değer (5:5)
dizisi olarak verilmelidir. (Kullanım dışı NDLNetworkBuilder
bırakılmış kullanıyorsanız, bunların virgülle ayrılmış ve bunun yerine içine { }
alınmış olması gerekir.)
Örnek:
ConvReLULayer(inp, outMap, inMap, kW, kH, hStride, vStride, wScale, bValue) =
[
W = Parameter (outMap, inMap * kW * kH, init="gaussian", initValueScale=wScale)
b = Parameter (outMap, 1, init="fixedValue", value=bValue)
c = Convolution (W, inp, (kW:kH:inMap), stride=(hStride:vStride:inMap), autoPadding=(true:true:false))
y = RectifiedLinear (c + b)
].y
Not: Kullanım NDLNetworkBuilder
dışı bırakılmış kullanıyorsanız, örnekte sonunda hiçbir şey .y
olmamalıdır.
Basitleştirilmiş 2B Convolution (yalnızca kullanım dışı NDL)
Şimdi kullanım dışı bırakılan NDL dili, basitleştirilmiş bir 2B çeşitleme Convolution()
sağladı:
Convolution (w, image,
kernelWidth, kernelHeight, mapDims,
horizontalStride, verticalStride,
zeroPadding=false, maxTempMemSizeInSamples=0, imageLayout="cudnn" /* or "HWC"*/ )
burada:
w
- konvolüsyon ağırlık matrisi, boyutlarına[mapDims, kernelWidth * kernelHeight * inputChannels]
sahiptir.image
- giriş görüntüsü.kernelWidth
- çekirdeğin genişliğikernelHeight
- çekirdeğin yüksekliğimapDims
- çıkış özellik haritası derinliği (çıkış kanallarının sayısı)horizontalStride
- yatay yönde ilerlemeverticalStride
- dikey yönde ilerlemezeroPadding
- [named optional] görüntünün kenarlarının sıfırlarla doldurulup doldurulmayacağını belirtir. Varsayılan değer false’tur.maxTempMemSizeInSamples
- [isteğe bağlı olarak adlandırılır] konvolüsyon işlemlerini gerçekleştirmek için ayrılması gereken maksimum yardımcı bellek miktarı (örneklerde). Bazı kıvrımlı altyapılar (örn. cuDNN ve GEMM tabanlı altyapılar) çalışma alanının kullanılması performansı artırabileceği için yararlanabilir. Ancak, bu bazen daha yüksek bellek kullanımına yol açabilir. Varsayılan değer 0'dır ve giriş örnekleriyle aynıdır.imageLayout
- [isteğe bağlı olarak adlandırılır] her görüntünün depolama biçimi. Bu eski bir seçenektir. Varsayılan olarakHWC
değeridir. Bu, her görüntünün birincil sütunda depolandığı[channel, width, height]
anlamına gelir. Eğitimi hızlandırmak için cuDNN kullanıyorsanız, bunu olarakcudnn
ayarlamanız gerekir; bu da her görüntünün olarak[width, height, channel]
depolandığı anlamına gelir. Düzenincudnn
hem GPU hem de CPU üzerinde çalışacağını, dolayısıyla varsayılan olarak kullanılmasının önerildiğini unutmayın.