파이썬 TensorFlow 사용법 초보자를 위한 기초부터 실습까지

파이썬 TensorFlow 사용법 초보자를 위한 기초부터 실습까지

텐서플로우(TensorFlow)는 구글이 개발한 오픈소스 머신러닝 프레임워크로, 딥러닝과 인공지능 모델 개발에 널리 사용됩니다. 초보자부터 전문가까지 활용할 수 있는 유연한 생태계를 제공하며, 데이터 흐름 그래프를 사용하여 수학적 연산을 모델링합니다.

파이썬 인터페이스를 통해 접근하기 쉬우면서도 고성능 C++ 엔진으로 구동되어 빠른 모델 학습과 추론이 가능합니다. 다양한 하드웨어에서 실행 가능하며, TensorFlow 2.0부터는 즉시 실행 모드와 Keras API 통합으로 사용성이 크게 향상되었습니다.

목차

TensorFlow 소개

TensorFlow는 2015년 구글에서 출시한 오픈소스 머신러닝 라이브러리로, 데이터 흐름 그래프(data flow graphs)를 사용해 수치 계산을 수행합니다. 이름에서 알 수 있듯이 ‘Tensor'(다차원 배열)가 ‘Flow'(흐름)하는 구조를 가지고 있어, 복잡한 수학적 연산을 효율적으로 처리할 수 있습니다.

A developer working on AI coding with Python and TensorFlow in a bustling tech environment.

TensorFlow의 역사와 발전

TensorFlow는 구글의 내부 머신러닝 시스템인 ‘DistBelief’를 개선하여 탄생했습니다. 처음 출시 이후 빠르게 발전하여 현재는 TensorFlow 2.x 버전까지 발전했으며, 딥러닝 연구와 산업 응용에서 가장 널리 사용되는 프레임워크 중 하나가 되었습니다.

2019년 출시된 TensorFlow 2.0은 이전 버전에 비해 크게 개선된 사용자 친화적 인터페이스를 제공합니다. 특히 즉시 실행(eager execution) 모드를 기본으로 채택하고 Keras API를 핵심 구성 요소로 통합하여 직관적인 모델 구축이 가능해졌습니다.

TensorFlow 생태계

TensorFlow는 단순한 라이브러리를 넘어 완전한 생태계를 형성하고 있습니다:

  • TensorFlow.js: 브라우저와 Node.js에서 머신러닝 모델을 실행하고 훈련시키는 JavaScript 라이브러리
  • TensorFlow Lite: 모바일, IoT 및 엣지 디바이스용 경량화 솔루션
  • TensorFlow Extended (TFX): 프로덕션 환경에서 ML 파이프라인 구축을 위한 플랫폼
  • TensorFlow Hub: 재사용 가능한 머신러닝 모듈 저장소

이러한 다양한 툴과 라이브러리는 TensorFlow를 연구부터 프로덕션까지 전체 머신러닝 워크플로우를 지원하는 종합적인 플랫폼으로 만들어 줍니다.

다른 머신러닝 프레임워크와 비교

TensorFlow는 여러 인기 있는 머신러닝 프레임워크 중 하나입니다. 각 프레임워크는 고유한 강점과 특성을 가지고 있어, 사용 목적에 맞게 선택하는 것이 중요합니다.

An informative comparison of popular machine learning frameworks.

PyTorch와 TensorFlow

PyTorch와 TensorFlow는 현재 가장 인기 있는 두 딥러닝 프레임워크입니다:

  • 사용 편의성: PyTorch는 파이썬스러운(Pythonic) 인터페이스로 직관적인 디버깅이 가능하며, TensorFlow 2.0부터 즉시 실행 모드 도입으로 이 격차가 크게 줄었습니다.
  • 산업 응용: TensorFlow는 프로덕션 환경에서의 배포와 규모 확장에 뛰어난 도구를 제공합니다.
  • 연구 활용: PyTorch는 연구자들 사이에서 동적 계산 그래프와 유연성 때문에 선호되는 경향이 있습니다.
  • 커뮤니티 지원: 두 프레임워크 모두 활발한 커뮤니티와 풍부한 자료를 제공합니다.

다른 프레임워크와의 비교

Keras는 원래 TensorFlow 위에서 작동하는 고수준 API였으나, TensorFlow 2.0에서는 Keras가 기본 API로 통합되었습니다. 독립 버전의 Keras는 여러 백엔드를 지원합니다.

JAX는 Google에서 개발한 새로운 프레임워크로, NumPy와 유사한 인터페이스를 제공하면서 GPU/TPU 가속과 자동 미분을 지원합니다. 연구자들 사이에서 인기가 높아지고 있습니다.

MXNet은 Amazon에서 지원하는 프레임워크로, 다양한 언어 지원과 뛰어난 확장성을 제공하지만 커뮤니티 규모가 상대적으로 작습니다.

“프레임워크 선택은 결국 사용 사례, 팀의 경험, 그리고 특정 요구사항에 따라 달라집니다. TensorFlow의 가장 큰 강점은 종합적인 생태계와 프로덕션 준비 도구에 있습니다.”

TensorFlow 설치 방법

TensorFlow는 여러 가지 방법으로 설치할 수 있으며, 운영체제와 하드웨어에 따라 최적의 설치 방법이 달라질 수 있습니다.

pip를 이용한 설치

가장 일반적인 설치 방법은 Python 패키지 관리자인 pip를 사용하는 것입니다:


# CPU 버전만 설치
pip install tensorflow

# GPU 지원 버전 설치 (CUDA와 cuDNN이 필요)
pip install tensorflow-gpu # TF 2.1 이전
pip install tensorflow # TF 2.1 이후 (GPU 지원 통합)

TensorFlow 2.1부터는 tensorflow 패키지가 GPU 지원을 통합하여, 별도의 tensorflow-gpu 패키지가 더 이상 필요하지 않습니다.

Installation steps for TensorFlow using pip and conda.

Anaconda를 이용한 설치

Anaconda나 Miniconda를 사용하는 경우, 이를 통해 TensorFlow를 설치할 수 있습니다:


# 새 환경 생성 및 TensorFlow 설치
conda create -n tf-env python=3.9
conda activate tf-env
conda install tensorflow

Anaconda를 사용하면 가상 환경 관리와 패키지 의존성 해결이 더 쉬워질 수 있습니다.

Docker를 이용한 설치

Docker 컨테이너를 통해 TensorFlow를 실행하면 환경 설정에 대한 걱정 없이 바로 사용할 수 있습니다:


# CPU 버전 도커 이미지 실행
docker run -it tensorflow/tensorflow:latest bash

# GPU 버전 도커 이미지 실행
docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash

설치 확인

TensorFlow 설치가 제대로 되었는지 확인하려면 Python 인터프리터에서 다음 코드를 실행해 보세요:


import tensorflow as tf
print(tf.__version__)
print("GPU 사용 가능:", tf.config.list_physical_devices('GPU'))

이 코드는 현재 설치된 TensorFlow 버전과 사용 가능한 GPU 장치를 출력합니다.

TensorFlow 기본 개념

TensorFlow를 효과적으로 사용하기 위해서는 몇 가지 핵심 개념을 이해하는 것이 중요합니다. 이러한 기본 개념들은 모든 TensorFlow 프로그램의 근간을 형성합니다.

텐서(Tensor)

텐서는 TensorFlow의 기본 데이터 단위로, n차원 배열을 의미합니다:

  • 스칼라(0차원 텐서): 단일 숫자 (예: 5)
  • 벡터(1차원 텐서): 숫자의 배열 (예: [1, 2, 3])
  • 행렬(2차원 텐서): 숫자의 2차원 배열 (예: [[1, 2], [3, 4]])
  • 3차원 이상의 텐서: 이미지, 비디오 등의 데이터 표현

텐서는 데이터 타입과 형상(shape)을 가지며, TensorFlow에서 모든 연산은 이 텐서를 입력받고 출력합니다.


# 다양한 텐서 생성 예제
scalar = tf.constant(5) # 0차원 텐서
vector = tf.constant([1, 2, 3]) # 1차원 텐서
matrix = tf.constant([[1, 2], [3, 4]]) # 2차원 텐서
tensor3d = tf.ones([2, 3, 4]) # 3차원 텐서 (모든 요소가 1)

Visual representation of a TensorFlow computational graph.

계산 그래프(Computational Graph)

TensorFlow 1.x에서는 정적 계산 그래프를 먼저 정의하고 나중에 실행하는 방식으로 작동했습니다. TensorFlow 2.x에서는 즉시 실행(Eager Execution) 모드가 기본이 되어, 파이썬 코드를 작성하는 즉시 연산이 실행됩니다.

그러나 내부적으로 TensorFlow는 여전히 계산 그래프 개념을 사용합니다. tf.function 데코레이터를 사용하면 파이썬 함수를 TensorFlow 그래프로 변환할 수 있습니다.


@tf.function
def simple_function(x, y):
return tf.add(x, y)

# 이 함수는 그래프로 변환되어 실행 효율성이 향상됨
result = simple_function(tf.constant(1), tf.constant(2))

변수(Variable)

TensorFlow 변수는 모델의 가중치와 같이 학습 과정에서 업데이트되는 텐서입니다. 일반 텐서와 달리 변수는 지속적으로 값을 유지하고 수정할 수 있습니다.


# 변수 생성
w = tf.Variable([1.0, 2.0], name="weights")
b = tf.Variable(0.0, name="bias")

# 변수 값 업데이트
w.assign([2.0, 3.0])
b.assign_add(1.0) # 현재 값에 1 더하기

자동 미분(Automatic Differentiation)

TensorFlow의 가장 강력한 기능 중 하나는 자동 미분입니다. 이는 신경망의 가중치를 조정하기 위한 그래디언트(기울기) 계산을 자동화합니다. tf.GradientTape은 이러한 작업을 수행하는 주요 인터페이스입니다.


x = tf.Variable(3.0)

with tf.GradientTape() as tape:
y = x**2 # y = x²

# dy/dx 계산 (x=3일 때 y=x²의 미분값)
dy_dx = tape.gradient(y, x) # 결과: 6.0 (2x에서 x=3)

이 자동 미분 기능은 딥러닝에서 가중치를 업데이트하는 역전파(backpropagation) 알고리즘의 핵심입니다.

간단한 모델 만들기

TensorFlow와 Keras를 사용하면 복잡한 딥러닝 모델도 몇 줄의 코드로 쉽게un 구현할 수 있습니다. 여기서는 기본적인 신경망 모델을 만드는 과정을 살펴보겠습니다.

Sequential API 사용하기

Keras의 Sequential API는 층을 순차적으로 쌓아 모델을 구성하는 가장 간단한 방법입니다.


import tensorflow as tf
from tensorflow.keras import layers, models

# Sequential API로 간단한 분류 모델 만들기
model = models.Sequential([
layers.Dense(128, activation='relu', input_shape=(784,)),
layers.Dropout(0.2),
layers.Dense(64, activation='relu'),
layers.Dropout(0.2),
layers.Dense(10, activation='softmax')
])

# 모델 컴파일
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)

# 모델 구조 요약
model.summary()

위 코드는 MNIST와 같은 이미지 분류 문제를 위한 간단한 신경망을 정의합니다. 784개의 입력 특성(28×28 픽셀 이미지)을 받아 10개의 클래스로 분류합니다.

Functional API 사용하기

더 복잡한 모델 구조가 필요할 때는 Functional API를 사용할 수 있습니다. 이 방식은 다중 입력/출력이나 층 간 복잡한 연결을 구현하는 데 적합합니다.


# Functional API로 다중 입력 모델 만들기
input_layer = layers.Input(shape=(784,))
x = layers.Dense(128, activation='relu')(input_layer)
x = layers.Dropout(0.2)(x)
x = layers.Dense(64, activation='relu')(x)
x = layers.Dropout(0.2)(x)
output_layer = layers.Dense(10, activation='softmax')(x)

model = models.Model(inputs=input_layer, outputs=output_layer)

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

An abstract illustration of a neural network model architecture.

모델 훈련과 평가

모델을 정의한 후에는 데이터로 훈련하고 성능을 평가해야 합니다.


# MNIST 데이터셋 로드
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# 데이터 전처리
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0

# 모델 훈련
history = model.fit(
x_train, y_train,
batch_size=128,
epochs=5,
validation_split=0.1
)

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'테스트 정확도: {test_acc:.4f}')

# 예측 수행
predictions = model.predict(x_test[:5])

모델 저장과 로드

훈련된 모델은 나중에 다시 사용할 수 있도록 저장할 수 있습니다.


# 모델 저장하기
model.save('my_model.h5') # HDF5 포맷으로 저장
model.save('my_model') # SavedModel 포맷으로 저장

# 모델 로드하기
loaded_model = tf.keras.models.load_model('my_model.h5')

“모델 구축은 AI 여정의 일부일 뿐입니다. 실제 가치는 모델이 실제 문제를 얼마나 잘 해결하는지에서 나옵니다. 모델을 계속 실험하고 개선하는 반복적인 과정이 중요합니다.”

고급 기능과 응용

TensorFlow는 기본적인 모델 구축 외에도 다양한 고급 기능을 제공합니다. 이러한 기능들은 더 복잡한 문제를 해결하거나 모델의 성능을 향상시키는 데 도움이 됩니다.

커스텀 층과 모델

TensorFlow에서는 사용자 정의 층과 모델을 만들어 특별한 요구사항을 충족시킬 수 있습니다.


class CustomLayer(tf.keras.layers.Layer):
def __init__(self, units=32):
super(CustomLayer, self).__init__()
self.units = units

def build(self, input_shape):
self.w = self.add_weight(
shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True
)
self.b = self.add_weight(
shape=(self.units,),
initializer='zeros',
trainable=True
)

def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b

# 커스텀 층 사용
model = tf.keras.Sequential([
CustomLayer(64),
tf.keras.layers.Activation('relu')
])

TensorFlow 데이터 파이프라인

tf.data API는 효율적인 데이터 로딩과 전처리 파이프라인을 구축할 수 있게 해줍니다. 대용량 데이터셋을 다룰 때 특히 유용합니다.


# tf.data로 효율적인 데이터 파이프라인 구축
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(128)
dataset = dataset.prefetch(tf.data.AUTOTUNE)

# 데이터셋으로 모델 훈련
model.fit(dataset, epochs=5)

분산 훈련

TensorFlow는 여러 GPU나 TPU, 또는 여러 머신에 걸쳐 모델을 훈련시키는 분산 훈련을 지원합니다.


# 다중 GPU 분산 전략
strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)

# 분산 전략 스코프 내에서 만들어진 모델은 자동으로 분산 실행
model.fit(dataset, epochs=5)

TensorFlow Hub와 전이 학습

TensorFlow Hub는 사전 훈련된 모델을 쉽게 재사용할 수 있게 해주는 저장소입니다. 이를 통해 전이 학습(Transfer Learning)을 효율적으로 구현할 수 있습니다.


import tensorflow_hub as hub

# TensorFlow Hub에서 사전 훈련된 모델 가져오기
feature_extractor_url = "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4"
feature_extractor_layer = hub.KerasLayer(
feature_extractor_url,
input_shape=(224, 224, 3),
trainable=False
)

# 전이 학습 모델 만들기
model = tf.keras.Sequential([
feature_extractor_layer,
tf.keras.layers.Dense(10, activation='softmax')
])

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

TensorFlow Serving

TensorFlow Serving은 훈련된 머신러닝 모델을 프로덕션 환경에 배포하기 위한 시스템입니다. RESTful API나 gRPC를 통해 모델을 서비스할 수 있습니다.

SavedModel 형식으로 모델을 저장한 후, TensorFlow Serving을 사용하여 배포할 수 있습니다:


# SavedModel 형식으로 저장
model.save('serving_model/1/')

# Docker로 TensorFlow Serving 실행 (명령줄에서)
# docker run -p 8501:8501 --mount type=bind,source=/path/to/serving_model,target=/models/my_model -e MODEL_NAME=my_model -t tensorflow/serving

자주 묻는 질문 (FAQ)

Q: TensorFlow와 PyTorch 중 어떤 것을 선택해야 할까요?

A: 두 프레임워크 모두 뛰어난 성능을 제공합니다. TensorFlow는 프로덕션 배포와 대규모 모델 서빙에 강점이 있고, PyTorch는 연구와 프로토타이핑에 더 유연합니다. 팀의 기존 경험, 프로젝트 요구사항, 그리고 사용 목적에 따라 선택하는 것이 좋습니다.

Q: TensorFlow로 작업할 때 GPU가 필수인가요?

A: 필수는 아니지만, 복잡한 모델을 훈련할 때 GPU는 처리 속도를 크게 향상시킵니다. 소규모 데이터셋이나 간단한 모델은 CPU로도 충분히 작업할 수 있습니다. 클라우드 서비스(Google Colab, AWS, Azure 등)를 통해 필요할 때만 GPU를 사용하는 것도 좋은 방법입니다.

Q: TensorFlow 1.x 코드를 2.x로 마이그레이션하려면 어떻게 해야 하나요?

A: TensorFlow는 tf_upgrade_v2 스크립트를 제공하여 1.x 코드를 2.x로 자동 변환하는 데 도움을 줍니다. 그러나 모든 변환이 완벽하지는 않으므로, 주요 변경 사항(즉시 실행 모드, tf.keras API 사용, 세션 관리 제거 등)을 이해하고 수동으로 조정해야 할 수도 있습니다.

Q: 모바일 장치에서 TensorFlow 모델을 실행할 수 있나요?

A: 네, TensorFlow Lite를 사용하면 안드로이드나 iOS 기기와 같은 모바일 장치에서 모델을 실행할 수 있습니다. TensorFlow Lite는 모델 크기를 줄이고 모바일 하드웨어에 최적화된 추론을 제공하도록 설계되었습니다.

Q: TensorFlow에서 커스텀 손실 함수를 정의하려면 어떻게 해야 하나요?

A: 커스텀 손실 함수는 파이썬 함수로 정의하거나 tf.keras.losses.Loss 클래스를 상속받아 구현할 수 있습니다. 예를 들어:


def custom_loss(y_true, y_pred):
return tf.reduce_mean(tf.square(y_true - y_pred))

# 또는 클래스로 정의
class CustomLoss(tf.keras.losses.Loss):
def __init__(self, name='custom_loss'):
super().__init__(name=name)

def call(self, y_true, y_pred):
return tf.reduce_mean(tf.square(y_true - y_pred))

# 모델 컴파일 시 사용
model.compile(optimizer='adam', loss=custom_loss)

Q: TensorFlow 모델의 성능을 최적화하는 방법은 무엇인가요?

A: TensorFlow 모델 성능 최적화를 위한 여러 전략이 있습니다:

  • tf.function 데코레이터를 사용하여 파이썬 함수를 그래프로 변환
  • tf.data API로 효율적인 입력 파이프라인 구축
  • 혼합 정밀도 훈련(mixed-precision training) 사용
  • 모델 양자화(quantization)와 가지치기(pruning) 적용
  • 텐서플로 프로파일러(TensorFlow Profiler)를 사용한 성능 병목 식별