딥러닝

[딥러닝] 다중분류 신경망모델 만들기(3가지 동물 분류)

퓨어맨 2022. 7. 22. 13:52
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = np.load("/content/drive/MyDrive/Colab Notebooks/빅데이터 13차(딥러닝)/data/animals.npz")

X_train = data['X_train']
X_test = data['X_test']
y_train = data['y_train']
y_test = data['y_test']

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)
(960, 224, 224, 3)
(960,)
(240, 224, 224, 3)
(240,)

 

 

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten
# Flatten : 데이터를 1차원으로 자동적으로 펴주는 역할을 하는 모듈

model = Sequential()

model.add(Flatten(input_shape=(224,224,3)))

# 중간층
model.add(Dense(300, activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(50, activation='relu'))

# 출력층 뉴런의 개수는 원핫인코딩 된 컬럼 개수
model.add(Dense(3, activation='softmax'))

# 기존 categorical_crossentropy에 레이블들의 원핫인코딩까지 자동으로 지원해줌
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='Adam',   # 최적화함수 : 최근에 가장 많이 사용되는 일반적으로 성능이 좋은 최적화함
              metrics=['acc']    # metrics : 평가방법을 설정(분류문제이기 때문에 정확도를 넣어줌)
              )
              
# 학습
h = model.fit(X_train, y_train, validation_split=0.2,
              epochs=50,
              batch_size=128
              )

 

plt.figure(figsize=(15,5))

# train 데이터
plt.plot(h.history['acc'],
         label='acc',
         )

# val 데이터
plt.plot(h.history['val_acc'],
         label='val_acc',
         )

plt.legend()
plt.show()

 

model.evaluate(X_test, y_test)
8/8 [==============================] - 0s 5ms/step - loss: 454.6678 - acc: 0.3333
[454.66778564453125, 0.3333333432674408]

 

# 정확도 외에 정밀도, 재현율, F1-score 까지 확인해보자!
from sklearn.metrics import classification_report

# np.argmax : 출력된 확률값 중 가장 큰 수치값의 인덱스를 반환
# axis=1 : pre가 2차원배열이므로 내부 배열들만(1차원) 보겠다는 뜻
np.argmax(pre, axis=1)
array([2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2,
       2, 0, 2, 2, 2, 2, 0, 1, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 1, 2, 2, 2, 2, 2, 1, 0, 0, 2,
       2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
       2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2,
       2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

 

# classification_report(평가용 정답, 예측한 정답)
print(classification_report(y_test, np.argmax(pre, axis=1)))

# precision(정밀도) : 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율
# recall(재현율) : 실제 True인 것들 중에서 모델이 True라고 예측한 것의 비율
# support : 레이블의 개수

# -> 결국은 pre값이 각 레이블에 대한 확률 값으로 나오기 때문에 그 중 가장 높은 수치의 인덱스를 반환하여 y_test랑 비교하는 방식
              precision    recall  f1-score   support

           0       0.41      0.08      0.13        87
           1       0.50      0.08      0.13        79
           2       0.32      0.91      0.47        74

    accuracy                           0.33       240
   macro avg       0.41      0.35      0.25       240
weighted avg       0.41      0.33      0.24       240
  • 기존 MLP로는 3채널이고 배경이 다양한 이미지 데이터들을 분류하는데 어려움이 있음