IT Log

CNN (Convolutional Neural Network) 본문

Machine Learning

CNN (Convolutional Neural Network)

newly0513 2019. 5. 15. 19:01
728x90
반응형

CNN(Convolutional Neural Network)이란?

  • CNN은 사람의 시신경 구조를 모방한 구조
  • 데이터를 feature로 추출하여 패턴을 파악하는 구조
  • Convolution 과정과 Pooling 과정을 통해 진행
  • 활용용도는 보통 정보추출, 문장분류, 얼굴인식에 사용

 

CNN의 주요 용어

  • Convolution
  • Channel
  • Filter
  • Kernel
  • Stride
  • Padding
  • Feature Map
  • Activation Map
  • Pooling

Convolution

  • 하나의 함수(f)와 다른 함수(g)를 반전 이동한 값을 곱한 다음 구간에 대해 적분하여 새로운 함수를 구하는 수학 연산자

 

Channel

  • 컬러이미지는 RGB, 즉 RED, GREEN, BLUE 3개의 채널을 합친 이미지로, 40x20픽셀인 컬러사진은 (40,20,3)으로 표현하고 40x20인 흑백사진은 (40,20,1)로 표현
  • Convolution layer에 n개의 필터가 적용되면 출력데이터는 n개의 채널을 가짐

 

Filter & Stride

  • 필터는 이미지의 특징을 찾아내기 위한 공용 파라미터
  • 커널이라고도 함

  • stride는 필터를 순회하는 간격 ( 위의 그림은 stride가 1 )

 

padding

  • Feature Map 크기는 입력데이터 보다 작아져, 출력 데이터가 줄어드는 것을 방지하는 방법
  • 보통 패딩 값으로 0을 채워 넣음

 

Pooling

  • Convolution의 출력 데이터를 입력으로 받아서 출력 데이터의 크기를 줄이거나 특정 데이터를 강하는 용도로 사용
  • 처리하는 방법으로는 Max Pooling, Average Pooling, Min Pooling 3가지
  • 일반적으로 Pooling 크기와 Stride를 같은 크기로 설정하여 모든 원소가 한 번씩 처리 되도록 설정

 

Convolution 과정

이 과정은 데이터의 특징을 추출하는 과정으로 데이터에 각 성분의 인접 성분들을 조사해 특징을 파악한다.

그리고 파악한 특징을 한장으로 도출시키는 과정이다. 여기서 도출된 장을 Convolution layer라고 부른다.

이 과정은 하나의 압축과정이라고 생각할 수 있다. Parameter의 갯수를 효과적으로 줄여준다.

Filter와 Activation Function으로 이루어져 있으며, Filter는 특징이 데이터에 있는지 없는지 검출하는 함수이다.

그리고 Activation function은 feature의 유무를 수치화 하기위해 비선형 값으로 바꿔주는 함수이다.

Filter의 과정을 통해 1과0으로 분류된 데이터가 수치화된다.

 

Pooling 과정

이 과정은 Convolution 과정을 거친 layer의 사이즈를 줄여주는 과정이다. 단순히 데이터의 사이즈를 줄여주며, 노이즈를 상쇄시키고, 미세한 부분에서 일관적인 특징을 제공한다. Sub-sampling 이라고도 한다.

이과정은 Max-pooling, Average-pooling, L2-normpooling 방법이 있다. 보통은 Convolution과정에서 만들어진

feature들의 가장 큰 값들만 가져와 사이즈를 줄인다(Max-pooling)

 

vanishing gradient 문제

CNN을 진행하면서 layer 수를 늘릴수록 결과 값이 좋아지는것을 발견했으나, 일정 수를 넘어가면 오차역전파(backpropagation) 과정에서 기울기가 0이되어 사라져 버리는 현상이 발생하여 학습을 할 수 없게 되었다.


CNN 실습 ( R - keras )

keras 설치

install.packages("keras")
library(keras)
install_keras()

데이터 준비

library(keras)
mnist = dataset_mnist()
x_train = mnist$train$x		# 학습 데이터
y_train = mnist$train$y		# 학습 데이터
x_test = mnist$test$x		# test 데이터
y_test = mnist$test$y		# test 데이터

3차원 배열로 전환

3차원 배열 (images, width, height)을 행렬로 변환( 28x28 이미지는 길이가 784)
0 ~ 255 사이에 정수에서 0과 1사이의 부동소수점 값으로 회색 음영 값을 변환
dim(x_train) = c(nrow(x_train), 784)
dim(x_test) = c(nrow(x_test),784)
x_train = x_train/255
x_test = x_test/255

훈련용 데이터

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

모델 정의하기

layer_dense() : 연결된 NN layer를 출력에 추가
layer_dropout() : 입력에 dropout을 적용
model = keras_model_sequential()		# 선형 layer로 구성된 keras 모델
model %>%
  layer_dense(units = 256, activation="relu", input_shape = c(784))%>%	
  layer_dropout(rate=0.4)%>%
  layer_dense(units = 128, activation = "relu")%>%
  layer_dropout(rate = 0.3)%>%
  layer_dense(units = 10, activation = "softmax")
summary(model)

모델 Compile

model %>% compile(
  loss = "categorical_crossentropy",
  optimizer = optimizer_rmsprop(),
  metrics = c("accuracy")
)

학습 및 평가

history = model %>% fit(
  x_train, y_train,
  epochs = 30, batch_size = 128,		# 128개의 batch를 사용해서 30개의 epochs 모델 학습
  validation_split = 0.2
)

plot(history)

model %>% evaluate(x_test, y_test, verbose=0)
model %>% predict_classes(x_test)

출처 : https://blog.rstudio.com/2017/09/05/keras-for-r/
728x90
반응형

'Machine Learning' 카테고리의 다른 글

가중치 초기화  (0) 2019.05.15
오차역전파 (Backpropagation)  (0) 2019.05.15
다층 퍼셉트론 (Multi Layer Perceptron)  (0) 2019.05.15
활성화 함수 (activation function)  (0) 2019.05.15
경사하강법 (Gradient decent)  (0) 2019.05.15
Comments