Edycja: Jak słusznie wskazał @Toke Faurby, domyślna implementacja w tensorflow faktycznie korzysta z rezygnacji z elementów. To, co opisałem wcześniej, dotyczy konkretnego wariantu rezygnacji z CNN, zwanego rezygnacją przestrzenną :
W CNN każdy neuron wytwarza jedną mapę cech. Od przerywania przestrzennych przerywania prac na neuronu żywej, środki neuronów, że odpowiednia właściwość mapa jest odrzucany - przykład każde stanowisko ma tę samą wartość (zwykle 0). Tak więc każda mapa obiektów jest albo całkowicie upuszczona, albo w ogóle nie upuszczona.
Pooling zwykle działa osobno na każdej mapie obiektów, więc nie powinno mieć znaczenia, czy zastosujesz rezygnację przed czy po pulowaniu. Przynajmniej tak jest w przypadku operacji pulowania, takich jak maxpooling lub uśrednianie.
Edit: Jednak jeśli rzeczywiście wykorzystać element mądry porzucaniu (co wydaje się być ustawione jako domyślne dla tensorflow), to faktycznie robi różnicę, jeśli stosuje przerywania przed lub po łączeniu. Jednak niekoniecznie jest to zły sposób. Rozważmy średnią operację łączenia: jeśli zastosujesz zanik przed połączeniem, skutecznie skalujesz wynikową aktywację neuronu o 1.0 - dropout_probability
, ale większość neuronów będzie niezerowa (ogólnie). Jeśli zastosujesz zanikanie po uśrednieniu puli, zwykle otrzymujesz ułamek (1.0 - dropout_probability)
niezerowych „nieskalowanych” aktywacji neuronów i ułamek dropout_probability
zerowych neuronów. Oba wydają mi się realne, żadne też nie jest całkowicie złe.
W tym samouczku wykorzystuje się buforowanie przed rezygnacją i uzyskuje dobre wyniki.
To niekoniecznie oznacza, że drugie zamówienie oczywiście nie działa. Moje doświadczenie jest ograniczone, używałem ich tylko na gęstych warstwach bez łączenia.
źródło
Przykład konwektu podobnego do VGG z Keras (porzucenie po pulowaniu):
źródło