본문 바로가기
python

[데이터 분석] 딥러닝의 사용 목적과 TensorFlow 사용하기

by 포 키 2023. 8. 24.
728x90

 

 

딥러닝은 머신러닝에 속하는 인공 신경망을 기반으로 하는 학습 방법이다.

딥러닝의 부모가 머신러닝이라고 이해하면 쉽다.

딥러닝이라고 해서 따로 분류가 되는 목적이 있다.

지금부터 딥러닝에 대해서 알아보고 그 중 자주 사용하는 TensorFlow에 대해서도 작성하려 한다.

 

1. 딥러닝이란?

정형 데이터, 비정형 데이터 모두에 사용할 수 있다.

그렇지만 딥러닝의 강점은 비정형 데이터 처리에 뛰어난 성능을 보이는 것이다.

이미지나 음성과 같은 독특하고 복잡한 구조와 특징을 가진 데이터들에서 효과적으로 정보를 추출해내고, 처리한다.

또한, 인간을 모티브로 학습해서 일부 작업에선 인간의 지능을 뛰어넘기도 한다.

 

2. 딥러닝 사용 목적

딥러닝의 강점을 알아봤으니, 사용 목적도 한번 알아보자.

크게 5가지로 분류해볼 수 있다.

 

1) 패턴 인식과 분류

딥러닝은 다양한 비정형 데이터에서 패턴을 인식하고 분류하는 것으로 사용한다.

예를 들자면, 이미지를 분류하고, 음성을 인식해 처리하는 작업에 탁월하다.

 

2) 복잡한 관계 모델링

앞서 말했듯 복잡한 데이터 간의 관계를 모델링하기에 강력한 도구이다.

그 덕에 예측, 추론, 결정과정을 개선하는데에 도움이 된다.

예를 들자면 흔한 주식 리딩방에서 사용한 주식 시장 예측이나 자율주행에 많이 활용되고 있다.

 

3) 자동화와 자동화된 결정

딥러닝은 데이터에서 자동으로 특징을 추출하고, 패턴을 학습하면 의사결정 과정을 자동화한다.

예를 들자면, 공장 생산 최적화와 같은 생산라인에 대한 자동화 구축에 도움이 된다.

 

4) 생성적 작업

이미지를 생성하고 음악을 작곡하는 등의 창조와 관련된 작업에 사용한다.

GAN 등의 기술을 이용해 실제와 유사한 새로운 콘텐츠를 만들어 낼 수 있다.

 

5) 대량의 데이터 처리

나는 이 부분이 가장 기본이 되는 부분이라고 생각한다.

대량의 데이터를 처리하고 그 데이터에서 의미있는 정보를 얻어내는 것에 유용하다.

지금처럼 발전되지 않았던 과거에는 어려웠던 대용량 데이터셋에서 의미있는 통찰력을 가질 수 있도록 한다.

 

 

3. TensorFlow

구글에서 개발한 오픈 소스 머신러닝 프레임워크이다.

주로 파이썬에서 활용하지만, 다른 언어도 지원한다.

TensorFlow는 딥러닝뿐만 아니라 머신러닝 모델을 구축하고 훈련, 배포하기 위한 도구와 라이브러리의 집합이다.

 

4. TensorFlow의 핵심 기능

 

1) 그래프 기반 계산

TensorFlow는 계산 그래를 사용해 연산의 순서와 종속성을 명확히 정의해준다.

그 덕에 복잡한 모델을 효율적으로 정의하며, 최적화할 수 있다.

 

2) 자동 미분

모델의 매개변수에 대한 손실 함수의 Gradient(함수의 변화율을 나타내는 벡터값)를 자동으로 계산할 수 있다.

모델의 학습을 위한 Gradient 기반의 알고리즘을 쉽게 사용하도록 해준다.

 

3) 다양한 레이어와 오퍼레이션

다양한 종류의 뉴럴 네트워크 레이어와 머신 러닝 오퍼레이션을 제공해 모델을 유연하게 구축한다.

다양한 종류의 모델을 구현할 수 있게 해준다.

 

4) GPU 가속화

GPU를 활용해 병렬 계산을 수행해 모델 훈련 및 추론의 속도를 대폭 향상 시킨다.

 

5) 데이터셋 및 모델 관리

데이터셋을 로딩하고 전처리하는 기능을 제공하고, 모델의 저장과 로딩을 간편하게 할 수 있다.

 

6) 배포 및 추론

모델을 배포하고 실제 환경에서 추론을 수행하는데 필요한 기능을 제공한다.

모델을 서버에서 운영하거나 모바일과 임베디드 시스템에 통합하는데 사용한다.

 

5. TensorFlow 코드 예제

선형 회귀 모델을 구축하고 훈련하는 코드이다.

import tensorflow as tf
import numpy as np

# 훈련 데이터 생성
x_train = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y_train = np.array([2.0, 4.0, 6.0, 8.0, 10.0])

# 모델 파라미터 초기화
w = tf.Variable(initial_value=0.0, trainable=True, dtype=tf.float32)
b = tf.Variable(initial_value=0.0, trainable=True, dtype=tf.float32)

# 선형 모델 정의 (y = wx + b)
def linear_model(x):
    return w * x + b

# 손실 함수 정의 (평균 제곱 오차)
def mean_squared_error(y_true, y_pred):
    return tf.reduce_mean(tf.square(y_true - y_pred))

# 학습률 설정
learning_rate = 0.01

# 경사 하강법 옵티마이저 설정
optimizer = tf.optimizers.SGD(learning_rate)

# 훈련 반복
num_epochs = 1000
for epoch in range(num_epochs):
    with tf.GradientTape() as tape:
        y_pred = linear_model(x_train)
        loss = mean_squared_error(y_train, y_pred)
    
    # 그래디언트 계산
    gradients = tape.gradient(loss, [w, b])
    
    # 매개변수 업데이트
    optimizer.apply_gradients(zip(gradients, [w, b]))
    
    if (epoch + 1) % 100 == 0:
        print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.numpy()}")

# 훈련된 모델 사용
x_test = np.array([6.0, 7.0, 8.0])
y_pred = linear_model(x_test)
print("Predictions:", y_pred.numpy())

 

결과값

Epoch [100/1000], Loss: 0.0039825103658435345
Epoch [200/1000], Loss: 0.0016383009050182705
...
Epoch [900/1000], Loss: 2.7410569327342175e-06
Epoch [1000/1000], Loss: 1.1306485467251076e-06
Predictions: [11.999945 13.999934 15.999923]

손실이 감소하고, 테스트 데이터에 대한 예측값이 훈련된 모델에 의해 출력된다.

728x90