TIL/2023.5월

TIL seaborn(씨본)

황소탄 2023. 5. 18. 16:22

2023.05.18 목

 

문제

딥러닝 실습 중 데이터를 라벨로 분류하여 분포를 확인하기 위해 seaborn을 사용하는 중,사본으로 복사하여 실습을 진행하는 곳에서 출력되는 형태가 강의와 다른 문제가 발생하였습니다.

 출력되어야 하는 모습

출력되는 모습

 

시도

1.오타확인

강의를 듣는 중간중간 사본파일에는 주석으로 코드설명을 적었습니다, 이 때 코드가 변경되었을 수도 있으니 원본과 비교하며 다른 부분을 찾았습니다.

->오타 없음!

 

2.실행되지 않은 블록체크

구글 콜랩에서 실습을 진행합니다, 그렇기에 블록단위로 코드를 쪼게 실행하는데 이 때 실행시키지 않은 부분은 전체적으로 적용이 되지 않아, 다른 동작이 발생할 수 있습니다. 계정로그인 블록부터 하나하나 실행여부를 확인했습니다.

->모두 실행되었습니다.

실행된 코드는 이렇게 표시가 남습니다.

3.반대로 잘못 실행된 블록체크

반대로 생각하면, 블록실행 시 적힌 코드가 적용되니 실행하지 말아야 할 블록이 있는데 그것을 실행하여 문제가 발생할 수 있으니, 강의를 다시 따라가며 잘못 실행된 블록이 있는지 체크하였습니다.

->없었습니다.

 

4.도와줘 GPT

GPT에게 물어보았습니다, 크게 도움되는 답변은 없었지만, 몇가지 체크사항을 알려줘 사용해보았습니다.

4-1. label과 같은 이름을 가진 것이 있는지.

->영어 알파벳 수화 이미지를 가지고 딥러닝을 학습하고 있었습니다, 그렇기에 label에는 각 알파벳이, 나머지는 이미지가 들어갈 pixel1~784 (가로 28px, 세로28px 알파벳 하나에 총 784)이기에 문제가 되지 않았습니다.

4-2. label 안에 데이터가 중복되거나 이상이 있는지.

train_df['label'].unique()

이 코드를 사용하여 label안의 값을 보았습니다, 중복된 값x, 형식에 맞지않은 값x

array([ 3, 6, 2, 13, 16, 8, 22, 18, 10, 20, 17, 19, 21, 23, 24, 1, 12, 11, 15, 4, 0, 5, 7, 14]) 9와 25는 각 J와 Z를 나타내며 이 둘은 동작이 필요하기에 이미지로 표현이 적절하지 못해 제외시켰습니다, 그렇기에 총 26자 중 2자를 뺀 24자가 있습니다.

 

5.튜터님은 미리 블록을 실행하였기에 다를 수도있다!

원본에서도 강의에서도 실행결과가 이미 나와있던 것을 보고 이후 하게 될 전처리과정의 유무 때문에 이런 차이가 난다고 생각하여 일단 강의를 진행하였습니다.

->해당 사본파일을 이용한 실습 중에는 그래프 말고 다른 문제는 발생하지 않았으며, 강의가 끝난 후 다시 그래프를 출력하여도 변화가 없었습니다.

 

해결

원인을 파악하기에 데이터셋을 사용하는 것은 직관적이지 못했습니다.

 labels = [3, 6, 2, 13, 16, 8, 22, 18, 10, 20, 17, 19, 21, 23, 24, 1, 12, 11, 15, 4, 0, 5, 7, 14]

 plt.figure(figsize=(10, 6))
 sns.countplot(labels)
 plt.show()

labels에 값을 넣어주고 실습 때와 같은 형태로 출력시켜보았습니다.

가설1. 임의로 만든 데이터가 알맞게 출력한다면 데이터셋에 문제가 있는 것이다.

가설2. 임의로 만든 데이터 또한 출력이 이상하면 패키지 부분에 문제가 있는 것이다.

실행결과 

x축은 lables가 되고 y축은 labels안의 값의 수를 출력하고 있었습니다.

 

즉, 데이터프레임의 label을 출력했을 때, 하나가 나온 이유도 x축의 값이 label로 지정되었기 때문입니다.

강의를 만든지 시간이 좀 지났기에 강의와 다르게 동작하는 문제가 발생하였다 생각하여, sns.countplot을 키워드로 검색을 해보았습니다.

검색결과 x를 지정해주어야 한다는 것을 알게되었습니다.

labels = [3, 6, 2, 13, 16, 8, 22, 18, 10, 20, 17, 19, 21, 23, 24, 1, 12, 11, 15, 4, 0, 5, 7, 14]

plt.figure(figsize=(10, 6))
sns.countplot(x=labels)
plt.show()

출력결과

원하는 모습으로 출력되었습니다.

이제 실습 코드에 이것을 적용하여 출력시켜보았습니다.

plt.figure(figsize=(10, 6))
sns.countplot(x=train_df["label"])
plt.show()

출력결과

원하는 모습입니다!

 

느낀점

문제점을 알고나니 정말 간단한 문제였습니다, 하지만 무엇이 문제인지 몰랐을 때 이를 해결하려고 하니 꽤 많은 시간을 사용했습니다.

실습 중 블록실행은 30번 정도 나머지는 그래프 해결을 위해 실행한 횟수

딥러닝을 공부하며 개념적인 부분도 중요하지만, 학습결과를 좋게하기 위해 어떻게 조정이 필요한지를 중심으로 강의가 진행됩니다.

그렇기에 코드도 주어진 것을 실행해보는 정도로 실습을 진행하는데, 이런 문제를 만나고 또 해결해보니 앞으로 실습 중에 수치도 좀 건드려보고, 각 코드가 어떻게 동작하는지도 알아보는 것이 좋을 것 같다는 생각이 듭니다.

 

+3주차 강의 숙제 중 데이터 셋이 60,000개를 학습시켰습니다.

실습과 마찬가지로 에폭 20을 두고 돌렸는데...

16분 정도 돌렸네요ㅋㅋㅋ

plt.figure(figsize=(16, 10))#그래프 크기 정하기
plt.plot(history.history['loss'])#학습데이터를 저장한 history를 사용하여 데이터를 불러옴
plt.plot(history.history['val_loss'])
#가로축은 에폭 수(학습반복 수), 세로 축은 loss 수
#파란선은 트레이닝 노란선은 테스트 loss가 적다!

loss도 낮고!

plt.figure(figsize=(16, 10))
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
#정확도는 상승하는 형태!

정확도(acc)도 점점 상승하는 모습을 보여줍니다!

여튼 데이터셋이 많을 때, 에폭을 잘 설정해주어야지 느꼈습니다ㅋㅋㅋ