파일을 train/test로 디렉토리를 나눠서 저장하는 방법

반응형

해당 포스팅은 구글 코랩(Colab)을 기준으로 작성하였습니다.


데이터 파일

  • 데이터 파일 다운로드 후 압축해제
# /tmp 경로에 압축파일을 다운로드 받고 압축 푼다.
!wget --no-check-certificate \
    "https://block-edu-test.s3.ap-northeast-2.amazonaws.com/kagglecatsanddogs_5340.zip" \
    -O "/tmp/cats-and-dogs.zip"

import zipfile
local_zip = '/tmp/cats-and-dogs.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

파일을 분리하고 저장 할 디렉토리 생성

  • training 폴더
  • testing 폴더
    • 각각의 분류가 되는 세부 폴더
import os
try:
    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')
except OSError:
    pass

Train/Test 데이터 분리

  • Training 데이터 : 90% / Testing 데이터 : 10% 로 분리
    • index와 SPLIT_SIZE 변수를 활용하여 데이터의 퍼센테이지대로 분리
  • 데이터 파일의 경로에 있는 파일들을 셔플 (랜덤한 데이터가 오도록 설정)
    • random.sample 함수 사용
  • 파일의 크기가 0이 아닌 파일들을 training/testing 폴더로 복사
    • copyfile( 원본경로/파일이름, 복사할경로/파일이름)
  • 변수 설명
    • SOURCE : 데이터 파일의 경로
    • TRAINING : 학습용 데이터 파일의 경로
    • TESTING : 검증용 데이터 파일의 경로
    • SPLIT_SIZE : 데이터를 분리 할 수치 (90%로 설정)
import os
import random
from shutil import copyfile

def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
  filename_list = os.listdir(SOURCE)
  shuffled_list = random.sample(filename_list, len(filename_list))
  index = int(len(shuffled_list) * SPLIT_SIZE)

  training = shuffled_list[ : index ]
  testing = shuffled_list [ index : ]

  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)

CAT_SOURCE_DIR = "/tmp/PetImages/Cat/"
TRAINING_CATS_DIR = "/tmp/cats-v-dogs/training/cats/"
TESTING_CATS_DIR = "/tmp/cats-v-dogs/testing/cats/"
DOG_SOURCE_DIR = "/tmp/PetImages/Dog/"
TRAINING_DOGS_DIR = "/tmp/cats-v-dogs/training/dogs/"
TESTING_DOGS_DIR = "/tmp/cats-v-dogs/testing/dogs/"

split_size = .9
split_data(CAT_SOURCE_DIR, TRAINING_CATS_DIR, TESTING_CATS_DIR, split_size)
split_data(DOG_SOURCE_DIR, TRAINING_DOGS_DIR, TESTING_DOGS_DIR, split_size)
반응형