본문 바로가기

Deep Learning/Tensorflow

Tensorflow - 파일을 Traning과 Test 디렉토리로 나눠서 저장하는 방법

반응형

 

 

# /tmp 경로에 압축파일을 다운로드 받고 압축 푼다.

!wget --no-check-certificate \
    "https://block-edu-test.s3.ap-northeast-2.amazonaws.com/kagglecatsanddogs_5340.zip" \
    -O "/tmp/cats-and-dogs.zip"

local_zip = '/tmp/cats-and-dogs.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()
# /tmp 디렉토리 안에다, 학습을 위한 데이터를 분류하기 위해
# cats-v-dogs 디렉토리를 만들고, 
# 그 아래 training 과 testing 디렉토리 만든 후
# 각각 디렉토리 안에  cats 와 dogs 디렉토리를 만든다.
try:
    #YOUR CODE GOES HERE
    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
##  split_data 라는 파이썬 함수를 만든다.

# SOURCE directory 
# TRAINING directory 
# TESTING directory 
# SPLIT SIZE 

# 소스 경로에 있는 파일들을 잘 섞은 후
# 스플릿 사이즈만큼 학습용과 테스트용 파일로 분리한 후
# 트레이닝 디렉토리와 테스팅 디렉토리에 파일을 저장 시켜 주는 함수 작성 (파일 크기가 0보다 큰 파일만 저장)

# 힌트.
# os.listdir(DIRECTORY) gives you a listing of the contents of that directory
# os.path.getsize(PATH) gives you the size of the file
# copyfile(source, destination) copies a file from source to destination
# random.sample(list, len(list)) shuffles a list




def split_data(SOURCE, TRAINING, TESTING, SPLIT_SIZE):
# YOUR CODE STARTS HERE
  # 1. 원본 디렉토리에서 파일명을 모두 가져온다.
  filename_lsit = os.listdir(SOURCE)

  # 2. 잘 섞어준다.
  shuffled_list = random.sample(filename_lsit, len(filename_lsit))

  # 3. 트레이닝과 테스팅으로 분리하기 위서, 인덱스를 잡아준다.
  index = int(len(shuffled_list) * SPLIT_SIZE)

  # 4. 섞여있는 리스트에서, 위의 인덱스로, 학습용과 테스용 파일을 분리한다.
  training = shuffled_list[ 0 : index ]
  testing = shuffled_list[ index :  ]

  # 5. 각각의 분리된 파일을 해당 디렉토리로 카피해준다.
  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 )


# YOUR CODE ENDS HERE


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)

# Expected output
# 666.jpg is zero length, so ignoring
# 11702.jpg is zero length, so ignoring

 

위 작업을 마쳣다면

 

modeling 후 ImageDataGenerator를 이용해 증강 후 학습시킨다.

 

 

반응형