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채널이고 배경이 다양한 이미지 데이터들을 분류하는데 어려움이 있음
'딥러닝' 카테고리의 다른 글
[딥러닝] CNN 모델 (0) | 2022.07.26 |
---|---|
[딥러닝] CNN(Convolutional Neural Network) (0) | 2022.07.22 |
[딥러닝] 딥러닝 다중분류 모델 만들기 (3가지 동물 분류) 전처리 (0) | 2022.07.22 |
[딥러닝] 구글 이미지 수집(with selenium) (0) | 2022.07.22 |
[딥러닝] 활성화 함수, 최적화 함수(패션데이터) (0) | 2022.07.21 |