[CNN-LSTM 6] 코드 오류 해결 및 VGG16 구축완료

SeomIII·2022년 5월 4일
0

SONSU

목록 보기
12/29
post-custom-banner

📌 220502 월 - 회의 이후

✅ lstm에 넣는 데이터의 '차원'에 대한 공부가 필요하다.
✅ 개발 환경에 대한 공부가 필요하다.

https://webclub.tistory.com/458
https://okky.kr/article/1008493


📌 모델 오류 및 해결

[오류 및 해결 사항]
✅ 인코딩 오류 2개
- 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
✅ tuple index out of range
✅ ValueError: Shapes (128, 3) and (128, 5) are incompatible
✅ 모델 학습 조기종료

🥲 인코딩 에러

  • 0502 월 회의 시간에 지현님과 함께 코드 리뷰도 하고, 각자의 오류에 대해서 의견을 나누는 시간을 가졌다.

1. extract_features_and_store 함수에서 에러가 발생했는데,

np.save(open('video_x_inceptionv3.npy','w'),x_generator)
np.save(open('video_y_inceptionv3.npy','w'),y_lable)

인코딩의 문제가 있어 'w' -> 'wb' 로 변경하여 오류를 해결했다.

np.save(open('video_x_validate_inceptionv3.npy','wb'),x_generator)
np.save(open('video_y_validate_inceptionv3.npy','wb'),y_lable)

2. 또다른 인코딩의 문제가 발생했다.('utf-8' codec can't decode byte 0x93 in position 0: invalid start byte )

train_data=np.load(open('video_x_inceptionv3.npy'))

위와 같은 코드에서 계속 오류가 생겨

train_data=np.load(open('video_x_inceptionv3.npy','rb'))

'rb'를 추가하여 오류를 해결했다.


🥲 npy 인덱스 에러

1. 튜플의 인덱스를 벗어났다는 오류가 났다. (tuple index out of range)

train_data = train_data.reshape(train_data.shape[0],
                      train_data.shape[1] *train_data.shape[2],
                      train_data.shape[3])
  • print를 통해 train_data.shape[0],[1],[2],[3] 의 값이 모두 존재하는지 확인했다.
  • train_data.shape[0],train_data.shape[1] 까지 밖에 값이 없어서 나는 오류였다!
  • 그래서 왜 데이터가 없을까..? 고민하다가 지현님에게 연락을 해서 vgg16은 train_data.shape[0],[1],[2],[3]가 모두 있는지를 확인했다. 그래서 결국은 vgg16이 뱉어내는 결과값과 inception v3가 뱉어내는 결과값의 형태가 달라서 그런것임을 알 수 있었다.

🥲 ValueError: Shapes (128, 3) and (128, 5) are incompatible

  • vgg16 모델의 희망이 보이기 시작해서 지현님과 함께 vgg16 진행을 같이 진행해보았는데, 다음과 같은 오류가 발생했다.
  • 완전 처음 코드를 작성할 때, 잠시 긴가민가했던 부분이 있어 다시 살펴보았다.
model.add(Dense(5,activation='softmax'))

이 부분에서 마지막 dense 층은 바꿔줘야하지 않을까? 클래스 5개 여서 5아닐까? 라는 의문을 가진 적이 있었다.

model.add(Dense(3,activation='softmax'))

찾아보니 이 오류는 model.fit에 전달한 X_train, Y_train과 validation_data에 전달한 값들의 차원이 신경망의 units와 맞지 않기 때문에 발생하는 것을 알 수 있었고,
우리는 현재 3개의 클래스를 구분하려고 하므로 3으로 변경했더니 오류가 해결되었다.


🥲 모델 학습 조기종료

  • epoch=500으로 모델 학습을 시켰는데, 자꾸 300 언저리에서 학습이 아무런 이유없이 끝났다.
  • 지현님이 알아본 결과,학습 조기 종료를 위해서는 ‘EarlyStopping’이라는 함수를 사용하며 더 이상 개선의 여지가 없을 때 학습을 종료시키는 콜백함수 라고 한다. 본 코드에서는 EarlyStopping 함수를 사용했으므로 학습 조기종료가 일어난 것이다.

✔️ 학습 결과

  • 학습 조기종료로 인해 epoch 500에 도달하지 못했으며, validation acc가 잘 올라가다가 50-100 사이에서 정점을 찍고 다시 내려가는 결과를 볼 수 있다.

📌 다음 스터디 해결사항

  • incepiton v3의 피쳐가 담긴 2차원 배열을 lstm에 3차원으로 넣을 방법 알아보기

np.append

  • np.append(대상 array, 추가할 값, 축 지정)

profile
FE Programmer
post-custom-banner

0개의 댓글