일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Homomorphic Filter
- tf.train.string_input_producer()
- Raspberry Pi
- deep-learning
- VGGnet
- tf.saver()
- Embedded System
- OpenCV
- TensorFlow
- Machine learning
- porting
- tf.train.match_filenames_once()
- Data Load
- preprocessing
- I.MX6Q
- ARM Processor
- IOT
- Machine Vision
- CNN
- Python
- cross compile
- Facial expression recognition
- Today
- Total
Austin's_Lab
[Tensorflow] Training data와 label을 하나의 파일로 만들어서 로드하는 방법 본문
[Tensorflow] Training data와 label을 하나의 파일로 만들어서 로드하는 방법
Ausome_(Austin_is_Awesome) 2017. 4. 3. 16:01-Tensorflow 0.12.0사용 on Ubuntu 14.04-
저번 포스팅에서는 class별로 서로 다른 directory에 데이터를 놓고 각 directory를 통째로 load했었다. 이렇게 불러오니까 각 batch마다 하나의 class만 들어있게 되어서 뭔가 찝찝한 느낌을 지울 수 없었다. class가 10개이고 batch size가 32라면 batch 10개를 한 번씩 번갈아가면서 돌려야 모든 class에 대해 각 이미지 32장이 한 번씩 학습이 된다는 것이다. 학습에 너무 정형화된 패턴이 생겨버리면 왠지 안 좋을 것 같고, batch마다 각 class에 알맞게 학습되었던 weight이 다음 batch때는 다른 class에 맞게 다시 쏠려서 학습을 방해할 것 같은 기분. 물론 여러개의 batch에 대해서 일일이 한 번씩 돌려줘야하기 때문에 코드도 길고 지저분해진다. batch가 여러개니까 쓸데없이 메모리 사용량이 늘어나는건 당연한 문제. 무엇보다 각 batch마다 같은 class만 존재한다면 mini-batch의 의미가 없을 것 같았다(그냥 ML초보의 개인적인 생각. 느낌에 가깝다). 그래서 아예 training data를 load할 때 data를 섞어서 load하는 방법이 대해 찾다가, Cifar-10 예제였나 inception 예제였나 여튼 Tensorflow 예제에서 힌트를 얻었다.
어떻게 구현하느냐는 개인 취향이겠지만, 내가 구현한 logic은 이렇다.
1. 각 directory에는 class별로 학습시킬 데이터만 있다.
2. 각 directory별로 들어있는 training data들의 list와 매칭되는 label을 파일에 기록한다.(txt, cvs, ...) 나는 txt로 했다.
3. 각 directory 별로 순서대로 진행했다면 파일들이 class별로 뭉쳐있을테니 이 리스트를 다시 섞어준다. (사실 이건 나중에 batch를 만들면서 shuffle 옵션을 true로 주면 섞이는데, 그게 제대로 안 섞일까봐 임의적으로 몇 번 섞어주고, batch를 만들 때도 shuffle을 진행했다.)
4. Tensorflow에서 list가 들어있는 txt file을 읽고, 파일 이름과 label을 하나의 batch로 만든다.
5. session을 만들어 돌린다.
하나씩 차례대로 살펴보겠다.
1. 각 directory에는 class별로 학습시킬 데이터만 있다.
말 그대로이다. directory의 이름이 class1이라면 class1 directory안에는 class1의 training data 외에는 그 어떤 파일도 없다. 이것은 나중에 각 directory에 있는 파일들을 하나의 txt file로 만들어줄 때, training data이외의 파일에 대한 예외처리를 하기 귀찮기 때문에 미리 예외 사항들을 제거한 것이다.
2, 3 각 directory 별로 들어있는 training data들의 list와 매칭되는 label을 파일에 기록하고 섞어준다.
여기서부터는 별도의 프로그램을 만들었다. python의 내장함수 os.walk를 이용하여 directory에 존재하는 파일들의 이름을 txt file에 기록하고, 해당 directory의 class도 마찬가지로 함께 기록해준다. 이후 리스트를 섞어주기 위해 training data들을 기록했던 txt file을 다시 열어 random 모듈의 shuffle 함수를 사용해준다.
root/path/file_name.jpg 0
root/path2/file_name2.jpg 2
root/path5/file_name5.jpg 5
...
이제 이 리스트를 Tensorflow에서 load해서 쓰면 된다.
4. Tensorflow에서 list가 들어있는 txt file을 읽고, 파일 이름과 label을 하나의 batch로 만든다.
이제 만들어진 txt file을 Tensorflow에서 읽어서 쓰면 된다. 앞서 말했듯 tensorflow 예제를 응용했다. 원래는 역할별로 잘 쪼개져있었는데 함수이름 하나로 부르는 게 깔끔해보여서 그냥 하나로 뭉쳐버렸다.
5. Session을 만들어 돌린다.
이제 training image가 제대로 불러졌는 지 확인해 볼 차례이다. session을 만들고 queue를 돌리기 위한 thread를 만들어 돌리면 된다. image와 label이 제대로 매치되어 load되었는 지 확인해보기 위해 pyplot을 활용한다.