2024.12.29
Part 11. 텐서플로
- Chapter 03. 간단한 Model 학습 시키기
01. Deep learning Flow
02. Deep learning Flow-preprocessing
03. Deep learning Flow-modeling
04. Deep learning Flow-evaluation
Deep learning Flow
Flow 기본 및 Data 가져오기
딥러닝의 Flow는 대부분 위와 같다. 데이터를 확인하고 전처리, 증강(특히 이미지데이터)처리를 진행한다.
앞서 나왔지만, 증강은 대부분 데이터가 충분하지 않아서 데이터의 양을 늘리기 위해, 표준화/일반화를 위해 많이 진행한다. 그 후 모델구성 및 학습을 진행하게 된다.
데이터 받아오기. TesnorFlow의 keras.datasets 에 있는 MNIST 데이터를 받아온다.
어떤 형태의 데이터가 있는지 확인. Shape, 형태, 몇 개 데이터가 있는지 확인한다.
seaborn을 이용하면... 아래와 같이 표현할 수 있다. (hue 옵션 사용)
Transpose( ) 함수를 이용하면 이미지를 돌리거나 할 수 있다.
Deep learning Flow - Preprocessing
데이터 확인 및 검증
- 데이터 중에 학습에 포함되면 안 되는 것이 있는가??
- ex> 개인정보가 들어있는 데이터, 테스트용 데이터에 들어있는 것, 중복되는 데이터 등.
- 학습 의도와 다른 데이터가 있는가??
- ex> 얼굴을 학습하는데 발 사진이 들어가 있진 않은지?.. (가끔은 의도하고 일부러 집어넣는 경우도 존재)
- 라벨값에 잘못된 데이터가 있는가??
- ex> 7인데 1로 라벨링, 고양이인데 강아지로 라벨링 등..
mnist 데이터셋에서는 255보다 크거나 0보다 작은 값이 있으면 안 된다. 따라서 해당 값이 있는지 확인하는 함수를 생성하여 데이터 검증 작업을 진행.
전처리
- 입력하기 전에 모델링에 적합하게 처리하는 것.
- 대표적으로 Scaling, Resizing, label encoding 등이 있다.
- dtype, shape 항상 체크!!!
One Hot Encoding 참고자료 :
https://velog.io/@ho3068/Basic-of-Deeplearning-2#onehotencoding-%EC%A7%84%ED%96%89
Scaling
Scale 함수를 통해서 모든 값을 0~1 사이 값으로 변경. 그래프를 통해 시각화하면...
시각화까지 하여, 해당 코드가 잘 작동하는지 검증하였다. 그럼 실제 테스트 데이터에 적용한다.
Flattening
reshape( )을 통해서 차원축소 진행 (Flatten)
Label Encoding (y값)
One-Hot Encoding을 통해서 y값 행렬로 변경.
Class 이용한 관리
보통 큰 작업을 하나의 클래스를 만들어서 관리.
위와 같이 Class를 통해 접근하여 함수관리를 진행하면 편리하고 재사용 가능한 코드로 관리할 수 있다.
Class에 대한 보충설명.
Deep learning Flow - Modeling
모델 정의
학습로직
학습 실행
Deep learning Flow - Evaluation
학습한 결과를 추적하고 확인하는 것.
model.fit( )을 진행하면 반환값이 생성된다. 통상 hist라는 변수명으로 설정한다.
hist = model.fit(prep_train_X, one_hot_y, epochs=50, batch_size=256)
=========================================================================================
Epoch 50/50
235/235 [==============================] - 1s 2ms/step - loss: 0.3071 - accuracy: 0.9164
그렇게 되면 아래처럼 hist 변수에서 각 epoch마다의 Loss 값과 Accuracy 값을 추적할 수 있다.
hist.history.keys()
=======================================================================
>> dict_keys(['loss', 'accuracy'])
hist.history
=======================================================================
>>
{'loss': [2.118561029434204,
1.7614890336990356,
1.4618910551071167,
.
.
.
'accuracy': [0.33311668038368225,
0.6435999870300293,
0.7321333289146423,
0.7749666571617126,
아래와 같이 그래프로도 확인할 수 있다
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(hist.history['loss'], lw=3)
plt.xlabel("epoch")
plt.ylabel("Loss")
plt.grid()
plt.subplot(1, 2, 2)
plt.plot(hist.history['accuracy'], c='red', lw=3)
plt.xlabel("epoch")
plt.ylabel("Accuracy")
plt.grid()
plt.show()
evaluate
## evaluate
re_X_test = (X_test/255.0).astype(np.float32)
re_X_test = re_X_test.reshape((re_X_test.shape[0], -1))
re_y_test = tf.keras.utils.to_categorical(y_test, num_classes=10)
model.evaluate(re_X_test, re_y_test)
=======================================================================================
313/313 [==============================] - 1s 2ms/step - loss: 0.3007 - accuracy: 0.9169
[0.30070123076438904, 0.9168999791145325]
acc는 0.9정도 나오니 간단한 모델치고는 괜찮은 것 같다. 통상 이미지 데이터에 대한 분석은 CNN, ImageNet 등 더욱 복잡한 모델을 사용한다.
예측 ( Predict )
pred = model.predict(re_X_test[10:35]) # 10 ~ 19
pred[1].argmax()
>> 6
# 원핫 인코딩으로 인해서 0~9까지 총 10개 항목에 대한 확률을 반환한다
# 그렇기에 argmax()를 이용해서 가장 큰 값의 인덱스를 확인해야 예측값을 알 수 있다.
plt.figure(figsize=(10, 10))
n = 10
for i in range(25):
plt.subplot(5, 5, i+1)
plt.imshow(X_test[n + i], 'gray')
plt.title(f'Predict : {pred[i].argmax()}, Label : {y_test[n + i]}')
plt.axis('off')
plt.tight_layout()
plt.show()
샘플로 보았을 때는 1개를 잘못 예측했고, 정답값 4를 0으로 예측한 것을 알 수 있다.
'Bootcamp_zerobase > Tensorflow' 카테고리의 다른 글
SubClass 모델링 : SubClass 및 모델구현 (0) | 2025.04.07 |
---|---|
Functional Modeling : Functional API 및 간단한 ResNet 구현 (0) | 2025.04.03 |
CNN (VGGNet) #1 (0) | 2025.04.01 |
Tensorflow #2 : 선형회귀 및 Perceptron (0) | 2025.03.27 |
Tensorflow #1 : 텐서플로우 기본개념 (1) | 2025.03.27 |