본문 바로가기
KT에이블스쿨/에이쁠 기자단

[KT 에이쁠 기자단] 13주차 후기(10.30~11.2) - 미니프로젝트 6차

by 롱싱싱 2023. 11. 11.

안녕하세요~~~

 

13주차에는 5차 미니프로젝트에 이어 6차미니프로젝트를 바로 진행했습니다.

 

6차미니프로젝트에서는 4일동안 총 두가지 주제로 프로젝트를 진행했는데요.

이전에 배웠던 언어지능과 시각지능을 사용해서 프로젝트를 진행했습니다.

첫번째 프로젝트로 이틀동안 Aivle 스쿨 지원 질문, 답변 챗봇 만들기를 진행했고

두번째 프로젝트로 차량파손여부를 분류하는 프로젝트를 진행했습니다.

 


Aivle 스쿨 지원 질문, 답변 챗봇 만들기

aivle스쿨 질문 챗봇 만들기는 이전에 배웠던 언어지능을 사용하여 만든 프로젝트입니다.

aivle스쿨 지원 질문에는 비슷한 질문들이 많았기 때문에 이를 담당자가 일일이 답변해주기가 어렵고, 질문자도 답변되는 기간을 기다려야만했기 때문에 서로 불편한 점이 많았습니다.

챗봇을 사용하면 시간을 절약하고 사용자 경험을 개선할 수 있습니다.

 

데이터 탐색 및 전처리 단계와 모델링 단계로 진행되었고

데이터 탐색 및 전처리에서는 주어진 데이터의 분포를 확인하고 탐색한 내용을 바탕으로 전처리를 수행했습니다. 

모델링 단계에서는 Word2Vec임베딩 벡터 기반 머신러닝 분류 모델링과 질문 type분류하는 모델과 FastText를 사용하는 모델을 만들어 프로젝트를 진행했습니다.

 

더보기

FastText 란 Facebook 에서 개발한 자연어처리 (Natural Language Processing, NLP) 라이브러리로
Word2Vec 와 FastText 와의 가장 큰 차이점이라면 Word2Vec 는 단어를 쪼개질 수 없는 단위로
생각한다면 , FastText 는 하나의 단어 안에도 여러 단어들이 존재하는 것으로 간주합니다 . 내부 단어 .
즉 , 서브워드 subword 를 고려하여 학습합니다

너무 딱딱한 질문답변 챗봇이 되지않기 위해 기존 에이블스쿨 지원 Q&A에 일상 대화를 포함하는 데이터셋을 추가하여 더 많은 데이터로 학습에 유리하게 만들고 일상대화에 대한 질문도 답변이 가능하도록 했습니다.

 

mecab형태소 분석기

일상 대화 mecab분석

mecab을 사용하면 다른 분석기보다 빠르게 분석을 수행할 수 있습니다

 

머신러닝 모델링을 수행했지만 기대할만한 결과를 얻지 못했습니다

 

FastText분석

추가예정..

 

차량파손여부 분류

차량 파손 여부는 공유자동차 시대에 파손된 차량을 식별하고 알려주기 위해 만드는 서비스입니다.

데이터셋으로 파손된 차량의 사진과 정상차량의 사진이 주어지고 직접 이미지 모델링을 수행해서 분류를 수행했습니다.

파손된 차량과 정상차량의 사진 예시

데이터 전처리 작업에서 이미지를 array로 바꾸고 클래스를 만들었습니다.

이후 직접 CNN모델을 만들고 예측을 진행해봤고 나아가 데이터 증강과 사전학습된 pretrained모델을 사용하여 전이학습으로 데이터를 학습시켰습니다.

 

간단한 CNN을 모델을 만들어 테스트를 진행했지만 예측 결과가 0.72가 나왔습니다.

기존 모델에서 BatchNormalization와 dropout층을 추가적으로 쌓아 과적합을 방지해봤지만 결과는 생각보다 좋지 않았습니다...

 

Data-Augmentation

이미지 데이터가 총 600장 밖에 없기 때문에 기존 데이터만으로는 딥러닝을 수행하기가 어려웠다고 판단하여 데이터 증강을 사용했습니다.

ImageDataGenerator를 사용하여 데이터 증강을 수행했습니다.

datagen = ImageDataGenerator(
    rescale=1./255,           # 이미지 스케일링
    # rotation_range=40,        # 랜덤한 각도로 이미지 회전
    width_shift_range=0.2,    # 가로로 이동
    height_shift_range=0.2,   # 세로로 이동
    # shear_range=0.2,          # 전단변환
    # zoom_range=0.2,           # 확대/축소
    # horizontal_flip=True,     # 수평 반전
    # fill_mode='nearest'       # 이미지 확대 시 생성되는 픽셀 채우는 방법
)

데이터 증강을 수행해도 눈에 띄는 성능 향상은 없었습니다..

 

Pretrained-model사용

VGG16모델을 사용했고 기존 모델에서 추가적으로 Flatten과 Dense레이어, output레이어를 추가하여 작성했습니다.

from tensorflow.keras.applications import VGG16

base_model = VGG16(weights='imagenet', include_top=False, input_shape=(280, 280, 3))

x = base_model.output
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(1024, activation='relu')(x)
predictions = keras.layers.Dense(1, activation='sigmoid')(x)  # num_classes는 클래스의 수

VGGmodel = keras.models.Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
    layer.trainable = False  # VGG16 모델의 가중치 고정

VGGmodel.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

VGGmodel.fit(x_train, y_train, epochs=100000, batch_size=32, callbacks=[es], validation_data=(x_val, y_val))

 

그 결과 기존 모델에 비해 아주 높은 성능향상을 확인할 수 있었습니다.

이걸로 왜 사람들이 사전학습 모델을 사용하는지 아주 많이 느꼈습니다..