시험대비 ㅎㅎ
1. AI 데이터 전처리
1-1. 결측치 처리 방법 세 가지 비교·설명
- 삭제(Complete-case analysis)
- 방법: 결측치가 있는 행(row) 또는 열(column)을 통째로 제거
- 장점: 구현이 간단하다
- 단점: 데이터 소실이 심해질 수 있고, 삭제로 인한 편향(bias) 가능
- 평균/중앙값 대체(Mean/Median imputation)
- 방법: 수치형 변수의 결측치를 해당 변수의 평균 또는 중앙값으로 채움
- 장점: 데이터량 유지
- 단점: 분산이 과소평가될 수 있고, 분포 왜곡 우려
- 예측모델 기반 대체(Model-based imputation)
- 방법: 다른 변수들을 이용해 회귀/트리 등 예측모델을 학습한 뒤 결측치를 예측값으로 채움
- 장점: 보다 정교한 대체, 변수 간 관계 반영
- 단점: 구현 복잡, 과적합 위험
1-2. SMOTE 기법의 원리와 한계
- 원리: 소수 클래스(minority) 샘플 사이를 잇는 선분 상에 임의의 지점에서 새로운 합성 샘플을 생성하여 오버샘플링
- 장점: 소수 클래스 데이터 부족 문제 완화, 단순 복제보다 다양성 증가
- 한계:
- 노이즈나 이상치 주변에서 합성을 하면 오히려 성능 저하
- 다차원 공간에서 클래스 경계가 모호해질 수 있음
- 고차원일수록 “유의미한” 보간 샘플 생성이 어려움
1-3. 이상치 탐지 기법에 해당하지 않는 것은?
① Z-score
② IQR
③ K-Means
④ Pandas drop_duplicates()
정답: ④ – drop_duplicates()는 중복 제거 기법입니다.
1-4. (예시) Pandas 코드 해석 및 대안 제시
- 해석:
- age, salary 컬럼 중 하나라도 결측치가 있으면 해당 행(row)을 제거
- 남은 데이터에서 완전 중복된 행을 제거
- 대안:
- 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)이 어느 시점부터 증가 → 과적합
- 해결책:
- Early Stopping 적용
- 정규화(Regularization): L2 페널티, Dropout
- 데이터 증강(Augmentation) 또는 추가 데이터 수집
- 모델 단순화(레이어/파라미터 축소)
2-4. XGBoost Grid Search 절차
- 파라미터 그리드 정의
-
python복사편집param_grid = { 'max_depth': [3, 5, 7], 'learning_rate': [0.01, 0.1, 0.2] }
- GridSearchCV 셋업
-
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' )
- 학습 및 최적 파라미터 획득
-
python복사편집grid.fit(X_train, y_train) best_params = grid.best_params_
- 최적 모델 재학습
-
python복사편집best_model = XGBClassifier(**best_params) best_model.fit(X_train, y_train)
3. AI 시스템 구축
3-1. MLflow 주요 기능 세 가지
- Experiment Tracking: 실험별 메트릭·파라미터 로깅
- Model Registry: 모델 버전 관리 및 배포
- Projects: 코드·환경 재현(reproducibility)
3-2. 데이터 드리프트 대응 파이프라인 설계
- 모니터링:
- 알림 도구(예: Evidently.ai, MLflow Monitor)로 드리프트 지표(분포 변화, KS-test) 모니터링
- 알림:
- 드리프트 감지 시 Slack/Email Webhook 전송
- 재학습 자동화:
- 쿠버네티스(Job) 또는 Kubeflow Pipelines로 재학습 파이프라인 트리거
- 재학습 완료 후 신규 모델 자동 배포(Canary → Prod)
- 검증:
- 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 값을 사용하여 각 특성이 예측에 얼마나 기여했는지 계산. 게임 이론을 기반으로 해석 가능성을 제공.
- 장점: 높은 해석력, 일관된 결과 제공.
- 단점: 계산 비용이 많이 듬.
- LIME:
3. AI 시스템 구축
3-1. ML 파이프라인을 설계할 때, 각 단계의 주요 작업을 설명하고, 파이프라인 설계 시 고려해야 할 사항은 무엇인가요?
답:
- ML 파이프라인 주요 단계:
- 데이터 수집(Data Collection): 다양한 소스에서 데이터를 수집합니다. (API, 웹스크래핑 등)
- 데이터 전처리(Data Preprocessing): 결측치 처리, 이상치 탐지, 데이터 정규화 등.
- 모델 학습(Model Training): 훈련 데이터를 사용하여 모델을 학습.
- 모델 평가(Model Evaluation): 검증 데이터를 통해 모델 성능 평가.
- 모델 배포(Model Deployment): 최적화된 모델을 실제 서비스에 배포.
- 모델 모니터링(Model Monitoring): 배포 후 성능을 모니터링하여 필요한 경우 재학습.
- 설계 시 고려 사항:
- 스케일링: 모델이 처리할 수 있는 데이터량을 고려하여 효율적인 데이터 흐름과 배치 처리 방안을 설계.
- 자동화: 데이터 전처리, 모델 학습 및 평가 과정을 자동화하여 효율성을 높임.
- 유지 보수: 모델 성능 모니터링, 리트레이닝 주기 설정 등 지속적인 유지 보수 계획 수립.
3-2. 모델 서빙과 관련된 주제로, 서버리스(Serverless) 아키텍처를 설명하고 그 장점은 무엇인지 서술하세요.
답:
- 서버리스 아키텍처:
- 서버리스는 사용자가 서버를 관리할 필요 없이 클라우드 서비스 제공자가 서버를 자동으로 관리하는 아키텍처입니다. 예를 들어 AWS Lambda, Google Cloud Functions 등이 이에 해당.
- 장점:
- 자동 스케일링: 트래픽에 따라 자동으로 확장하거나 축소됨.
- 비용 절감: 서버를 항상 켜두지 않고, 사용한 만큼만 비용을 지불.
- 유연성: 사용자가 인프라에 신경 쓰지 않고 비즈니스 로직에 집중할 수 있음.
- 신속한 배포: 서버 관리 없이 빠르게 모델을 배포할 수 있음.
4. AI 트렌드
4-1. Generative AI와 관련된 대표적인 모델을 소개하고, 그 활용 사례를 설명하세요.
답:
- 대표적인 모델:
- GAN (Generative Adversarial Networks)
- VAE (Variational Autoencoders)
- 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 사용 시 이점
- 성능 향상:
- @tf.function을 사용하면 함수가 실행될 때마다 그래프를 새로 생성하지 않고, 이미 생성된 그래프를 재사용하므로 속도와 메모리 효율성이 개선됩니다.
- 계산이 더 최적화되며, 그래프 모드에서 실행되는 동안 GPU나 TPU 등의 하드웨어 가속기를 활용할 수 있습니다.
- 자동 그래프 변환:
- TensorFlow는 동적 계산 그래프를 사용하여 @tf.function을 적용한 함수가 실행될 때, TensorFlow는 이 함수를 그래프 모드로 변환하고, 그래프의 일부분을 정적으로 최적화합니다.
- 모듈화 및 재사용:
- 한 번 변환된 그래프는 여러 번 호출하여 재사용할 수 있기 때문에 훈련 및 추론의 효율성을 크게 높일 수 있습니다.
- 배치 처리 및 최적화:
- @tf.function은 입력 데이터를 배치 처리하는 방식으로 모델을 실행할 수 있게 도와주며, 계산 속도를 향상시킵니다.
3. @tf.function 예시
@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 사용 시 주의점
- 동적 텐서 사용 제한:
- @tf.function을 사용하면, Python의 동적 제어 흐름 (예: if문, for문 등)을 사용할 때 제한이 있을 수 있습니다. @tf.function은 그래프 기반으로 동작하기 때문에, 함수 내에서 조건문과 반복문을 사용할 때 TensorFlow 연산으로 변환이 가능한지 확인해야 합니다.
- 입력 형에 민감:
- @tf.function은 함수의 입력이 동일한 형태일 때 효율적으로 작동합니다. 입력 텐서의 형태가 매번 달라지면, TensorFlow가 새로운 그래프를 생성해야 하므로 성능이 떨어질 수 있습니다.
- 디버깅 어려움:
- 그래프 모드에서 실행되기 때문에, 디버깅이 어려워질 수 있습니다. @tf.function을 사용할 때는 디버깅 정보를 확인하기가 복잡해질 수 있습니다.
6. @tf.function을 통한 성능 비교
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 모드로 전환되어 계산 그래프를 미리 생성하고, 이를 최적화하여 실행 성능을 극대화할 수 있습니다. 그러나 사용 시 동적 제어 흐름이나 디버깅의 어려움 등을 고려해야 하므로, 정적 연산이 필요한 경우에 주로 사용하는 것이 좋습니다.
나의 말:
ChatGPT의 말:
@tf.function은 TensorFlow에서 함수를 그래프 모드로 변환하여 성능을 최적화하는 데 사용되지만, 이와 관련된 평가(evaluation) 측면에서 몇 가지 중요한 포인트가 있습니다. @tf.function을 사용할 때의 성능, 동작, 그리고 디버깅 시의 평가 기준 등을 자세히 설명하겠습니다.
1. @tf.function을 통한 성능 최적화
@tf.function을 사용하면 그래프 모드에서 실행되기 때문에 계산 속도가 개선됩니다. 이 최적화의 효과는 모델 훈련이나 예측 수행 시 더 뚜렷하게 나타나며, GPU나 TPU의 하드웨어 가속을 보다 효율적으로 활용할 수 있습니다.
2. 그래프 실행과 Eager 실행 비교
Eager Execution에서는 연산이 즉시 실행되기 때문에, 코드 작성이 직관적이고 디버깅이 용이하지만 성능이 떨어질 수 있습니다. 반면 Graph Execution(즉, @tf.function을 사용한 실행)은 연산을 미리 컴파일하여 최적화된 그래프를 실행하기 때문에, 속도와 메모리 효율성에서 큰 장점을 가지고 있습니다.
3. 성능 비교 - Eager vs Graph Execution
@tf.function이 적용된 함수는 첫 번째 실행 시 그래프를 컴파일하고, 이후에는 그 그래프를 재사용하여 연산을 최적화합니다. 따라서 동일한 함수를 여러 번 호출할 때, 속도 면에서 우수한 성능을 발휘합니다.
예시 코드:
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")
결과 예시:
그래프 모드에서 실행 시 훨씬 더 빠른 속도를 보입니다. @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을 이용해 훈련 후 모델 평가를 수행하는 코드 예시입니다. 모델 평가 시 성능 차이를 확인할 수 있습니다.
# 모델 정의
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 데이터셋)
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 데이터셋)
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 모델을 구축했습니다.
각 코드에서 데이터를 전처리하고, 모델을 정의하고 학습시키는 전체적인 흐름을 제공합니다. 이를 바탕으로 실험할 때 필요한 데이터셋이나 모델 아키텍처를 쉽게 조정할 수 있습니다.