hwijin97 2021. 12. 1. 13:34

1. 데이터 API 를 사용해야 하는 이유?

대용량 복잡한 데이터 처리 엔지니어링을 간단하게 적용할 수 있다.

 

2. 대용량 데이터셋을 여러 파일로 나누면 어떤 장점이 있나요?

대용량 데이터셋을 섞을때, 모든 데이터를 메모리에 넣고 섞을수 없기때문에 먼저 크게크게 섞을 수 있는 장점이 있다. 또한 네트워크를 이용한 훈련에서 파일을 여러개로 나누면 데이터를 받으면서 훈련할 수 있다.

 

3. 훈련과정에서 입력 파이프라인의 병목을 어떻게 찾나요? 이를 어떻게 해결하나요?

텐서보드를 사용해 프로파일링 데이터를 시각화해서 병목을 확인한다.

GPU가 완전히 활용되지 않으면 프리패치를 적용해서 해결하고, 전처리 코드를 최적화하거나, 많은 CPU, RAM와 넓은 GPU 밴드위스를 확인한다.

 

4. 어떤 이진 데이터도 TFRecord 파일 또는 직렬화된 프로토콜 버퍼로 저장가능한가요?

네 각레코드의 시퀀스로 구성되는 TFRecord 파일에 레코드는 어떤 이진데이터나 직렬화된 프롵콜 버퍼도 저장가능합니다.

 

5. 모든 데이터를 Example 프로토콜 버퍼 포맷으로 변환해야 하나요? 자신만의 프로토콜 버퍼 정의를 사용하는것은 어떤가요?

Example 프로토컬 버퍼 포맷은 파싱 연산을 이용해서 유연하게 왠만한 데이터셋 샘플을 표현할 수 있지만, 표현할 수 없으면 protoc 파일을 만들어 tf.io.decode_proto() 함수로 직접 파싱한다.

 

6. TFRecord를 사용할 때 언제 압축을 사용하나요? 왜 기본적으로 압축을 사용하지않나요?

압축을 해제하는데 리소스를 소모하기때문에, 훈련하는곳에 TFRecord 파일을 다운로드 해야한다면 시간을 줄이기위해 압축하지만, 같은곳에 존재하면 굳이 압축해서 다시 압축푸는 리소스를 낭비하지 않기 위해서이다.

 

7. 데이터 파일을 작성할 때, 또는 tf.data 파이프라인, 모델의 전처리 층에서 TF 변환을 사용하여 데이터를 처리할 수 있다. 각 방법의 장단점은?

-데이터 파일 작성-

데이터를 생성할때 전처리를 수행하면 실시간으로 전처리를 수행할 필요가없어서 훈련 속도가 빨라지고, 데이터용량도 절약될 수 있는 장점이 있다. 하지만 여러가지 전처리 로직 실험은 어렵고, 데이터 증식에 데이터 변종을 미리만들어놔야 하고, 모델이 전처리된 데이터를 기대하기 때문에 애플리케이션에 전처리 코드가 추가되어야 한다.

-tf.data Pipeline- 

데이터 파이프라인을 사용하면, 전처리 로직 실험, 변경이 자유롭고, 데이터 증식을 적용하기 쉽다. 또한 효율적인 전처리 파이프라인을 만들 수 있는 장점이 있다. 하지만 훈련에 전처리가 포함되기때문에 훈련속도가 느려지고 매 에폭마다 훈련샘플을 전처리한다. 마지막으로 훈련된 모델은 여전히 전처리된 데이터를 기대한다.

-모델의 전처리 층-

훈련과 추론을 위해서 한번만 코드를 작성해서 모델에 층을 추가하기만 하면된다. 모델을 배포할때 여러번 작성할 필요도 없고, 전처리 로직이 모델의 일부분이라 잘못된 전처리 로직을 사용할 위험도 없다. 하지만 전처리로 훈련속도가 느려지고 에폭마다 전처리가 수행된다. 그리고 전처리 연산이 GPU에서 수행되서 CPU병렬 혹은 프리패치사용이 안된다. 향후 전처리 연산을 떼어내 tf.data  파이프라인의 일부로 실행하는 메서드가 추가된다.

-TF 변환-

전처리데이터를 실제로 만들어서 샘플이 딱한번만 전처리가 수행된다. 또한 전처리 층이 자동으로 생성되서 전처리 코드를 한번만 작성하면된다. 그런데 사용방법을 모르면 못쓴다.

 

8. 범주형 특성을 인코딩할 수 있는 대표적인 방법을 나열하시오. 텍스트 데이터는 어떻게 인코딩할 수 있나요?

- 내재된 순서가 있을경우, 순서가 있는 인코딩 방식을 사용한다. 없을경우 원핫 인코딩을 사용하고 범주가 많으면 임베딩을 사용한다.

- 텍스트에는 BoW(bag of word)  표현을 사용해서 단어들의 카운트 벡터로 표현한다. 자주사용하는 단어는 중요하지 않으므로 TF-IDF으로 가중치를 낮춘다. 또한 단어 카운트 대신 n개의 단어 연속여부 n-그램을 카운트하거나, 사전 훈련된 단어임베딩을 사용하거나, 단어를 인코딩하는 대신 각 글자를 인코딩하거나, 부분 토큰을 인코딩 할 수도있다.

 

 

https://github.com/kimhwijin/HandsOnMachineLearing/blob/main/HOML_Exercise_13.ipynb

 

GitHub - kimhwijin/HandsOnMachineLearing

Contribute to kimhwijin/HandsOnMachineLearing development by creating an account on GitHub.

github.com

9. 패션 MNIST 데이터셋을 적재후 훈련,검증,테스트 로 나누고 훈련세트를 섞고 TFRecord로 저장하기. 데이터셋을 만들고 전처리를 포함한 모델 훈련하고 텐서보드로 데이터 시각화하여 파이프라인을 효율적으로 만들기.

10. 데이터셋을 다운 및 분할하고, 효울적으로 전처리, Embedding 층을 포함한 이진분류모델을 만들기.

-a- 인터넷 영화 데이터베이스 영화리뷰 데이터셋을 다운

-b- 테스트 세트를 검증세트와 테스트세트로 나누기

-c- tf.data를 사용해서 각 세트에 대한 효율적인 데이터셋 만들기

-d- 리뷰를 전처리하기 위해 TextVectorization 층을 이용해 이진 분류 모델 만들기.

-e- Embedding 층을 추가해서 단어 개수의 제곱근을 곱하여 리뷰마다 평균 임베딩을 계산하기.

-f- 모델 훈련후 정확도측정 및 훈련 속도 더 빠르게 파이프라인 최적화하기

-g- tfds.load 로 동일한 데이터셋 간단히 적재하기