드롭 아웃 레이어 전후에 풀링 레이어가 추가됩니까?


35

Convolutional Neural Network (CNN)를 만들고 있는데, 여기에는 Convolutional 레이어와 풀링 레이어가 있으며 드롭 아웃을 적용하여 과적 합을 줄이려고합니다. 풀링 레이어 뒤에 드롭 아웃 레이어를 적용해야한다는 느낌이 들지만 실제로 백업 할 항목이 없습니다. 드롭 아웃 레이어를 추가하기에 적합한 장소는 어디입니까? 풀링 레이어 전후에?

답변:


18

편집 : @Toke Faurby가 올바르게 지적했듯이 tensorflow의 기본 구현은 실제로 요소 별 드롭 아웃을 사용합니다. 앞에서 설명한 내용은 CNN에서 공간 드롭 아웃 이라는 특정 드롭 아웃 변형에 적용됩니다 .

CNN에서 각 뉴런은 하나의 기능 맵을 생성합니다. 드롭 아웃 공간 드롭 아웃 은 뉴런별로 작동 하므로 뉴런을 삭제하면 해당 기능 맵이 삭제됩니다. 예를 들어 각 위치의 값이 동일합니다 (보통 0). 따라서 각 기능 맵은 완전히 삭제되거나 전혀 삭제되지 않습니다.

풀링은 일반적으로 각 기능 맵에서 개별적으로 작동하므로 풀링 전후에 드롭 아웃을 적용해도 차이가 없습니다. 최소한 maxpooling 또는 평균화와 같은 풀링 작업의 경우입니다.

편집 : 그러나 실제로 요소 별 드롭 아웃 (tensorflow의 기본값으로 설정되어 있음)을 사용하는 경우 풀링 전후에 드롭 아웃을 적용하면 실제로 차이가 있습니다. 그러나 반드시 잘못된 방법 은 아닙니다 . 평균 풀링 작업을 고려하십시오. 풀링 전에 드롭 아웃을 적용하면 결과 뉴런 활성화를 효과적으로 확장 1.0 - dropout_probability할 수 있지만 대부분의 뉴런은 0이 아닙니다 (일반적으로). 평균 풀링 후 드롭 아웃을 적용하면 일반적으로 (1.0 - dropout_probability)0이 아닌 "비 스케일"뉴런 활성화의 일부와 dropout_probability0 뉴런 의 일부가 됩니다. 둘 다 나에게 실용적이며, 옳지 않다.


1
이것이 드롭 아웃을 수행하는 표준 방법인지 확실하지 않습니다. 예를 들어 tf.nn.dropout에 "기본적으로 각 요소는 독립적으로 유지되거나 삭제됩니다"라고 표시됩니다. 이것을 백업하는 소스가 있습니까?
Toke Faurby

1
오! 내가 설명한 것은 이제 공간 드롭 아웃 이라고합니다 : arxiv.org/pdf/1411.4280.pdf . 따라서 @TokeFaurby는 내 주장을 의심합니다. 그러나 링크 된 논문에서도 읽을 수 있으므로 전체 기능 맵을 공간 드롭 아웃 방식으로 삭제하면 성능이 향상됩니다. 인접한 활성화가 서로 밀접하게 관련되어 있고 특정 요소를 제거하는 것이 실제로 해당 요소에 의해 전달되는 정보를 전혀 삭제 하지 않기 때문에 놀라운 것은 아닙니다. 요소별로). 이 차이를 반영하여 답변을 편집하겠습니다.
schreon

10

이 자습서 에서는 드롭 아웃 전에 풀링을 사용하고 좋은 결과를 얻습니다.

그렇다고 다른 명령이 작동하지 않는다는 의미는 아닙니다. 내 경험은 제한적이며 풀링없이 밀도가 높은 레이어에서만 사용했습니다.


5

Keras의 VGG와 유사한 컨 버네 (풀링 후 사용 된 드롭 아웃)의 예 :

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD

# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)

model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.