말랑말랑제리스타일

[딥러닝 입문]딥러닝 모델의 정의 본문

프로그래밍/딥러닝

[딥러닝 입문]딥러닝 모델의 정의

제리제리 2024. 1. 25. 09:59

딥러닝에서 데이터 전처리를 끝냈으면 모델을 정의해야 합니다. 물론 순서를 반대로 해서 딥러닝 모델을 정의하고 전처리를 진행해도 소스 흐름에 문제는 없습니다.

 

딥러닝 모델이란

 

딥러닝은 인공 신경망에 기반을 둔 머신 러닝의 기술이죠.

그렇다면 딥러닝 모델이란 뭘까요.

딥러닝 모델은 인공 신경망의 한 종류로 여러개의 레이어를 쌓아 대량의 데이터에서 복잡한 패턴을 찾아 학습하는 데에 사용되는 모델입니다.

 

딥러닝 모델은 입력 층과 데이터 추출을 위한 다수의 은닉층, 출력층으로 이루어져있는데요.

각 층은 다수의 뉴런으로 구성되어있고 뉴런들은 서로 연결되어있습니다.

여기서 각 연결은 가중치를 갖고있고 이 가중치를 딥러닝 모델 학습을 통해 최적화시킬 수 있습니다.

 

딥러닝 모델의 예로는 이미지 분류를 위한 컨볼루션 신경망을 포함해 순환 신경망, 트랜스포머 등이 있다고 하네요.

 

즉, 입력 계층과 출력 계층, 다수의 연산 계층을 넣어놓은 하나의 컴퓨터라고 생각하면 편할 것 같네요.

 

딥러닝 입문을 위한 테스트에서 사용할 모델

딥러닝 입문을 위한 테스트에서는 주로 케라스의 Sequential 모델을 사용합니다.

일단 케라스에서 제공하는 가장 간단한 모델이며, 각각의 은닉층 레이어를 순차적으로 쌓아가면서 모델을 구성하는 가장 간단한 방식이기 때문이죠.

참고로 케라스의 다른 딥러닝 모델로는 함수형 API, Model 클래스를 상속한 사용자 정의 모델, 사전 훈련된 모델 등이 존재합니다.

Sequential 모델은은 아래 파이썬 코드를 통해 선언하고 생성할 수 있습니다.

model = Sequential()

 

딥러닝 입문을 위해 Sequential 모델에 적층할 레이어

 

앞서 말했지만 케라스의 컨볼루션 신경망 Sequential 모델은 각 하나씩의 입력층, 출력층 레이어와 다수의 은닉층 레이어를 가집니다.

입력 층 레이어

입력 층에는 Conv2D 레이어로 여기에 input_shape 즉, 입력될 텐서의 형태를 미리 알려줍니다.

model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))

다시 말하지만 MNIST 모델의 이미지는 28*28의 하나의 채널을 갖는 이미지이기 때문에 input shape가 28,28,1이 들어가는 거죠.

activation은 활성화함수를 말하는데요. ReLU는 Rectified Linear Unit의 약자로 음수는 0으로, 양수는 그대로 둔다는 특징을 가진 컨볼루션 신경망 모델에서 가장 널리 쓰이는 활성화 함수 중 하나라고 하네요.

일단 이걸 깊게 파는 것보다는 일반적으로 ReLU라는 활성화 함수를 사용한다고 생각하고 넘어가는 쪽이 나을 것 같습니다.

다음으로 커널 사이즈와 32라고 들어간 값은 필터의 크기와 필터의 개수인데요.

필터의 크기가 3,3으로 지정되어있다는 것은 필터가 한번에 3*3 영역의 내용을 처리한다는 의미입니다.

필터 크기가 작아지면 선이나 점 등 작은 부분을 감지하는 데 유용하고 필터 크기가 커지면 사물의 일부같은 큰 영역을 감지하는 데에 유용하다고 합니다.

우리가 사용할 MNIST 모델의 28 * 28의 손글시를 판별하는 데에는 3*3 사이즈가 적당한 것 같습니다.

여기에 필터의 개수는 독립적으로 연산을 수행하는 횟수인데요.

만약 28 * 28 사이즈의 이미지에 3 * 3의 필터를 사용하면 1,1부터 27,27까지 가로, 세로로 각 26번 이동하게 되고 총 676번의 확인을 거치겠죠.

여기에 필터의 개수가 곱해져 총 연산 횟수는 28 * 28 * 32로 25,088번의 연산이 치뤄지게 됩니다.

즉, 필터를 많이 사용하면 정확도가 높아지는 대신 오버플로우로 생각하면 되는 과적합 상황이 발생할 수 있겠죠.

은닉 층 레이어

기본적으로 Sequentil 모델에서 은닉 층 레이어는 여러 개를 사용할 수 있다고 했죠.

이번 예시에서 사용할 은닉 층 레이어는 총 6개이며 각각의 계층의 출력은 다음 계층의 입력 값으로 쓰이게 됩니다.

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(128, activation='relu'))
model.add(Dropout(0.5))

먼저 앞서 사용했던 Conv2D 함수가 보입니다.

input shape는 이미 정의했기 때문에 파라미터로 전달되지 않고 필터만 64개로 바뀌었죠.

일단적으로 32개의 필터를 사용해서 선이나 색상 등을 학습시키고 이후 좀 더 높은 수준의 패턴이나 형태 등을 학습시키기 위해 두번의 과정을 거친다고 합니다.

다음으로 MaxPooling2D 함수에서는 최대 풀링 레이어를 추가해줍니다.

2*2는 풀링 사이즈이며, 2*2 사이즈 내에서 최대값을 선택해서 새로운 특징 맵을 만든다고 하네요.

일반적으로 대표 값을 찾아서 이미지를 평준화 비슷하게 시킨다고 이해하면 될 것 같습니다.

다음은 Dropout 함수를 통해 비활성화 뉴런을 설정해줍니다.

여기서는 25퍼센트의 뉴런을 비활성화시켜주죠.

이미 2*2 사이즈 내에서 같은 값으로 매핑을 시켜줬기 때문에 성능에 도움이 안되는 작업을 제외해주는 것으로 보입니다.

다음 단계에서 Flatten이라는 레이어를 사용할텐데요.

input을 1차원 배열로 평탄화해주는 과정입니다.

1차원으로 바꿔주었을 때 드러나는 이미지의 특징도 있으니 이 부분을 학습하는 것으로 보입니다.

다음에 추가되는 Dense 계층은 각 뉴런과 연결된 가중치를 연산하는 레이어입니다.

128은 이 레이어에서 사용할 뉴런의 개수이고 앞서 사용했던 ReLU 활성화 함수를 사용하네요.

이어서 다시 한번 Dropout 함수를 사용해서 이번에는 50퍼센트의 뉴런을 비활성화시켜줍니다.

 

출력층 레이어

마지막으로 출력층 레이어입니다.

Sequential 모델은 순차적으로 흘러가는 특성 상 하나의 입력층과 하나의 출력층을 갖는다고 했는데요.

지금까지 내용을 잘 보신 분들은 아시겠지만 입력이 되고 순차적으로 출력 값이 입력이 되는 단계를 거쳐 마지막에 출력 값을 연산 전체의 출력 값으로 내주는 레이어를 출력층 레이어라고 부르는 거죠.

model.add(Dense(10, activation='softmax'))

그렇기 때문에 은닉층의 레이어와 동일한 Dense 레이어를 사용할 수 있으며, 활성화 함수로는 softmax 함수를 사용합니다.

softmax 함수는 각 뉴런의 활성화 값을 확률로 해석하는 단계로, 출력층 레이어에서 자주 사용하는 활성화 함수입니다.

 

마무리

여기까지 TensorFlow의 케라스 모델을 정의하고 각 레이어를 적층하는 코드 구조에 대해 알아봤는데요.

Sequential 모델 도식화
Sequential 모델 도식화

전체 모델을 도식화하면 이런 형태가 됩니다.

 

이제 모델 컴파일과 학습, 모델 평가만을 남겨두고있네요.

다음 포스팅에서 이어서 작성해보도록 하겠습니다.

반응형
Comments