1. 데이터 가져오기
- 이미지 데이터셋 가져오기
import pandas as pd
DATA_PATH = '../../clothes_dataset'
train_df = pd.read_csv(DATA_PATH + '/clothes_classification_train.csv')
val_df = pd.read_csv(DATA_PATH + '/clothes_classification_val.csv')
test_df = pd.read_csv(DATA_PATH + '/clothes_classification_test.csv')
print(train_df.head())
2. 이미지 제너레이터 정의 및 모델 구상하기
이미지 제너레이터 정의
# 이미지 제너레이터를 정의합니다.
train_datagen = ImageDataGenerator(rescale=1. / 255)
val_datagen = ImageDataGenerator(rescale=1. / 255)
def get_steps(num_samples, batch_size):
if (num_samples % batch_size) > 0:
return (num_samples // batch_size) + 1
else:
return num_samples // batch_size
모델 구성하기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
model = Sequential()
# 입력 데이터의 형태를 꼭 명시해야 합니다.
model.add(Flatten(input_shape = (112, 112, 3))) # (112, 112, 3) -> (112 * 112 * 3)
model.add(Dense(128, activation = 'relu')) # 128개의 출력을 가지는 Dense 층
model.add(Dense(64, activation = 'relu')) # 64개의 출력을 가지는 Dense 층
model.add(Dense(11, activation = 'sigmoid')) # 11개의 출력을 가지는 신경망
model.compile(optimizer = 'adam',
loss = 'binary_crossentropy',
metrics = ['acc'])
-
다중 레이블 분류
문제이므로 손실함수로binary_crossentropy
를 사용한다.categorical_crossentropy
는softmax
함수를 출력함수로 사용하여 가장 높은 확률의 클래스만 강조하기 때문에 부적합하다. -
즉,
↘왜?다중레이블분류
→binary_crossentropy
→sigmoid
다중분류
→categorical_crossentropy
→softmax
이다.
https://wordbe.tistory.com/entry/ML-Cross-entropyCategorical-Binary의-이해
데이터 제너레이터 정의하기
# Make Generator
train_generator = train_datagen.flow_from_dataframe(
dataframe=train_df,
directory='../../',
x_col = 'image',
y_col = class_col,
target_size = (112, 112),
color_mode='rgb',
class_mode='other',
batch_size=batch_size,
seed=42
)
val_generator = val_datagen.flow_from_dataframe(
dataframe=val_df,
directory='../../',
x_col = 'image',
y_col = class_col,
target_size = (112, 112),
color_mode='rgb',
class_mode='other',
batch_size=batch_size,
shuffle=True
)
- x_col: string, column in dataframe that contains the filenames (or absolute paths if directory is None).
- y_col: string or list, column/s in dataframe that has the target data.
- directory: string, path to the directory to read images from. If None, data in x_col column should be absolute paths.
- x_col이 기존의 Data x라고 봐야 하고, y_col이 그것의 label이라 보아야 한다.
ImageDataGenerator
파일 안에 이미지 데이터와 label을 동시에 포함한다?. - 따라서 이것을 학습/테스트할 때는 x_train와 y_train을 넣어줄 필요가 없다.
모델 학습 시키기
model.fit(train_generator,
steps_per_epoch=get_steps(len(train_df), batch_size),
validation_data = val_generator,
validation_steps=get_steps(len(val_df), batch_size),
epochs = 10)
모델 평가하기
# 5. 모델 평가하기
test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_dataframe(
dataframe=test_df,
directory='../../',
x_col='image',
y_col=class_col,
target_size=(112, 112),
color_mode='rgb',
class_mode='other',
batch_size=batch_size,
shuffle=True
)
loss_and_metrics = model.evaluate(test_generator,
steps=get_steps(len(test_df), batch_size))
print('loss_and_metrics : ' + str(loss_and_metrics))
# loss_and_metrics : [0.18328142291474564, 0.9285179]
모델 저장하기
# 6. 모델 저장하기
save_path = os.path.join('model', 'img_generator_model.h5')
model.save(save_path)
예측값 나타내기
# 8개만 예측해보도록 하겠습니다.
do_preds = preds[:8]
for i, pred in enumerate(do_preds):
plt.subplot(2, 4, i + 1)
prob = zip(class_col, list(pred))
# item --> prob
# contributor: '뱅커'님
prob = sorted(list(prob), key = lambda z: z[1], reverse = True)[:2]
image = cv2.imread(test_df['image'][i])
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.title(f'{prob[0][0]}: {round(prob[0][1] * 100, 2)}% \n {prob[1][0]}: {round(prob[1][1] * 100, 2)}%')
plt.tight_layout()
참고
모델 불러오기
mnist_model_path = os.path.join(model_path, 'mnist_mlp_model.h5')
model = load_model(mnist_model_path)
모델 사용하기
yhat = model.predict_classes(x_test)
'Python > Python 딥러닝' 카테고리의 다른 글
L1 L2 Norm의 세계: 맨해튼부터 유클리드, 무한대까지 (0) | 2024.01.20 |
---|---|
[keras]Conv2D, Maxpooling2D outputshape 계산 (0) | 2020.07.27 |
Keras를 이용한 보스턴 주택가격 예측 + K-Fold (0) | 2020.07.15 |
keras를 이용한 mnist 숫자 데이터 분류(2) (0) | 2020.07.13 |
Keras를 이용한 mnist 숫자 데이터 분류(1) (0) | 2020.07.13 |