5. Transfer learning based on MobileNet w/ cats-and-dogs-data

2024. 6. 30. 23:44공부 정리

 

전에는 코드도 흐름도 쉬워서 몇가지를 같이 비교하면서 합치는게 간단했다. 근데 지금은 코드도 길어지고 내용도 까다로워져서 하나 보는 데에도 시간이 좀 걸린다. 여기에 어떤 내용이 들어가 있고 어떤 식을 적용한건지 확인하면 시간이 이전보다 더 걸린다. 근데 세 코드를 합치려니 시간이 더 걸렸다. 이번주 내내 기분도 다운되고 그래서 진짜 아무것도 하고싶지 않았는데 6월을 이렇게 마무리할 순 없어서 올린다.

 

기본 틀은 tf에 공개된 코드와 같으며 MediumCase코드도 그와 거의 비슷하게 전이학습을 추가하여 모델 고정, 동결, 층 추가, 재훈련, 미세튜닝 단계를 진행한다. 차이점은 변수명 뿐이다. 학교에서 듣기론 이 흐름이 이미지를 분석 할 때 일반적이라고 한다.

 그나저나 이정도로 적은 차이로 개인 블로그에 올렸는데 저작권 문제 안되나? 이걸 당당하게 자기가 만든거라고 할 수 있나? 정말로 궁금하다. 그러면 내 플젝으로도 가능하다는건데 이게 어떻게 내 플젝이 될 수 있지? 텐서보드를 추가했지만 그래도... 이해하는거랑 별개로... 공공데이터를 활용해서 만든다고 모델을 다르게 쓰진 않을텐데 데이터분석처럼 주관적 해석이 들어가는 부분도 크게 없고 한데 결국 어떻게 내가 조정해서 퍼센티지를 올렸는지 설명하는 수밖에 없나.

 케글에선 대부분의 코드가 colab처럼 한 파일에 쓰여있는데 그게 일반적인건지 그 것도 궁금하다. 논문 github 보면 cuda와 gpu 사용이 일반적이던데 뭐가 일반적인지 모르겠다. 학교와 TF에선 colab위주로 공부했는데 회사에 들어가서 간극이 클까봐 걱정된다. 리딩이 없으니까 이게 불안하다.


 

MediumCase(개고양이):

googleapi에서 데이터 불러오기 > 경로 지정 및 image_dataset_from_directory로 전처리 > 시각화 테스트 > prefetch > augment > 증강 시각화 테스트 > 인풋데이터 형태 세팅하고 베이스모델 불러오기 > 베이스모델 동결 > 요약(Trainable params=0) > 모델 뒤에 붙일 레이어들 생성 > 학습률 세팅 후 컴파일 > 요약(trainable params=1281) > val로 초기 평가 > val로 초기 평가 결과 > 적합 > accu와 loss 시각화 > 베이스모델 동결 해제 > 앞부분만 고정 > 컴파일 > 요약(trainable params=186,) > 추가 적합 > accu와 loss 시각화 > test로 평가 > test로 예측 후 넘파이로 결과값 확인 및 결과 이미지 시각화

https://medium.com/@nutanbhogendrasharma/tensorflow-classify-images-of-cats-and-dogs-by-using-transfer-learning-59da26723bda

tf_keras: .load로 데이터 불러와 바로 split > 데이터 시각화 테스트 > resize > prefetch > augment > 데이터 증강 시각화 테스트 > 베이스모델 고정 후 입력층에 증강 함수 추가, 맨 아래 고정하지 않은 레이어 생성 > compile + fit > 베이스모델 고정 해제 후 compile + fit

tf_images: 구글스토리지에서 바로 불러와 경로 및 초기 정보 세팅 > image_dataset_from_directory로 트레인데이터와 검증데이터의 셔플, 배치크기, 이미지크기 세팅 > autotune prefetch > augment > 이미지 데이터 증강 시각화 테스트 > 스케일링 > 인풋데이터 형태 세팅하고 베이스모델 불러오기 > 베이스모델 동결 > 요약(Trainable params=0) > 모델 뒤에 붙일 레이어들 생성 > 학습률 세팅 후 컴파일 > 요약(trainable params=1281) > val로 초기 평가 > val로 초기 평가 결과 > 적합 > accu와 loss 시각화 > 베이스모델 동결 해제 > 앞부분만 고정 > 컴파일 > 요약(trainable params=186,) > 추가 적합 > accu와 loss 시각화 > test로 평가 > test로 예측 후 넘파이로 결과값 확인 및 결과 이미지 시각화

 

 

* flow_from_directory vs image_dataset_from_directory: 이거 많이 중요하다. 둘의 출력 형태가 다르다. 전자의 경우 증강을 밖으로 빼주어야하고 후자는 그럴 필요 없이 반복문에 끼워넣으면 된다. 신식코드가 후자라고 하니 나는 앞으로 후자를 쓰려고 한다.

https://datascience.stackexchange.com/questions/78405/image-dataset-from-directory-vs-flow-from-directory

* nn.sequential vs class: 2번 플젝 할때부터 느꼈던건데 안적어둬서 적어둔다. 둘은 성능차이는 없고 취향문제라고 한다.

https://discuss.pytorch.org/t/differences-between-writing-models-with-nn-sequential-vs-creating-a-class/17470

* ImageDataGenerator vs tf.data(cf. preprocessing): 이미지 증강할 때 쓰는 함수 차이. 시점차이만 있어보이는데 아래 글에선 속도가지고 얘기가 좀 나온다.

https://stackoverflow.com/questions/60946027/tf-data-vs-tf-keras-preprocessing-image-imagedatagenerator

* predict vs predict_on_batch: 예측할 때 배치 범위로 구분. 그냥 준건지 배치 하나만큼 준건지 구분한 함수라서 속도에서 차이가 난다.

https://stackoverflow.com/questions/44972565/what-is-the-difference-between-the-predict-and-predict-on-batch-methods-of-a-ker

* preprocess_input: 이미지 전처리 함수. RGB형태의 입력데이터를 각 모델에 맞는 형태의 데이터로(BGR) 바꿔주고 스케일링 해준다.

* 파인튜닝의 세 방법:

1) 사전 모델의 전체를 재학습시키는 경우 - fine tuning의 의미가 없기에 배제.

2) 사전 모델의 분류기와 일정 부분의 합성곱층을 재학습시키는 경우 - 3의 경우를 제외하고 대체로 선택.

3) 사전 모델의 분류기만 재학습시키는 경우 - 데이터가 매우 작은 경우 선택.

* 일반화 vs 정규화 vs 표준화: 위의 글을 찾다가 본건데 이것도 확실히 해둘 필요가 있어 써둔다.

일반화: generalization - 인풋이 달라져도 아웃풋의 성능이 일정하도록 한다.

정규화: normalization - 최소값을 0, 최대값을 1로 해서 값의 크기만 줄여준다. 스케일링과 같은 의미. 이상치 감지 불가능하다.

표준화: standardization - 가우시안 정규분포인 N(평균, 분포)를 따르도록 한다. 이 경우 평균은 0, 분산은 1이다. boxcox변환을 사용한다. 이상치 감지 가능하다. robustscaler

https://velog.io/@chiroya/15-Generalization-Normalization-Standardization


 

 

 

728x90