교육 및 테스트 디렉토리로 나누어 파일을 저장하는 방법

1. 데이터 파일

  • 데이터 파일을 다운로드한 후 압축을 풉니다.
# /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()

2. 파일을 분리하고 저장할 디렉토리를 생성합니다.

  • 교육 폴더
  • 테스트 폴더
    • 카테고리별 상세폴더
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

3. 학습 데이터와 테스트 데이터 분리

  • 학습 데이터: 90%, 테스트 데이터: 10% 분리
  • 인덱스 및 SPLIT_SIZE 변수를 사용하여 데이터 비율 분리
  • 데이터 파일 경로의 파일을 셔플(랜덤 데이터로 설정)
    • random.sample 함수 사용
  • 0이 아닌 크기의 파일을 training/test 폴더에 복사
    • copyfile(소스 경로/파일 이름, 복사 경로/파일 이름)
  • 변수 설명
    • 소스: 데이터 파일 경로
    • TRAINING: 교육 파일 경로
    • TEST: 검증을 위한 데이터 파일의 경로
    • 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)