티스토리 뷰

개발공부/🤖 DL & ML

[딥러닝 기초] 텐서플로우와 딥러닝 학습 방법

2022. 10. 28. 17:41

1️⃣ 딥러닝 모델의 학습 방법

 

 

▶  딥러닝 모델의 구성 요소

 

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

 

 

▶  딥러닝 모델의 학습 방법

 

Loss function 을 최소화하기 위해 최적화 알고리즘을 적용

 

→  예측값과 실제값 간의 오차값을 최소화하기 위해 오차값을 최소화하는 모델의 인자를 찾는 알고리즘을 적용

 

 

 

손실 함수 (Loss Function)

 

-  실제값과 모델이 예측한 값 간의 차이를 계산해주는 함수

-  손실 함수의 값은 가중치와 편향을 업데이트하는 데에 사용된다.

 

- Loss(손실)  :  예측값과 실제 값 간의 오차값

 

 

 

최적화 (Optimization)

 

- 오차값을 최소화하는 모델의 인자를 찾는 것

 

 

 

 

 

 

▶  Gradient Descent (GD)

 

-  가장 기본적인 최적화 알고리즘

-  신경망의 가중치들을 𝑊라고 했을 때, 손실함수 𝐿𝑜𝑠𝑠(𝑊)의 값을 최소화하기 위해 기울기 ∇𝐿𝑜𝑠𝑠(𝑊)를 이용하는 방법

손실 함수(loss function)의 미분값인 gradient를 이용해 모델에게 맞는 최적의 가중치(weight), 즉 손실 함수의 값을 최소화 하는 가중치를 구할 수 있는 알고리즘

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

 

각 가중치들의 기울기를 구하는 방법

 

- 딥러닝에서는 역전파(Backpropagation)을 통해 각 가중치들의 기울기를 구할 수 있다.

 

 

 

 

 

 

▶  역전파 (Backpropagation)

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

Forward Propagation (순전파)

 

-  입력 값을 바탕으로 출력 값을 계산하는 과정

 

 

ex) 순전파 예시

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

Backpropagation (역전파)

 

-  목표 target 값과 실제 모델이 예측한 output 값이 얼마나 차이나는지 구한 후 오차값을

다시 뒤로 전파해가며 변수들을 갱신하는 알고리즘

-  Forward propagation의 반대 방향으로 이루어지는 과정

-  다층 퍼셉트론 모델을 이루는 가중치들을 개선하기 위해 개발된 여러 알고리즘들 중 가장 유명하고 널리 쓰이는 방법

 

 

 

ex) 역전파 예시

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

 

 

 

 

2️⃣  텐서플로우 (TensorFlow)

 

딥러닝 모델 구현을 위해서는

딥러닝 모델(파이썬) + 좋은 연산 장치(하드웨어) + 연산 장치 제어(C/C++) 등등 배울 것이 너무 많다.

 

 

→  프레임워크를 통한 딥러닝 모델 구현

 

 

-  딥러닝 모델의 학습과 추론을 위한 프로그램

-  딥러닝 모델을 쉽게 구현, 사용가능

 

 

그 중 TensorFlow와 PyTorc가 현재 가장 많이 사용되고, 빠른 성장율을 가진 프레임워크이다.

 

 

 

▶  텐서플로우

 

 

-  유연하고, 효율적이며, 확장성 있는 딥러닝 프레임워크

-  대형 클러스터 컴퓨터부터 스마트폰까지 다양한 디바이스에서 동작한다.

 

-  데이터 플로우 그래프를 사용하여 수치 연산을 하는 오픈소스 소프트웨어 라이브러리

-  CPU나 GPU를 사용하여 연산을 구동시킬수 있으며, 머신러닝과 딥러닝 연구를 목적으로 구글 브레인 팀이 2015년에 개발했다.

 

 

 

 

 

 

텐서 (Tensor)

 

Tensor = Multidimensional Arrays = Data

 

딥러닝에서 텐서는 다차원 배열로 나타내는 데이터를 의미한다.

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

플로우 (Flow)

 

플로우는 데이터의 흐름을 의미한다.

 

텐서플로우에서 계산은 데이터 플로우 그래프로 수행

→  그래프를 따라 데이터가 노드를 거쳐 흘러가면서 계산

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

텐서 + 플로우

 

딥러닝에서 데이터를 의미하는 텐서(tensor)와 데이터 플로우 그래프를 따라 연산이 수행되는 형태(Flow)의 합

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

 

 

▶  텐서플로우 버전

 

텐서플로우 version.1

 

텐서플로우 1.X 에서는 아래와 같은 그래프 구조를 이용해 연산하도록 구성되어 있고, 모든 학습과 계산을 Session에서 진행한다.

따라서, 값을 계산하고 출력하기 위해서는 그래프 및 세션(Session) 생성 및 실행이 필요하다.

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

텐서플로우 version.2

 

2019년 9월부터 배포된 2.0 버전 이후부터는 즉시 실행(Eager Execution) 모드

→  기능을 통해 계산 그래프, 세션 생성 없이 실행 가능

 

 

 

 

 

▶  텐서플로우 기초 사용법

 

 

1)  Constant Tensor (상수 텐서)

import tensorflow as tf

# 상수형 텐서 생성
tensor_a = tf.constant(value, dtype=None, shape=None, name=None)

# 모든 원소 값이 0인 텐서 생성
tensor_b = tf.zeros(shape, dtype=tf.float32, name=None)

# 모든 원소 값이 1인 텐서 생성
tensor_c = tf.ones(shape, dtype=tf.float32, name=None)

-  value : 반환되는 상수값

-  dtype : 반환되는 Tensor 타입

-  shape : Tensor의 차원

-  name : 텐서 이름

 

 

ex) 상수 텐서 생성 및 수식 정의

import tensorflow as tf

# 상수 텐서 생성
a = tf.constant([1,0],dtype=tf.float32)

# 수식 정의
def forward(x):
    return W * x + b

# 텐서 계산 및 출력
output = forward(a)
print(output)



# Result
tf.Tensor([[1. 0.][1. 0.]], shape=(2, 2), dtype=float32)

 

 

 

 

2)  Sequence Tensor (시퀀스 텐서)

import tensorflow as tf

# start에서 stop까지 증가하는 num 개수 데이터를 가진 텐서 생성
tensor_d = tf.linspace(start, stop, num, name=None)

-  start : 시작 값

-  stop : 끝 값

-  num : 생성할 데이터 개수

-  name : 텐서의 이름

 

 

import tensorflow as tf

# start에서 limit까지 delta씩 증가하는 데이터를 가진 텐서 생성 (일정한 증가량으로 증가하는 텐서)
tensor_e = tf.range(start, limit, delta, name=None)

-  start : 시작 값

-  limit : 끝 값

-  delta : 증가량

-  name : 텐서의 이름

 

 

 

 

3)  Variable Tensor (변수 텐서)

import tensorflow as tf

# 변수형 텐서 생성
tensor_f = tf.Variable(initial_value=None, dtype= None, name= None)

-  initial_value : 초기 값

-  dtype : 반환되는 Tensor 타입

-  name : 텐서의 이름

 

 

 

 

💡  텐서플로우 자료형

 

tf.float32 32-bit float
tf.float64 64-bit float
tf.int8 8-bit integer
tf.int16 16-bit integer
tf.int32 32-bit integer
tf.uint8 8-bit unsigned integer
tf.string String
tf.bool Boolean

 

 

💡  텐서플로우 이항연산자

 

tf.add(x, y) x 텐서와 y 텐서를 더합니다.
tf.subtract(x, y) x 텐서에서 y 텐서를 뺍니다.
tf.multiply(x, y) x 텐서와 y 텐서를 곱합니다.
tf.truediv(x, y) x 텐서를 y 텐서로 나눕니다.

 

 

 

 

 

 

 

 

3️⃣  텐서플로우로 딥러닝 모델 구현하기

 

▶  딥러닝 모델 구현 순서

 

 

1.  데이터셋 준비하기  :  Epoch 와 Batch

 

Epoch

:  한 번의 epoch는 전체 데이터 셋에 대해 한 번 학습을 완료한 상태

 

Batch

:  나눠진 데이터 셋 (보통 mini-batch라고 표현)

 

이미지 출처 : 엘리스 딥러닝 기초 2장 텐서플로우와 딥러닝 학습방법 강의자료

 

 

 

ex)  총 데이터가 1000개, Batch size = 100

 

→  1 iteration = 100개 데이터에 대해서 학습

→  1 epoch = 100/Batch size = 10 iteration

 

💡  iteration는 epoch를 나누어서 실행하는 횟수를 의미

 

 

 

 

-  Dataset API를 사용하여 딥러닝 모델 용 데이터 셋을 생성하기

data = np.random.sample((100,2))
labels = np.random.sample((100,1))

# numpy array로부터 데이터셋 생성
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)

 

 

 

 

 

 

2.  딥러닝 모델 구축하기  :  고수준 API 활용

 

 

-  텐서플로우의 패키지로 제공되는 고수준 API

-  딥러닝 모델을 간단하고 빠르게 구현 가능

 

 

 

딥러닝 모델 구축을 위한 Keras 메소드

 

1)  모델 클래스 객체 생성

tf.keras.models.Sequential()

 

 

2)  모델의 각 Layer 구성

tf.keras.layers.Dense(units, activation)

-  units  :  레이어 안의 Node의 수

-  activation  :  적용할 activation 함수 설정

 

 

 

3)  첫 번째 즉, Input Layer는 입력 형태에 대한 정보 필요  →  input_shape / input_dim 인자 설정하기

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, input_dim=2, activation='sigmoid'),
    tf.keras.layers.Dense(10, activation='sigmoid'),
    tf.keras.layers.Dense(1, activation='sigmoid'),
])

 

 

4)  모델에 Layer 추가

[model].add(tf.keras.layers.Dense(units, activation))

-  units  :  레이어 안의 Node의 수

-  activation  :  적용할 activation 함수 설정

 

 

ex)

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(10, input_dim=2, activation=‘sigmoid’))
model.add(tf.keras.layers.Dense(10, activation=‘sigmoid’))
model.add(tf.keras.layers.Dense(1, activation='sigmoid’))

 

 

 

 

3.  모델 학습시키기  :  Keras 메소드

 

1)  모델 학습 방식을 설정하기 위한 함수

[model].compile(optimizer, loss)

-  optimizer  :  모델 학습 최적화 방법

-  loss  :  손실 함수 설정

 

 

 

2)  모델을 학습시키기 위한 함수

[model].fit(x, y)

-  x  :  학습 데이터

-  y  :  학습 데이터의 label

 

 

 

ex)

model.compile(loss='mean_squared_error’, optimizer=‘SGD')
model.fit(dataset, epochs=100)

 

 

 

 

4.  평가 및 예측하기  :  Keras 메소드

 

1)  모델을 평가하기 위한 메소드

[model].evaluate(x, y)

-  x  :  테스트 데이터

-  y  :  테스트 데이터의 label

 

 

2)  모델로 예측을 수행하기 위한 함수

[model].predict(x)

-  x  :  예측하고자 하는 데이터

 

 

 

ex)

# 테스트 데이터 준비하기
dataset_test = tf.data.Dataset.from_tensor_slices((data_test, labels_test))
dataset_test = dataset.batch(32)

# 모델 평가 및 예측하기
model.evaluate(dataset_test)
predicted_labels_test = model.predict(data_test)

 

 

 

 

 

 

 


 이 글은 엘리스의 AI트랙 5기 강의를 들으며 정리한 내용입니다.

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그