Deep Learning/딥러닝 텐서플로 교과서

2. 텐서플로 기초

이니니 2022. 8. 1. 19:39
본 내용은 도서 '딥러닝 텐서플로 교과서'의 내용을 참고했습니다.
출처 : http://www.yes24.com/Product/Goods/100295267?OzSrank=1

 

 

텐서플로 : 데이터 흐름 그래프(data flow graph)를 사용하여 데이터의 수치 연산을 하는 오픈 소스 소프트웨어 프레임워크

 

텐서플로의 특징 및 장점

  • 코드 수정 없이 데스크톱, 서버, 모바일 디바이스에서 CPU나 GPU를 사용하여 연산을 구동할 수 있음
  • 분산 환경에서 실행 가능
  • 단순한 아이디어 테스트부터 서비스 단계까지 모두 이용 가능
  • GradientTape를 사용하여 자동으로 미분을 계산할 수 있음
  • 구글에서 공식 배포하였기 대문에, 다양한 학습 자료가 제공됨
  • 사용하기 편리함. 텐서플로 2.x부터는 데이터를 훈련하고 예측하는 과정이 매우 단순해졌음
  • 코드 수정 없이 CPU/GPU 모드로 동작 가능
  • 직관적이고 접근하기 쉬운 파이썬 인터페이스 제공

 

 

텐서플로 아키텍처

 

 

 

텐서플로 2.x 기초 문법

 

임의 데이터셋 사용

임의의 데이터들을 Dataset으로 만든 후, 텐서(tf.tensor)로 변환하여 사용한다.

# 텐서플로 라이브러리 호출
import tensorflow as tf

# (100, 3) 형태의 무작위 난수 생성
x = np.random.sample(100, 3))

# 일반 이미지나 배열을 list 형식으로 dataset에 넣어 준다.
dataset = tf.data.Dataset.from_tensor_slices(x)

 

 

텐서플로에서 제공하는 데이터셋 사용

tensorflow_dataset이라는 패키지는 텐서플로에서 제공하는 별도의 데이터셋이다.

>>> pip install tensorflow-datasets

pip 명령어로 패키지를 설치한 후, tfds 이름으로 tensorflow_datasets 패키지를 호출한다.

import tensorflow_datasets as tfds

ds = tfds.load('mnist', split = 'train', shuffle_files = True)

 

 

케라스에서 제공하는 데이터셋 사용

텐서플로에서 제공하는 케라스 모듈을 사용한다.

import tensorflow as tf

# 케라스를 이용하여 MNIST 데이터셋을 내려받기
data_train, data_test = tf.keras.datasets.mnistload_data()

# 훈련 데이터셋 정의
(images_train, labels_train) = data_train

# 검증 데이터셋 정의
(images_test, labels_test) = data_test

 

 

인터넷에서 데이터셋을 로컬 컴퓨터에 내려받아 사용

tf.keras.utils.get_file 메서드를 이용하자

import tensorflow as tf

url = 'https://storage.googleapis.com/download.tensorflow.org/data/illiad/butler.txt'
text_path = tf.keras..utils.get_file('butler.txt', origin = url)

 

 

모델 정의하기

모델을 정의하는 방법은 크게 세 가지이다.

초보자 : Sequential API, 전문가용 : Functional API, Model Subclassing API 이다.

 

Sequential API는 직관적이고 간결하다. 

from tensorflow.keras import models, Dense

model = tf.keras.sequential()

 

계층은 x를 입력으로 받아 y를 출력하는 형태의 계산을 표현한다. 이러한 계산을 위해서는 딥러닝의 기본층인 밀집층(dense layer)를 사용한다. add 메서드를 이용하여 모형에 계층을 추가한다.

model.add(Dense(4, activation = 'sigmoid', input_shape(4,), weights = (w, b), name = 'dense1'))

하지만, 단순히 층을 여러 개 쌓는 형태이기에 복잡한 모델을 생성할 때에는 한계가 있다.

 

 

Functional API 는 복잡한 모델을 생성할 떄의 한계를 극복할 수 있다. 입출력을 사용자가 정의해서 모델 전체를 규정하는 형태이다.

 

예시 코드

from tensorflow.keras.layers import input, Dense
from tensorflow.keras.models import Model


# 입력층(열(특성) 다섯 개를 입력으로 받음)
inputs = Input(shape = (5,))

# 은닉층 1
x = Dense(8, activation = 'relu')(inputs)

# 은닉층 2
x = Dense(4, activation = 'relu')(x)

# 출력층
x = Dense(1, activation = 'softmax')(x)

model = Model(inputs, x)

 

 

Model Subclassing API 이용하기

class ResNet(tf.keras.Model):
	def __init__(self):
    	super(ResNet, self).__init__()
        self.block_1 = layers.Dense(32, activation = 'relu')
        self.block_2 = layers.Dense(num_classes, activation = 'sigmoid')
        
    def call(self, inputs):
    	x = self.block_1(input)
        return self.block_2(x)

 

 

모델 컴파일

모델 훈련 전, 하이퍼파라미터들을 정의해야한다.

  • 옵티마이저(optimizer) : 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정함
  • 손실 함수(loss function) : 훈련하는 동안 출력과 실제 값(정답) 사이의 오차를 측정함
  • 지표(metrics) : 훈련과 검증 단계를 모니터링하여 모델의 성능을 측정함

 

다음은 모델 컴파일 예시코드이다.

model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

 

 

모델 훈련

앞의 과정을 통해 train을 한다. 모델 훈련 예시는 다음과 같다.

model.fit(x_train, y_train, epochs=10, batch_size=100, validation_data=(x_test, y_test), verbose=2)
  • 입력 데이터 : x_train
  • 결과(label) 데이터 : y_train
  • 학습 데이터 반복 횟수 : epochs=10
  • 한 번에 학습할 때 사용하는 데이터 개수 : batch_size=100
  • 검증 데이터 : validation_data=(x_test, y_test)
  • 학습 진행 상황을 보여 줄지 결정하는 것. 1로 설정하면 진행 상황을 볼 수 있음

 

 

모델 평가

주어진 검증 데이터셋을 사용하여 모델을 평가한다. 코드는 아래와 같다.

model.evaluate(x_test, y_test, batch_size = 32)
  • 검증 데이터셋 : x_test
  • 결과(label) 데이터셋 : y_test
  • 한 번에 학습할 때 사용하는 데이터 개수 : batch_size = 32

 

 

훈련 과정 모니터링

텐서보드를 이요해서 학습에 사용되는 각종 파라미터 값이 어떻게 변화하는지 손쉽게 시각화할 수 있다.

log_dir = "logs/fit/"
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)


# model.fit() 안에 callbacks를 옵션으로 넣어 준다
model.fit(x=x_train,
          y=y_train,
          epochs=5,
          validation_data=(x_test, y_test),
          callbacks=[tensorboard_callback])

tensorboard_callback 파라미터를 알아보자

  • log_dir : 로그가 저장될 디렉터리 위치를 지정
  • histogram_freq : 1로 설정하면 모든 에폭마다 히스토그램 계산을 활성화한다. 0은 비활성화 이다.

 

다음 명령어를 통해 텐서보드를 실행할 수 있다.

>>> tensorboard --logdir=./logs/fit/

 

 

모델 사용

훈련된 모델을 사용하여 실제 예측을 해보자

model.predict(y_test)