오늘은 미니프로젝트 2일차와 제 멘탈이 붕괴된 날입니다.
오늘의 프로젝트는 Data Augmentation과 모델링을 같이 진행했습니다.
먼저 부족한 데이터를 증가시키기 위한 Data Augmentation을 진행하겠습니다.
Data Augmentation을 위한 패키지를 호출합니다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
데이터 경로를 편하게 사용하기 위해 변수로 지정해줍니다.
# 복사할 데이터 경로
train_path = '/content/drive/MyDrive/경로/Car_Images/trainsets/'
val_path = '/content/drive/MyDrive/경로/Car_Images/valsets/'
test_path = '/content/drive/MyDrive/경로/Car_Images/testsets/'
ImageGenertor 함수를 사용해서 사전 작업을 준비합니다.
train_datagen = ImageDataGenerator(rotation_range=10, zoom_range=0.1, horizontal_flip=True, vertical_flip=True, rescale=1/255.0)
valid_datagen = ImageDataGenerator(rescale=1/255.0)
test_datagen = ImageDataGenerator(rescale=1/255.0)
train_generator = train_datagen.flow_from_directory(
train_path,
target_size = (280,280)
)
valid_generator = valid_datagen.flow_from_directory(
val_path,
target_size = (280,280)
)
test_generator = valid_datagen.flow_from_directory(
test_path,
target_size = (280,280)
)
Data Augmentation을 위한 작업이 끝났으므로 모델링을 진행합니다. 모델은 ResNet50V2를 사용해서 진행했습니다.
#ResNet 모델 사용해보기
from keras.applications.resnet_v2 import ResNet50V2
keras.backend.clear_session()
resl = ResNet50V2(include_top=False, weights='imagenet', input_shape=(280,280,3))
x = resl.output
x = keras.layers.Flatten()(x)
ol = keras.layers.Dense(1, activation='sigmoid')(x)
model = keras.models.Model(inputs=resl.input, outputs=ol)
# model.compile(loss=keras.losses.binary_crossentropy, metrics=['accuracy'], optimizer='adam')
model.compile(loss=keras.losses.binary_crossentropy, metrics=['accuracy'], optimizer=keras.optimizers.Adam(learning_rate=0.0005))
for layer in resl.layers:
layer.trainable = False
#model.summary()
from tensorflow.keras.callbacks import EarlyStopping,ReduceLROnPlateau
es = EarlyStopping(patience=4, monitor='val_loss', min_delta=0, verbose=1, restore_best_weights=True)
reduce_lr = ReduceLROnPlateau(monitor='val_loss',
factor=0.1,
patience=3,
verbose=1,
min_delta=1e-4)
model.fit( train_generator, epochs=25, validation_data=valid_generator, callbacks=[es, reduce_lr], verbose=1)
EarlyStopping과 과적합 방지를 위해 ReduceLROnPlateau을 사용해주었습니다.
이제 여기서부터 멘탈이 나가기 시작했습니다.
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
# 모델로 예측 수행
y_pred = model.predict(test_generator)
y_pred = np.round(y_pred).astype(int)
acc_test = accuracy_score(y_test, y_pred)
print(f'테스트 점수는 => {acc_test*100:.2f}')
어제와 같은 방식으로 예측을 진행했는데 문제가 좀 많은거 같습니다.
일단 첫번째 문제로 계속해서 accuracy가 50으로 고정된다는 문제가 있고 두번째로 지금 해당 예측은 위에 만들어둔 y_test를 가져다가 쓰고 있는데 이렇게 하면 안될꺼 같다고 문제점을 느끼는 중입니다.
해결중에 있는데 해결하게 되면 밑에 수정 코드를 추가하겠습니다.
멘탈이 많이 나간 하루였습니다...
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.