본문 바로가기
  • 콩's 코딩노트
TensorFlow

TensorFlow - 파일을 training 과 test 디렉토리로 나눠서 저장하기

by Cong_S 2022. 6. 15.

이미지를 분류하기 위한 딥러닝을 학습할 때 그 무엇보다 중요한 부분이

바로 데이터를 준비하는 과정이다.

 

어떤 데이터로 학습시키는가가 성능에 큰 영향을 줄 수 있으므로 꼭 잘 알고 넘어가야한다.

 

특히 모든 상황에서 트레이닝 데이터와 테스트 데이터가 나뉘어 제공되진 않으므로

코랩이나 리눅스 상황에서 파일을 분리할 수 있어야한다.

 

그 방법은 다음과 같다.

# 1. 디렉토리 만들기
os.mkdir('/tmp/cats-v-dogs')

os.mkdir('/tmp/cats-v-dogs/training')
os.mkdir('/tmp/cats-v-dogs/testing')

os.mkdir('/tmp/cats-v-dogs/training/cats')
os.mkdir('/tmp/cats-v-dogs/training/dogs')

os.mkdir('/tmp/cats-v-dogs/testing/cats')
os.mkdir('/tmp/cats-v-dogs/testing/dogs')

제일 먼저 파일을 복사해 넣을 디렉토리를 os의 mkdir 함수로 만들어준다.

 

# 2. 원본 디렉토리에서 파일명 가져오기
filename_list = os.listdir(SOURCE)

원본 디렉토리를 쉽게 사용하기 위해 listdir 함수를 이용해 변수로 저장한다.

 
# 3. 셔플해준다.
shuffled_list = random.sample(filename_list, len(filename_list))

다양한 데이터를 위해 데이터의 순서를 random의 sample 함수로 리스트를 섞어준다.

 

 

 # 4. 트레이닝과 테스팅을 분리하기 위해 인덱스를 잡아준다.
index = int(len(shuffled_list) * SPLIT_SIZE)

인덱스를 잡아준다는 것은 파일 리스트의 전체 갯수 중 90% 든 80%든 나눠 숫자로 저장한다는 뜻이다.

 

 
 
# 5.split 해준다.
  training = shuffled_list[ 0 : index ]
  testing = shuffled_list[ index : ]

위에서 구한 정수를 토대로 training과 test 로 나누어 저장한다. (아직은 변수에만 저장됨)

 

# 6. 각각의 분리된 파일의 해당 디렉토리로 복사해준다.
  for filename in training:
    if os.path.getsize(SOURCE + filename) > 0 :
      copyfile(SOURCE + filename, TRAINING+filename)
  
  for filename in testing:
    if os.path.getsize(SOURCE + filename) > 0 :
      copyfile(SOURCE + filename, TESTING+filename)

마지막으로 for 반복문을 통해 파일의 size가 0보다 큰 데이터는

각각 소스의 경로와 저장할 위치 경로에 파일 이름을 붙여 복사, 저장해주면 된다. 

댓글