답변:
편집 : @Toke Faurby가 올바르게 지적했듯이 tensorflow의 기본 구현은 실제로 요소 별 드롭 아웃을 사용합니다. 앞에서 설명한 내용은 CNN에서 공간 드롭 아웃 이라는 특정 드롭 아웃 변형에 적용됩니다 .
CNN에서 각 뉴런은 하나의 기능 맵을 생성합니다. 드롭 아웃 공간 드롭 아웃 은 뉴런별로 작동 하므로 뉴런을 삭제하면 해당 기능 맵이 삭제됩니다. 예를 들어 각 위치의 값이 동일합니다 (보통 0). 따라서 각 기능 맵은 완전히 삭제되거나 전혀 삭제되지 않습니다.
풀링은 일반적으로 각 기능 맵에서 개별적으로 작동하므로 풀링 전후에 드롭 아웃을 적용해도 차이가 없습니다. 최소한 maxpooling 또는 평균화와 같은 풀링 작업의 경우입니다.
편집 : 그러나 실제로 요소 별 드롭 아웃 (tensorflow의 기본값으로 설정되어 있음)을 사용하는 경우 풀링 전후에 드롭 아웃을 적용하면 실제로 차이가 있습니다. 그러나 반드시 잘못된 방법 은 아닙니다 . 평균 풀링 작업을 고려하십시오. 풀링 전에 드롭 아웃을 적용하면 결과 뉴런 활성화를 효과적으로 확장 1.0 - dropout_probability
할 수 있지만 대부분의 뉴런은 0이 아닙니다 (일반적으로). 평균 풀링 후 드롭 아웃을 적용하면 일반적으로 (1.0 - dropout_probability)
0이 아닌 "비 스케일"뉴런 활성화의 일부와 dropout_probability
0 뉴런 의 일부가 됩니다. 둘 다 나에게 실용적이며, 옳지 않다.
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)