KT 에이블스쿨 35일차(1)

박기범·2023년 3월 21일
0

에이블스쿨

목록 보기
41/95

오늘은 미니프로젝트 2일차와 제 멘탈이 붕괴된 날입니다.



진행 예정

오늘의 프로젝트는 Data Augmentation과 모델링을 같이 진행했습니다.



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을 생성

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)

▶.flow_from_directory 사용

	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()

▶모델 학습(w.EarlyStopping)

	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를 가져다가 쓰고 있는데 이렇게 하면 안될꺼 같다고 문제점을 느끼는 중입니다.

해결중에 있는데 해결하게 되면 밑에 수정 코드를 추가하겠습니다.







멘탈이 많이 나간 하루였습니다...




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글