※ 본 게시물에 사용된 내용은 대다수 <실전! 텐서플로2를 활용한 딥러닝 컴퓨터 비전>에서 사용된 자료이며, 일부 자료는 추가 수정한 부분도 존재합니다.
텐서플로2와 케라스 시작
텐서플로(TensorFlow): 구글 브레인 팀에서 제작, 연구원과 머신러닝 전문가가 사용하는 수학 라이브러리로, 심층 신경망을 훈련시키고 실행하는데 주로 사용된다.
텐서플로는 간단하게 다음과 같은 추상 아키텍쳐를 갖고 있다. 대다수의 딥러닝 계산은 C++로 구성되어 있으며, GPU나 에서 계산을 실행하기 위해 Nvidia에서 사용하는 CUDA 라이브러리를 사용하게 된다. (이래서 GPU 딥러닝을 위해선 CUDA가 필수)
이 C++소스를 저수준의 Python 코드가 감싸고 있으며, 간단한 행렬 곱셈, 덧셈같은 기초적인 연산이 가능하게 된다.
사용자 입장에서는 간단하게 Python으로 감싼 wrapper 코드를 불러다 사용하면, C++함수가 동작되게 된다. 이때문에 따로 C++ 컴파일이 요구되지 않는다.
가장 상위 구조로는 Estimator API나 케라스와 같이 고수준 API가 설계되어 있다. Estimator는 머신러닝 모델을 쉽게 구성할 수 있게 해주는 사전 제작된 구성요소를 포함하고 있다.(가장 기초적인 템플릿, 구성 요소라 생각하면 된다.)
Keras는 사용자 친화적이고, 모듈 단위로 구성된 텐서플로용 wrapper로 2015년에 발표되어 가장 빨리 실험할 수 있고 간단한 인터페이스라 말할 수 있다. 2017년 이후로는 텐서플로 안에 케라스를 통합하여, 텐서플로만 설치해도 케라스를 함께 사용할 수 있게 되었다. (따라서, 독립된 keras 자체를 import하기보다는 tf.keras를 import해서 사용하는 것이 tensorflow 호환성이 가장 좋다. 본 교재에서도 tf.keras를 import하고, keras.io문서가 아닌 TensorFlow 웹사이트에서 tf.keras 문서를 참고해서 작성되어 있다.)
현재 TensorFlow2.0이 나와 가장 많이 사용되고 있는만큼, 본 포스팅도 2.0버전을 사용한다.
Pytorch만큼 다양한 라이브러리가 존재하며, Tensorboard와 같은 시각화 도구를 사용하여 딥러닝 학습 과정을 분석하기에도 쉽다.
케라스 기반의 간단한 모델
앞에서 다뤘던 MNIST 학습 모델을 Keras로 간단하게 설계해보자.
- 예제 코드
Tensorflow 사용을 위해 tf로 import 한다. 바로 이어서, MNIST dataset을 준비한다. 이전에는 미리 설계된 mnist 라이브러리를 직접 임포트하여 데이터 로딩과정을 거쳤다면, 여기서는 미리 tf.keras에서 준비되어 있는 dataset을 임포트한다.
import tensorflow as tf # 텐서플로 임포트
num_classes = 10 # 클래스 개수 (0~9)
img_rows, img_cols = 28, 28 # 이미지 사이즈(가로, 세로 )
num_channels = 1 # 흑백
input_shape = (img_rows, img_cols, num_channels)
(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 값 정규화(0~1사이)
앞에서 필요한 데이터를 다 로딩했다면, 본격적으로 모델을 구성해보자. 여기서는 Fully Connected Layer로 구성된 단순한 모델을 사용한다. 모델을 구성하는 각 레이어를 분석하면 아래 그림과 같다.
+) Flatten(): 입력 데이터를 평평하게 펴주는 역할
+) Dense() : 일반적인 Dense Layer
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())# Flatten() : 2차원 배열(이미지) --> 1차원 배열로 전환 = 28*28 --> 784
model.add(tf.keras.layers.Dense(128, activation='relu')) # Output 크기가 128인 Dense layer
model.add(tf.keras.layers.Dense(num_classes, activation='softmax')) # Output 크기(Num_classes)10인 Dense layer
이제 본격적으로 모델 학습을 진행하자. compile()함수를 통해 Optimzier, Loss, Metrics를 설정해주자. 여기서는 optimizer로 SGD(Stochastic Gradient Descent)와 Loss로는 교차-엔트로피 손실 함수를 선정하였다.
model.compile(optimizer='sgd',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
callbacks = [tf.keras.callbacks.TensorBoard('./keras')]# 학습 결과를 확인하기 위해서 Tensorboard를 로딩한다.
model.fit(x_train, y_train, epochs=25, verbose=1, validation_data=(x_test, y_test), callbacks=callbacks)
# Epoch : 25로 학습 진행
model.summary()#실제 모델의 사양을 확인하기 위함
model.fit함수로 학습을 진행한다. 이때, 앞에서 로딩했던 데이터들과 Epoch, verbose 등의 인수를 설정해준다.
+) verbose : 얼마나 자세하게 정보를 표시할 것인가를 지정 (0 = silent, 1 = progress bar, 2 = one line per epoch.)
실제로 학습된 모델의 사양(파라미터, 레이어 구성 등)을 보기 위해 model.summary 함수를 적용해주었다.
+) model.summary함수는 fit다음에 호출해야 함
Estimator API 사용해보기
Estimator는 Keras API를 대신할 수 있는 모듈로 전체 모델을 개괄적으로 표현하여 간편히 확장, 비동기적 훈련이 가능한 모듈이다. 사실 이 모델은 간단한 DNN을 제공하기 때문에 일부 머신러닝 task(추천, 순위 모델, 단순 분류, regression..)에 적합하다.
(개인적으로 내 연구에서는 직접 복잡한 Task를 다루기 때문에 CNN, RNN, DNN이 모두 섞여있는 복잡한 모델을 통해서 학습을 진행했기 때문에 Estimator를 많이 사용해본적은 없다. 따라서, 책 내용을 정리하는 형태로 포스팅을 구성한다.)
실제로 Estimator를 생성하기 가장 쉬운 방법은 keras모델을 직접 변환하는 방법이다.
estimator = tf.keras.estimator.model_to_estimator(model, model_dir='./estimator_dir')
model_dir인수를 활용해서 모델의 체크포인트를 어디에 저장할지 위치를 지정할 수 있으며, tf.keras.estimator.model_to_estimator함수를 통해서 기존의 keras모델을 컴파일한 후 변환해준다.
Estimator를 사용하려면 입력함수(특정 포맷의 데이터를 반환하는 함수) 를 사용해야 한다. 허용되는 데이터 포맷 중 하나로, Tensorflow에서 정의된 텐서플로 Dataset이 있다. Dataset API는 추후 자세히 다루고, 자세한 내용은 링크를 참고하면 좋다.
여기서는 미리 초반에 정의한 MNIST 로딩 데이터(x_train, y_train)를 32개의 batch size로 묶어서 올바른 포맷으로 반환하게끔 하는 함수를 정의한다.
BATCH_SIZE = 32
def train_input_fn():#앞에서 로딩한 MNIST 데이터를 Estimator를 돌리기 위한 데이터 포맷으로 변경하는 과정
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_dataset = train_dataset.batch(BATCH_SIZE).repeat()
return train_dataset
이 함수가 정의되면 이제 본격적으로 estimator를 학습시킬 수 있게 된다.
estimator.train(train_input_fn, steps=len(x_train)//BATCH_SIZE)
학습 과정의 자질구레한 부분은 Estimator가 Keras처럼 알아서 처리한다.
마지막으로 Colab에서 Tensorboard를 확인해 실제 학습 과정을 살펴보자. --> 다음 포스팅 참고
'머신러닝 > Computer Vision' 카테고리의 다른 글
[OpenCV] Histogram, Normalize (0) | 2021.11.09 |
---|---|
Tensor to image / numpy array to image / PIL image save (Save feature as image) (0) | 2021.10.29 |
[Computer Vision 기초] 3. 현대 신경망(Convolution, Pooling) (0) | 2021.07.18 |
[Computer Vision 기초] 1.컴퓨터 비전과 신경망 (0) | 2021.06.28 |
[Computer Vision 기초] 0.Introduction (0) | 2021.06.28 |