카테고리 없음

시험대비 ㅎㅎ

math_tbro 2025. 5. 8. 23:14

1. AI 데이터 전처리

1-1. 결측치 처리 방법 세 가지 비교·설명

  1. 삭제(Complete-case analysis)
    • 방법: 결측치가 있는 행(row) 또는 열(column)을 통째로 제거
    • 장점: 구현이 간단하다
    • 단점: 데이터 소실이 심해질 수 있고, 삭제로 인한 편향(bias) 가능
  2. 평균/중앙값 대체(Mean/Median imputation)
    • 방법: 수치형 변수의 결측치를 해당 변수의 평균 또는 중앙값으로 채움
    • 장점: 데이터량 유지
    • 단점: 분산이 과소평가될 수 있고, 분포 왜곡 우려
  3. 예측모델 기반 대체(Model-based imputation)
    • 방법: 다른 변수들을 이용해 회귀/트리 등 예측모델을 학습한 뒤 결측치를 예측값으로 채움
    • 장점: 보다 정교한 대체, 변수 간 관계 반영
    • 단점: 구현 복잡, 과적합 위험

1-2. SMOTE 기법의 원리와 한계

  • 원리: 소수 클래스(minority) 샘플 사이를 잇는 선분 상에 임의의 지점에서 새로운 합성 샘플을 생성하여 오버샘플링
  • 장점: 소수 클래스 데이터 부족 문제 완화, 단순 복제보다 다양성 증가
  • 한계:
    • 노이즈나 이상치 주변에서 합성을 하면 오히려 성능 저하
    • 다차원 공간에서 클래스 경계가 모호해질 수 있음
    • 고차원일수록 “유의미한” 보간 샘플 생성이 어려움

1-3. 이상치 탐지 기법에 해당하지 않는 것은?

① Z-score
② IQR
③ K-Means
④ Pandas drop_duplicates()

정답: ④ – drop_duplicates()는 중복 제거 기법입니다.


1-4. (예시) Pandas 코드 해석 및 대안 제시

python
복사편집
# 예) df = df.dropna(subset=['age', 'salary']).drop_duplicates()
  • 해석:
    1. age, salary 컬럼 중 하나라도 결측치가 있으면 해당 행(row)을 제거
    2. 남은 데이터에서 완전 중복된 행을 제거
  • 대안:
    • fillna()를 사용해 평균/중앙값/예측값 대체
    • interpolate()로 시계열 보간
    • duplicated(subset=[...], keep='first') + Boolean 인덱싱으로 더 세밀한 중복 제어

2. AI 모델 개발

2-1. Transformer 모델의 핵심 구성 요소가 아닌 것은?

① Self-Attention ② Positional Encoding ③ Pooling Layer ④ Feed-Forward Network

정답: ③


2-2. LIME vs SHAP 비교

  • LIME (Local Interpretable Model-agnostic Explanations)
    • 원리: 관심 샘플 주변에서 작은 교란(perturbation)을 주고, 선형 모델을 학습해 로컬 근사
    • 장점: 빠르고 이해하기 쉬우며 어떤 모델에도 적용 가능
    • 단점: 해석 결과가 불안정(perturbation 선택에 민감), 일관성 보장X
  • SHAP (SHapley Additive exPlanations)
    • 원리: 샘플 기여도를 게임 이론의 Shapley 값으로 계산
    • 장점: 일관성(consistency)·공정성 보장, 전역·국소 해석 모두 제공
    • 단점: 계산량이 많아 대규모 데이터에 느릴 수 있음

2-3. 학습 곡선 해석 & 해결책

  • 징후:
    • 학습 손실(train loss)는 계속 감소하는데 검증 손실(val loss)이 어느 시점부터 증가 → 과적합
  • 해결책:
    1. Early Stopping 적용
    2. 정규화(Regularization): L2 페널티, Dropout
    3. 데이터 증강(Augmentation) 또는 추가 데이터 수집
    4. 모델 단순화(레이어/파라미터 축소)

2-4. XGBoost Grid Search 절차

  1. 파라미터 그리드 정의
  2. python
    복사편집
    param_grid = { 'max_depth': [3, 5, 7], 'learning_rate': [0.01, 0.1, 0.2] }
  3. GridSearchCV 셋업
  4. python
    복사편집
    from xgboost import XGBClassifier from sklearn.model_selection import GridSearchCV grid = GridSearchCV( estimator=XGBClassifier(use_label_encoder=False, eval_metric='logloss'), param_grid=param_grid, cv=5, scoring='roc_auc' )
  5. 학습 및 최적 파라미터 획득
  6. python
    복사편집
    grid.fit(X_train, y_train) best_params = grid.best_params_
  7. 최적 모델 재학습
  8. python
    복사편집
    best_model = XGBClassifier(**best_params) best_model.fit(X_train, y_train)

3. AI 시스템 구축

3-1. MLflow 주요 기능 세 가지

  1. Experiment Tracking: 실험별 메트릭·파라미터 로깅
  2. Model Registry: 모델 버전 관리 및 배포
  3. Projects: 코드·환경 재현(reproducibility)

3-2. 데이터 드리프트 대응 파이프라인 설계

  1. 모니터링:
    • 알림 도구(예: Evidently.ai, MLflow Monitor)로 드리프트 지표(분포 변화, KS-test) 모니터링
  2. 알림:
    • 드리프트 감지 시 Slack/Email Webhook 전송
  3. 재학습 자동화:
    • 쿠버네티스(Job) 또는 Kubeflow Pipelines로 재학습 파이프라인 트리거
    • 재학습 완료 후 신규 모델 자동 배포(Canary → Prod)
  4. 검증:
    • A/B 테스트 또는 Shadow 모드 평가 후 롤아웃

3-3. 모델 서빙 방식 설명

① Batch Inference ② Model Pruning ③ Embedding ④ Gradient Clipping

정답: ① – 여러 입력을 모아서 일괄 처리하는 서빙 방식입니다.


4. AI 트렌드

4-1. Foundation Model 정의와 기업 활용 사례

  • 정의:
    • 방대한 데이터로 사전학습된 대규모 모델(예: GPT, BERT)
    • 파인튜닝 없이도 다양한 다운스트림 태스크에 적용 가능
  • 사례:
    • 검색(Search): BERT 기반 문장 이해로 검색 결과 랭킹 개선
    • 챗봇(Customer Support): GPT-series로 자연스러운 대화형 응답
    • 컴퓨터 비전(Vision-Language): CLIP으로 이미지–텍스트 매칭

4-2. Generative AI에 속하지 않는 것은?

① Variational Autoencoder ② GAN ③ BERT ④ Diffusion Model

정답: ③

 

 

 

1. AI 데이터 전처리

1-1. 결측치를 처리할 때 사용할 수 있는 방법 중 '평균 대체'와 '중앙값 대체'의 차이점은 무엇인가요? 예시를 들어 설명하세요.

:

  • 평균 대체(Mean Imputation):
    • 결측값을 해당 컬럼의 평균값으로 채우는 방법입니다.
    • 예시: age 컬럼의 결측치를 나머지 age 값의 평균으로 채움.
    • 장점: 데이터 소실 없이 결측치 처리 가능.
    • 단점: 데이터 분포가 왜곡될 수 있음.
  • 중앙값 대체(Median Imputation):
    • 결측값을 해당 컬럼의 중앙값으로 대체하는 방법입니다.
    • 예시: age 컬럼에서 age=25가 결측일 때, age 값들의 중앙값(예: 28)으로 채움.
    • 장점: 이상치에 민감하지 않음.
    • 단점: 평균 대체보다는 보수적이고, 데이터의 다른 특성을 반영하기 어려움.

1-2. 데이터 증강(Augmentation) 기법 중 회전(rotation) 기법을 설명하고, 이미지 데이터에서 회전 기법을 적용할 때 발생할 수 있는 문제점은 무엇인가요?

:

  • 회전 기법:
    • 이미지를 일정 각도로 회전시켜 새로운 이미지를 생성하는 데이터 증강 방법입니다.
    • 예시: 이미지를 90도, 180도, 270도로 회전시켜 다양한 버전을 생성.
  • 문제점:
    • 정보 손실: 특정 각도에서 중요한 정보가 왜곡될 수 있습니다. 예를 들어, 숫자나 문자 인식에서 숫자 '1'이 회전되면 7로 변할 수 있어 오히려 모델 성능에 악영향을 미칠 수 있습니다.
    • 비율 왜곡: 이미지에서 객체의 비율이 왜곡되어 학습이 비효율적일 수 있습니다.

2. AI 모델 개발

2-1. CNN(Convolutional Neural Network)의 주요 특징과 이미지 분류에서의 역할을 설명하세요.

:

  • 주요 특징:
    • 합성곱(Convolution) 연산을 통해 이미지의 지역적 특성을 추출.
    • 풀링(Pooling) 연산을 통해 특징 맵을 축소하고 중요한 정보만 남김.
    • 전역화: 여러 합성곱 계층을 통해 점진적으로 이미지의 높은 수준 특징을 추출.
  • 이미지 분류에서 역할:
    • 이미지의 중요한 패턴을 자동으로 학습하여 분류할 수 있게 함. 예를 들어, 얼굴 인식에서 눈, 코, 입 등의 패턴을 학습하고, 이들을 바탕으로 얼굴을 인식함.

2-2. XAI(Explainable AI)의 핵심 개념을 설명하고, LIME과 SHAP 기법을 비교해보세요.

:

  • XAI의 핵심 개념:
    • XAI는 모델의 예측 결과를 사람이 이해할 수 있는 방식으로 설명하는 기법입니다. 목표는 모델이 왜 그런 예측을 했는지에 대한 해석 가능성을 제공하는 것입니다.
    • 예: 모델의 예측을 결정한 주요 특성을 설명하거나, 모델의 결정을 왜곡하지 않고 쉽게 설명하는 방법.
  • LIME vs SHAP:
    • LIME:
      • 로컬 모델 해석 기법으로, 개별 예측에 대해 근사하는 단순한 모델(예: 선형 회귀)을 학습하여 예측을 설명.
      • 장점: 빠르고 직관적. 어떤 모델에든 적용 가능.
      • 단점: 설명의 일관성 부족, perturbation에 민감.
    • SHAP:
      • Shapley 값을 사용하여 각 특성이 예측에 얼마나 기여했는지 계산. 게임 이론을 기반으로 해석 가능성을 제공.
      • 장점: 높은 해석력, 일관된 결과 제공.
      • 단점: 계산 비용이 많이 듬.

3. AI 시스템 구축

3-1. ML 파이프라인을 설계할 때, 각 단계의 주요 작업을 설명하고, 파이프라인 설계 시 고려해야 할 사항은 무엇인가요?

:

  • ML 파이프라인 주요 단계:
    1. 데이터 수집(Data Collection): 다양한 소스에서 데이터를 수집합니다. (API, 웹스크래핑 등)
    2. 데이터 전처리(Data Preprocessing): 결측치 처리, 이상치 탐지, 데이터 정규화 등.
    3. 모델 학습(Model Training): 훈련 데이터를 사용하여 모델을 학습.
    4. 모델 평가(Model Evaluation): 검증 데이터를 통해 모델 성능 평가.
    5. 모델 배포(Model Deployment): 최적화된 모델을 실제 서비스에 배포.
    6. 모델 모니터링(Model Monitoring): 배포 후 성능을 모니터링하여 필요한 경우 재학습.
  • 설계 시 고려 사항:
    • 스케일링: 모델이 처리할 수 있는 데이터량을 고려하여 효율적인 데이터 흐름과 배치 처리 방안을 설계.
    • 자동화: 데이터 전처리, 모델 학습 및 평가 과정을 자동화하여 효율성을 높임.
    • 유지 보수: 모델 성능 모니터링, 리트레이닝 주기 설정 등 지속적인 유지 보수 계획 수립.

3-2. 모델 서빙과 관련된 주제로, 서버리스(Serverless) 아키텍처를 설명하고 그 장점은 무엇인지 서술하세요.

:

  • 서버리스 아키텍처:
    • 서버리스는 사용자가 서버를 관리할 필요 없이 클라우드 서비스 제공자가 서버를 자동으로 관리하는 아키텍처입니다. 예를 들어 AWS Lambda, Google Cloud Functions 등이 이에 해당.
  • 장점:
    • 자동 스케일링: 트래픽에 따라 자동으로 확장하거나 축소됨.
    • 비용 절감: 서버를 항상 켜두지 않고, 사용한 만큼만 비용을 지불.
    • 유연성: 사용자가 인프라에 신경 쓰지 않고 비즈니스 로직에 집중할 수 있음.
    • 신속한 배포: 서버 관리 없이 빠르게 모델을 배포할 수 있음.

4. AI 트렌드

4-1. Generative AI와 관련된 대표적인 모델을 소개하고, 그 활용 사례를 설명하세요.

:

  • 대표적인 모델:
    1. GAN (Generative Adversarial Networks)
    2. VAE (Variational Autoencoders)
    3. Diffusion Models
  • 활용 사례:
    • 이미지 생성: GAN을 이용하여 사람 얼굴 생성, 예술적 이미지 생성.
    • 음악 생성: AI가 새로운 음악을 생성하는 데 사용됨 (OpenAI Jukedeck).
    • 텍스트 생성: GPT-3를 활용한 자연스러운 글쓰기 및 대화형 시스템 구현.

4-2. 최근 트렌드인 AutoML에 대해 설명하고, 이를 사용한 사례를 소개하세요.

:

  • AutoML:
    • AutoML은 머신러닝 모델을 자동으로 생성하고 최적화하는 기술입니다. 전문가 없이도 데이터를 분석하고 예측 모델을 구축할 수 있게 해줍니다.
  • 사례:
    • Google AutoML: Google Cloud에서 제공하는 AutoML은 사용자가 데이터를 업로드하면 자동으로 최적의 모델을 학습하여 예측 결과를 제공.
    • H2O.ai: 이 플랫폼은 기업이 AutoML을 통해 다양한 예측 모델을 생성하고 성능을 비교하며, 비즈니스 문제를 해결하는 데 도움을 줌.

 

 

VAE는 변분 추론(Variational Inference) 기법을 사용하여 모델을 학습합니다. 이 과정은 **손실 함수(Loss Function)**가 두 가지 주요 항목으로 구성됩니다:

  • 재구성 오차(Reconstruction Loss):
    원본 데이터와 디코더에서 생성된 데이터 간의 차이를 최소화하려고 합니다. 이는 **MSE(Mean Squared Error)**나 Binary Cross-Entropy 등의 지표로 측정됩니다.
  • KL 발산(Kullback-Leibler Divergence):
    인코더가 추정한 분포(가우시안 분포)가 **잠재 공간의 표준 분포(보통 표준 정규 분포)**와 얼마나 차이가 나는지 측정하는 항목입니다. 이를 최소화하는 과정은 잠재 공간의 분포를 잘 추정하도록 돕습니다.

손실 함수는 이 두 항목을 합친 형태로 정의되며, 이를 통해 재구성된 데이터잠재 공간 분포 사이의 균형을 맞추게 됩니다.

3. 장점과 특징

  • 생성 모델: VAE는 이미지, 음성, 텍스트와 같은 다양한 데이터의 생성을 학습할 수 있습니다.
  • 연속적인 잠재 공간: VAE는 잠재 공간(latent space)을 연속적으로 구성할 수 있기 때문에, 특정 샘플을 조작하거나 편집하는데 유리합니다. 예를 들어, 특정 이미지를 생성하는 과정에서 일부 특성(예: 얼굴의 표정)을 변화시킬 수 있습니다.
  • 변분 추론: VAE는 확률적 모델이기 때문에 베이지안 추론을 활용하여 더 유연하고 강력한 모델링을 할 수 있습니다.
  • 확률적 샘플링: VAE는 단순히 데이터를 압축하는 것이 아니라, 샘플링을 통해 새로운 데이터를 생성하는 기능을 가지고 있어, 이미지 생성, 스타일 변환, 데이터 복원 등의 문제에 효과적입니다.

 

 

@tf.function은 TensorFlow에서 제공하는 **데코레이터(decorator)**로, 함수에 적용하여 TensorFlow 그래프 모드로 변환하는 역할을 합니다. 이 데코레이터를 사용하면, TensorFlow는 함수 호출 시 그래프 모드에서 실행되도록 최적화하여 성능을 향상시킬 수 있습니다.

1. @tf.function 기본 개념

@tf.function을 함수 앞에 붙이면, 해당 함수는 Eager Execution(즉시 실행)에서 Graph Execution(그래프 실행)으로 전환됩니다. 이는 TensorFlow가 함수 호출 시 계산 그래프를 구성하고, 이를 최적화하여 여러 번 재사용할 수 있도록 합니다.

  • Eager Execution: 함수가 호출될 때마다 연산이 즉시 실행되고, 결과를 반환하는 방식입니다.
  • Graph Execution: 연산을 하나의 계산 그래프로 묶어 미리 컴파일하고, 효율적으로 실행합니다. 이 방식은 특히 대규모 모델 훈련에서 성능을 크게 향상시킬 수 있습니다.

2. @tf.function 사용 시 이점

  1. 성능 향상:
    • @tf.function을 사용하면 함수가 실행될 때마다 그래프를 새로 생성하지 않고, 이미 생성된 그래프를 재사용하므로 속도메모리 효율성이 개선됩니다.
    • 계산이 더 최적화되며, 그래프 모드에서 실행되는 동안 GPU나 TPU 등의 하드웨어 가속기를 활용할 수 있습니다.
  2. 자동 그래프 변환:
    • TensorFlow는 동적 계산 그래프를 사용하여 @tf.function을 적용한 함수가 실행될 때, TensorFlow는 이 함수를 그래프 모드로 변환하고, 그래프의 일부분을 정적으로 최적화합니다.
  3. 모듈화 및 재사용:
    • 한 번 변환된 그래프는 여러 번 호출하여 재사용할 수 있기 때문에 훈련 및 추론의 효율성을 크게 높일 수 있습니다.
  4. 배치 처리 및 최적화:
    • @tf.function은 입력 데이터를 배치 처리하는 방식으로 모델을 실행할 수 있게 도와주며, 계산 속도를 향상시킵니다.

3. @tf.function 예시

python
 
 
import tensorflow as tf

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

# Eager Execution 모드에서는 즉시 실행됨
x = tf.constant(3)
y = tf.constant(5)
print(add(x, y))  # 8

# 이제 add 함수는 그래프 모드에서 실행됨

위 코드에서 add 함수는 @tf.function 데코레이터가 적용되었기 때문에 그래프 모드에서 실행됩니다. 이를 통해 TensorFlow는 실행 성능을 최적화합니다.

4. TensorFlow Graph Mode에서의 동작

  • 첫 번째 실행: @tf.function이 적용된 함수가 호출되면, TensorFlow는 내부적으로 그래프를 생성하고, 그 그래프를 실행할 준비를 합니다. 이 그래프는 실제 계산에 사용되는 연산을 표현하는 정적 구조입니다.
  • 두 번째 실행 이후: 동일한 함수가 호출되면, 그래프 모드에서 이미 생성된 계산 그래프를 재사용하여 성능을 크게 향상시킵니다. 이 방식은 함수 호출 시마다 계산을 다시 하지 않으므로 매우 효율적입니다.

5. @tf.function 사용 시 주의점

  1. 동적 텐서 사용 제한:
    • @tf.function을 사용하면, Python의 동적 제어 흐름 (예: if문, for문 등)을 사용할 때 제한이 있을 수 있습니다. @tf.function은 그래프 기반으로 동작하기 때문에, 함수 내에서 조건문과 반복문을 사용할 때 TensorFlow 연산으로 변환이 가능한지 확인해야 합니다.
  2. 입력 형에 민감:
    • @tf.function은 함수의 입력이 동일한 형태일 때 효율적으로 작동합니다. 입력 텐서의 형태가 매번 달라지면, TensorFlow가 새로운 그래프를 생성해야 하므로 성능이 떨어질 수 있습니다.
  3. 디버깅 어려움:
    • 그래프 모드에서 실행되기 때문에, 디버깅이 어려워질 수 있습니다. @tf.function을 사용할 때는 디버깅 정보를 확인하기가 복잡해질 수 있습니다.

6. @tf.function을 통한 성능 비교

python
 
 
import tensorflow as tf
import time

# Eager Execution (기본)
def eager_add(x, y):
    return x + y

# tf.function을 통한 Graph Execution
@tf.function
def graph_add(x, y):
    return x + y

# 텐서 생성
x = tf.constant(3)
y = tf.constant(5)

# Eager 방식의 실행 시간
start_time = time.time()
for _ in range(10000):
    eager_add(x, y)
print(f"Eager Execution Time: {time.time() - start_time:.4f} seconds")

# tf.function 방식의 실행 시간
start_time = time.time()
for _ in range(10000):
    graph_add(x, y)
print(f"Graph Execution Time: {time.time() - start_time:.4f} seconds")
 

위의 예시는 @tf.function을 사용한 그래프 실행과 **즉시 실행(Eager Execution)**을 비교하는 코드입니다. 일반적으로 @tf.function을 사용한 그래프 실행이 더 빠릅니다.


7. 결론

@tf.function은 TensorFlow에서 모델의 성능을 향상시키기 위한 중요한 도구입니다. 이 데코레이터를 사용하면, Eager Execution 모드에서 Graph Execution 모드로 전환되어 계산 그래프를 미리 생성하고, 이를 최적화하여 실행 성능을 극대화할 수 있습니다. 그러나 사용 시 동적 제어 흐름이나 디버깅의 어려움 등을 고려해야 하므로, 정적 연산이 필요한 경우에 주로 사용하는 것이 좋습니다.

o4-mini-high

나의 말:

Tf.function과 관련된 evalute
 

ChatGPT의 말:

 
2초 동안 이성 처리 완료

@tf.function은 TensorFlow에서 함수를 그래프 모드로 변환하여 성능을 최적화하는 데 사용되지만, 이와 관련된 평가(evaluation) 측면에서 몇 가지 중요한 포인트가 있습니다. @tf.function을 사용할 때의 성능, 동작, 그리고 디버깅 시의 평가 기준 등을 자세히 설명하겠습니다.

1. @tf.function을 통한 성능 최적화

@tf.function을 사용하면 그래프 모드에서 실행되기 때문에 계산 속도가 개선됩니다. 이 최적화의 효과는 모델 훈련이나 예측 수행 시 더 뚜렷하게 나타나며, GPUTPU의 하드웨어 가속을 보다 효율적으로 활용할 수 있습니다.

2. 그래프 실행과 Eager 실행 비교

Eager Execution에서는 연산이 즉시 실행되기 때문에, 코드 작성이 직관적이고 디버깅이 용이하지만 성능이 떨어질 수 있습니다. 반면 Graph Execution(즉, @tf.function을 사용한 실행)은 연산을 미리 컴파일하여 최적화된 그래프를 실행하기 때문에, 속도메모리 효율성에서 큰 장점을 가지고 있습니다.

3. 성능 비교 - Eager vs Graph Execution

@tf.function이 적용된 함수는 첫 번째 실행 시 그래프를 컴파일하고, 이후에는 그 그래프를 재사용하여 연산을 최적화합니다. 따라서 동일한 함수를 여러 번 호출할 때, 속도 면에서 우수한 성능을 발휘합니다.

예시 코드:

python
 
 
import tensorflow as tf
import time

# Eager Execution (기본)
def eager_add(x, y):
    return x + y

# tf.function을 통한 Graph Execution
@tf.function
def graph_add(x, y):
    return x + y

# 텐서 생성
x = tf.constant(3)
y = tf.constant(5)

# Eager 방식의 실행 시간
start_time = time.time()
for _ in range(10000):
    eager_add(x, y)
eager_time = time.time() - start_time

# tf.function 방식의 실행 시간
start_time = time.time()
for _ in range(10000):
    graph_add(x, y)
graph_time = time.time() - start_time

print(f"Eager Execution Time: {eager_time:.4f} seconds")
print(f"Graph Execution Time: {graph_time:.4f} seconds")

결과 예시:

less
복사편집
Eager Execution Time: 0.3500 seconds Graph Execution Time: 0.0200 seconds

그래프 모드에서 실행 시 훨씬 더 빠른 속도를 보입니다. @tf.function을 사용하면 성능이 크게 향상된다는 것을 확인할 수 있습니다.

 

 


4. 그래프 모드의 단점

하지만 @tf.function을 사용할 때는 디버깅에 몇 가지 제한이 있을 수 있습니다:

  • 동적 연산의 어려움:
    @tf.function은 동적 제어 흐름(예: if 문, for 문 등)과 동적 크기 텐서를 처리하는 데 일부 제약이 있을 수 있습니다. 예를 들어, 각 실행마다 텐서의 크기가 달라지거나 제어 흐름이 동적으로 바뀌는 경우, 그래프 모드에서는 이 동작을 정적으로 정의해야 하므로 동적 연산을 처리하는 데 어려움이 있을 수 있습니다.
  • 디버깅이 복잡:
    그래프 모드에서 함수가 실행되면 TensorFlow는 이를 컴파일하고 최적화하여 실행하므로, 중간값을 추적하고 디버깅하는 데 어려움이 있을 수 있습니다. 이로 인해 코드의 중간 결과를 살펴보거나 디버깅을 하는 것이 불편할 수 있습니다.
  • 첫 실행 시 성능 저하:
    @tf.function은 첫 번째 실행에서 계산 그래프를 생성하므로, 첫 번째 실행 시에는 다소 성능 저하가 있을 수 있습니다. 그러나 이후의 실행에서는 성능이 크게 개선됩니다.

5. @tf.function과 평가(Evaluation)

@tf.function을 사용하여 모델을 평가할 때, 이 함수가 그래프 모드로 실행되므로 빠른 평가가 가능하지만 몇 가지 평가 포인트가 중요합니다.

(1) 실험적인 성능 비교:

  • @tf.function을 사용할 때 모델의 예측 성능을 비교할 때, 일반적으로 eager execution보다 graph execution이 빠르지만, 이로 인해 평가 지표(예: 정확도, F1-score 등)에서는 차이가 없어야 합니다. 중요한 것은 속도메모리 사용량의 차이입니다.

(2) 모델 평가 시 주의사항:

  • 모델 평가와 검증에서 @tf.function을 적용하면, 성능이 크게 개선될 수 있습니다. 하지만, 그래프 모드에서 동작하는 동안 입력 형(input shape)이나 데이터 타입(dtype)이 변하지 않도록 주의해야 합니다. 변경된 입력형태로 인한 오류가 발생할 수 있기 때문입니다.

(3) 배치 처리 시 유용:

@tf.function은 배치 처리 시 성능을 더욱 향상시킬 수 있습니다. 여러 개의 데이터 샘플을 한 번에 처리하는 과정에서 배치 크기를 늘리면 그래프 실행의 효율성이 더욱 높아집니다.

6. 실제 예시 - 모델 평가

@tf.function을 이용해 훈련 후 모델 평가를 수행하는 코드 예시입니다. 모델 평가 시 성능 차이를 확인할 수 있습니다.

python
복사편집
import tensorflow as tf

# 모델 정의
model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(784,)),
    tf.keras.layers.Dense(10)
])

# 모델 컴파일
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

# 데이터셋 로딩
(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
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)

# 훈련
model.fit(x_train, y_train, epochs=5)

# 평가 함수
@tf.function
def evaluate_model(model, x_test, y_test):
    return model.evaluate(x_test, y_test, verbose=2)

# 평가 실행
evaluate_model(model, x_test, y_test)

**@tf.function**을 사용하여 모델의 평가 성능을 최적화할 수 있습니다.


7. 결론

  • @tf.function은 모델 훈련예측에서 성능을 크게 향상시킬 수 있는 중요한 도구입니다.
  • 그래프 모드로 실행되어, 여러 번의 연산을 최적화하고, GPU/TPU 가속을 효율적으로 활용할 수 있습니다.
  • 하지만 디버깅의 어려움이나 동적 제어 흐름 처리의 제약 등은 주의해야 할 점입니다.
  • 모델 평가 시에는 입력 데이터 형상이나 데이터 타입이 일관되게 유지되어야 하며, 배치 처리 시 특히 효과적입니다.

 

 

1. CNN (Convolutional Neural Network) 학습 코드

CNN은 이미지 분류, 객체 탐지, 얼굴 인식 등 다양한 컴퓨터 비전 작업에 자주 사용됩니다. 여기서는 MNIST 데이터셋을 이용한 간단한 CNN 모델 학습 코드를 제공합니다.

CNN 모델 학습 (MNIST 데이터셋)

python
 
 
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

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

# 데이터 전처리: 0-255 범위의 픽셀 값을 0-1로 정규화
x_train, x_test = x_train / 255.0, x_test / 255.0

# 이미지 데이터를 4D 텐서로 변환 (batch_size, height, width, channels)
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)

# CNN 모델 정의
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')  # 출력층: 10개 클래스
])

# 모델 컴파일
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

# 모델 학습
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

# 학습 과정 시각화
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.show()

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"Test accuracy: {test_acc}")

주요 설명:

  • 데이터셋: MNIST (28x28 크기의 손글씨 숫자 이미지).
  • 모델: 3개의 Conv2D 레이어와 MaxPooling 레이어를 통해 이미지에서 특성을 추출하고, 마지막에는 Fully Connected (Dense) 레이어로 출력합니다.
  • 손실 함수: SparseCategoricalCrossentropy를 사용하여 다중 클래스 분류 문제를 해결합니다.
  • 최적화: Adam 옵티마이저를 사용하여 학습합니다.

2. Autoencoder 학습 코드

Autoencoder는 비지도 학습의 한 방법으로, 입력 데이터를 압축하여 잠재 공간(latent space)을 학습하고 이를 복원하는 모델입니다. 주로 특징 추출, 노이즈 제거 등에 사용됩니다.

Autoencoder 모델 학습 (MNIST 데이터셋)

python
 
 
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt

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

# 데이터 전처리: 0-255 범위의 픽셀 값을 0-1로 정규화
x_train, x_test = x_train / 255.0, x_test / 255.0

# 이미지 데이터를 3D 텐서로 변환 (batch_size, height, width, channels)
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)

# Autoencoder 모델 정의
input_img = layers.Input(shape=(28, 28, 1))

# Encoder
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2), padding='same')(x)
x = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(x)
encoded = layers.MaxPooling2D((2, 2), padding='same')(x)

# Decoder
x = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(encoded)
x = layers.UpSampling2D((2, 2))(x)
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = layers.UpSampling2D((2, 2))(x)
decoded = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

# 모델 컴파일
autoencoder = models.Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

# 모델 학습
autoencoder.fit(x_train, x_train, epochs=10, batch_size=256, shuffle=True, validation_data=(x_test, x_test))

# 모델 평가 (재구성 오류)
loss = autoencoder.evaluate(x_test, x_test, verbose=2)
print(f"Test loss: {loss}")

# 복원된 이미지 시각화
decoded_imgs = autoencoder.predict(x_test)

n = 10  # 숫자 10개를 출력
plt.figure(figsize=(20, 4))
for i in range(n):
    ax = plt.subplot(2, n, i + 1)
    plt.imshow(x_test[i].reshape(28, 28), cmap='gray')
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

    ax = plt.subplot(2, n, i + 1 + n)
    plt.imshow(decoded_imgs[i].reshape(28, 28), cmap='gray')
    plt.gray()
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)

plt.show()

주요 설명:

  • 데이터셋: MNIST (28x28 크기의 손글씨 숫자 이미지).
  • 모델:
    • Encoder: Conv2D와 MaxPooling2D를 사용해 입력 이미지를 잠재 공간으로 압축.
    • Decoder: UpSampling2D와 Conv2D를 사용해 잠재 공간에서 원본 이미지를 복원.
  • 손실 함수: binary_crossentropy를 사용하여 재구성된 이미지와 원본 이미지 간의 차이를 최소화합니다.
  • 복원된 이미지 시각화: 모델이 원본 이미지를 얼마나 잘 복원했는지 시각화하여 평가합니다.

결론

  • CNN 모델은 이미지 분류 작업에서 매우 효과적입니다. 위 예시에서는 MNIST 데이터셋을 사용한 CNN 모델을 학습시켰습니다.
  • Autoencoder는 주로 데이터의 차원 축소특징 학습을 목적으로 사용됩니다. 위 예시에서는 MNIST 데이터를 입력으로 사용하여 압축 및 복원을 학습하는 Autoencoder 모델을 구축했습니다.

각 코드에서 데이터를 전처리하고, 모델을 정의하고 학습시키는 전체적인 흐름을 제공합니다. 이를 바탕으로 실험할 때 필요한 데이터셋이나 모델 아키텍처를 쉽게 조정할 수 있습니다.