728x90

오전에 LDA 토픽결과를 가지고 계층 군집화를 할수 있을지 시도해 봤습니다. 강의도 들어보고 예시 코드도 봤지만 결코 쉽지 않았습니다 ;; 오후에는 taxi 수요예측 실습을 해야 했기 때문에 어쩔수 없이 책을 덮었습니다ㅠㅠ.. 

화장지가 모잘라서 제대로 못 닦고 나온 느낌처럼 매우 찝찝했습니다 

 

문서 유사도를 토픽모델링에 접목시킬려면 각 분류에 해당하는 문서들끼리 (청원글에는 '행정','정치개혁' 등 17개의 분류가 있습니다) 얼마나 유사한지 구할수는 있을것 같았지만,  그 결과가 새로운 인사이트를 주진 못할것 같아서 접었습니다. 

 

LDA에서 나온 토픽 갯수가 만일 4개라면,  각 토픽에 해당하는 단어를 하나의 객체로 만든 후 ->백터화 -> 모델 적용 하게 되면 가능하지 않을까 조심스레 생각해봅니다 아직 초보라 뭔가 맨땅에 헤딩하는 기분이라 깝깝~~합니다 :) 

 

오후에는 수요예측 실습강의를 들으면서 따라해 봤습니다.  구글 SQL을 처음 사용해 봤습니다 

다른 DBMS는 설치과정 만만치 않아서 언제나 장벽처럼 느껴졌는데 구글 SQL은 접근하기가 너무 간편해서 좋았습니다 

 

지금은 EDA과정을 하고 있는데 

강사가 다양~한 방법으로 시각화를 소개 해줍니다 

생소한 방법들이 많아서 새로웠고 또 하나 배운것같아서 좋았습니다!!

 

사실 오늘따라 집중도 잘 안되고 아침부터 계층군집 실패를 맛본터라

의욕이 다소 떨어졌습니다 ㅠ  그러다 보니

취업걱정에 한숨만 늘어지게 쉬었네요

 

오늘은 좀 일찍 마무리하고 산책도 하고 운동하면서 환기좀 시켜야 할것같습니다 :) 

728x90

'Data Diary' 카테고리의 다른 글

2021-01-19 공부기록  (0) 2021.01.19
2021-01-16 공부기록  (0) 2021.01.16
2021-01-15 공부기록  (0) 2021.01.15
2021-01-14 공부기록  (0) 2021.01.14
2021-01-12 공부기록(토픽모델링)  (0) 2021.01.12
728x90

저번주 금요일부터 시작했던 국민청권글을 가지고 토픽모델링을 진행하고 있습니다~!

원래 강의 내용은 카카오톡 분석이였지만 어떠한 이유로 인해서 카톡으로 진행을 하지 못했습니다 그래서 청원글로 대체 했습니다. 이 청원글로 토픽 모델링 한다면 주로 어떤 종류의 청원을 많이 올리는지 볼수 있을것 같아서 시작하게 되었습니다.

 

어제했던 내용을 이어 받아서 오늘도 하루 종일 여러 시도를 했지만 좀 처럼 해결이 나질 못했습니다. 

아침부터 나를 당황하게 만들었던 이 에러 문구..  어제까지만 해도 됐었잖아 ㅠ ㅠ 무슨변덕이람..ㅠㅠ   

어쩔수 없이 기존 코드를 여차저차 수정했습니다

 

오늘 진행한 내용은 아래와 같습니당~

1. 전처리

2. LDA,ATM 모델 수정

3. pyLDAavis 시각화

4. 문서 군집화

 

오늘 가장 많~이 시간을 잡아 먹은건 당연히 전처리입니다 

특히 list of list of word 에서 글자 갯수가 2이상인 word만 남기는 과정에서 고민을 좀 했습니다

 

내 생각대로라면 이 코딩이 맞는데 지속적으로 퇴짜를 맞는 바람에 이것저것 건드려 봤습니다 

그렇게 전처리를 하면 모델도 다시 돌리고

 

그런 과정을 오전,오후 동안 무한반복 했습니당 :)

 

늦은 오후에는 문서 군집화라는 걸 처음 봤습니다!!

파이썬 머신러닝 완벽가이드 라는 책인데 

좀더 좋은 생각이 없을까 뒤적뒤적 거리던 중 눈에 딱! 들어왔습니다 

 

왜냐면 ATM 실행 결과를 보니까 유사도가 비슷한 카테고리가 많더라구요

검색해 보니까 요걸 계층 군집화를 하게 되면 제 생각이 좀더 명확해 질것 같았습니다

 

그러던중 요걸 발견했습죠

비록 제가 원한 계층 군집화는 아니였지만 코딩을 따라 적으면서 

이런 방법도 있구나 ~ 또 하나를 알게 되었습니다 

위 결과가 topic=4로 했을때 문서 군집화 내용입니다.  각 군집화의 중심과 가까운 핵심 단어 10개와 카테고리를 출력한 결과입니다 이걸 딱 보는 순간 전처리를 해야겠다 싶었습니다  그래서 또 전처리를 시도 했습니다 

 

그리고 전처리를 시도 할수록 미궁속에 빠지는 느낌이였습니다 

개인적인 느낌에는 LDA 전처리 보다 이 전처리가 더 어렵게 느껴졌습니다 

 

내일부터는 다른 공부를 해야하는데 

이걸 내일 마저 할지 말지 좀더 고민을 해봐야 할것 같습니다 

728x90

'Data Diary' 카테고리의 다른 글

2021-01-19 공부기록  (0) 2021.01.19
2021-01-16 공부기록  (0) 2021.01.16
2021-01-15 공부기록  (0) 2021.01.15
2021-01-14 공부기록  (0) 2021.01.14
2021-01-13 공부기록(토픽모델링)  (0) 2021.01.13
728x90

시작하기에 앞서

첫 블로그 내용으로는 BTS 이미지를 분류해봤습니다. BTS를 선택한 이유는 팬이기도 하고 유명하니까 자료 얻기도 쉽지 않을까 하는 생각에 선택했습니다! 그래서 BTS 멤버 이미지를 가지고 분류하는 코드를 작성해봤는데, 틀렸다거나 다른 이견이 있으시다면 언제든 말씀해 주시면 감사하겠습니다 ^^

자료는 다음 이미지를 크롤링했습니다. 한명 당 1300건을 수집했고, 훈련에 부적합한 이미지를 거른 후 총 7649장을 사용했습니다. 

업로드할 코드 이미지는 추가적인 설명 또는 막혔었던 부분을 설명하겠습니다. 

참고서적은 케라스 창시자에게 배우는 딥러닝, 핸즈온 머신러닝입니다. 

 

CNN 딥러닝 분류 모델

성능을 높히기 위해서 데이터 증식과 VGG16 사전 학습 모델을 적용시켜봤습니다.

큰 틀의 내용은 아래 목차를 올리겠습니다.

colab.research.google.com/drive/1n5m6i-4EuGOOWRnpgaMW1AziiijyaiDf?usp=sharing

 

Google Colaboratory

 

colab.research.google.com

 

필요한 모듈 import

데이터 전처리

 

채널이 RGB가 아닌 사진들을 제거합니다. 삭제 전 후 이미지 수가 같은 이유는 사전에 미리 코드를 돌렸습니다. 

대략 30장이 삭제되었는데 거의 15분 정도가 걸렸습니다. 

각 멤버별로 인덱스를 enumerate로 넣어줍니다. class 2_idx는 tfrecord를 통해서 모델의 label로 사용됩니다.

 

첫 번째 고민했던 부분

실습 때와 다르게 각 멤버별로 이미지 수가 달라서 train, test를 어떻게 나눌까 였습니다. 

"사실 처음 시도했을 때는 각 멤버별 이미지 수가 다르다는 걸 생각지 못했었습니다 ㅠ "

위 코드로 각 멤버별 이미지 수를 파악한 후에 7:3 비율로 분리했습니다.  

7:3으로 분리하는 사용자 정의 함수를 만든 후, 각 멤버 별로 적용했습니다. "이제 보니까 for문으로 좀 더 깔끔하게 할 수 있지 않았을까 생각이 듭니다."

train_dir, validation_dir으로 분리된 이미지의 수를 파악해봅니다. train 이미지는 5358, validation 이미지는 2291장입니다. ""각 멤버 별 train 수가 1000장이 안되기 때문에 기대에 맞는 성능은 나오지 못할 거란 걸 알고 있었지만 크롤링한 이미지를 모두 전수 검사를 하다 보니까 (3시간 소요) 힘이 들어서 양을 늘릴 엄두를 못 냈습니다""

 

TFRecord File 생성

tfrecord에 대해서 더 공부해야 할 부분이 많지만 장점을 말씀드리자면 대규모 데이터를 효율적으로 처리할 수 있다는 장점을 가지고 있습니다. tfrecord형식은 이진 레코드의 시퀀스를 저장할 수 있는 간단한 형식입니다.

경험상 dataset으로 만드는 과정이 비교적 간단하다고 생각합니다.

tfrecord file을 저장할 경로를 설정해줍니다.

tensorflow 홈페이지에 있는 코드입니다. 이 함수들을 통해서 일반 data를 tfrecord data로 변환합니다.

 

image는 bite로 직렬화 해서 만들고, 레이블은 int형식으로 지정해줍니다. validation도 동일하게 위 코드처럼 진행해서 이미지는 생략했습니다.

 

생성이 되었는지 확인해 봅니다.

hyper parameter를 설정합니다. 

tfrecord file를 data로 해석해주는 함수를 정의합니다. 해석된 data로 dataset를 만들 예정입니다. 그리고

IMG_SIZE= 224로 설정했습니다.

 

loss, acc 그래프를 그려본 결과입니다. loss감소, val_loss 증가 형태는 과적 합의 그래프입니다. epoch 수가 적기 때문에 단지 튀는 과정일 수도 있습니다. 따라서 acc 그래프도 같이 보았습니다.(오른쪽 사진)

acc 그래프에는 val_loss가 일정한 걸 보아서는 epoch를 늘려도 변함이 없어 보임으로 과적합임을 확인할 수 있었습니다. 과적합을 없애기 위해서 BatchNormalization과 데이터 증식을 적용시켜 봤습니다.

 

train 이미지에 다양한 옵션을 설정했습니다. validation 이미지에는 rescale만 적용시켜 줍니다. 

위 사진처럼 같은 이미지라도 다르게 만들어서 Data의 부족을 해결합니다.

class_mode에서 이진 분류를 한다면 binary를 넣고, 이진이 아닌 다중 분류라면 정수 라벨을 반환하는 sparse로 설정합니다. BTS는 7개의 라벨이 있기 때문에 sparse로 적용시켜줍니다.

파라미터 정리

2D one-hot 부호화된 라벨이 반환됩니다.

binary : 1D 이진 라벨이 반환됩니다

sparse : 1D 정수 라벨이 반환됩니다.

 

val_accuray: 29.73%

loss, acc 그래프를 본 결과 과적합이 사라 졌음을 볼 수 있었습니다. epoch를 더 늘리면 성능이 좀 더 올라갈 것으로 보입니다. 

이 결과를 통해 새로운 이미지를 test 해보겠습니다.

지민 사진을 넣었는데 예측 값으로 진이 나왔습니다.

과적합을 해결했지만 성능 측면에서 아쉬운 부분이 있습니다. 따라서, 사전학습을 통해 성능을 올려 보도록 하겠습니다.

사용될 사전학습 모델은 VGG16입니다.

 

모델을 imagenet을 통해 다운로드합니다.

이 외에 나머지 코드는 위에서 했던 코드와 상당수 일치하므로 새로 추가된 코드만 올리겠습니다

 

정확도가 전 모델에 비해 크게 상승했습니다. 그래프를 통해 과적합 여부를 쉽게 파악합니다.

 

epoch 10 이상부터는 과적합 전조 현상이 보입니다. v16 model에는 적용하지 않았지만 과적합을 줄이기 위해서 dropout를 시도해 볼 수도 있겠습니다.

 

마지막으로 아까와 같은 이미지로 테스를 진행해보겠습니다.

그 결과 

"지민" -> "김남준"으로 오답을 예측했습니다.

과적합이 발생했기 때문에 정답을 맞혔더라도 모델 수정은 반드시 이뤄져야 할 것 같습니다.

 

느낀 점

처음으로 CNN 프로젝트를 짧게나마 진행해봤습니다. 깔끔하게 정리된 이미지를 가지고 실습하다가 실전 이미지를 다루다 보니 많은 시행착오가 있었습니다. 전처리하는데 대부분 시간이 소요되었습니다. 아직 많이 부족하지만 배울게 많다는 게 인공지능 분야의 장점이라고 생각합니다. 감사합니다  

 

728x90

'projects' 카테고리의 다른 글

따릉이 자전거 이용 예측_dacon  (0) 2021.09.30
Face Mask Detection  (0) 2021.08.25
동서발전 태양광 발전량 예측 프로젝트_dacon  (0) 2021.06.29
뉴욕 택시수요예측  (0) 2021.02.16
국민청원글 토픽모델링  (0) 2021.01.18

+ Recent posts