본문 바로가기

BLOG/머신러닝

[머신러닝] CNN 층에 dropout(드롭아웃) 추가하기 (텐서플로)

Dropout(드롭아웃)은 랜덤으로 선택한 node만 학습시키고, 일부 node는 버리는 것을 말하는데요, 한 번의 학습 후 다음 학습 때 이 과정을 반복합니다.

 

Dropout을 사용하면 은닉층이 많은 neural network에서 오버피팅 문제를 방지할 수 있다는 장점을 가지는데요, 텐서플로를 이용하여 만든 CNN 층에 드롭아웃 층을 추가하는 코드에 대해서 살펴보겠습니다.

 

 

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

 

이 코드는 기본적인 CNN 층을 만드는 코드인데요, 드롭아웃을 추가하고 싶다면 원하는 부분에 layers.Dropout() 을 입력해 작성해주면 됩니다. 그리고 Dropout() 함수 안에 0.1, 0.2, 0.4 등의 형식으로 수수를 입력하여 비율을 지정해줄 수 있는데요, 만약 20%의 node를 제거하는 Dropout 층을 만들고 싶다면 다음과 같이 입력하면 됩니다.

 

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Dropout(0.2)) #dropout
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

 

이와 같이 입력해줌으로써 dropout을 추가할 수 있습니다.