페이지

2022년 7월 31일 일요일

5.2.2 데이터 내려받기

 여기서 사용할 강아지 vs. 고양이 데이터셋(Dogs vs. Cat dataset)은 케라스에 포함되어 있지 않습니다. 컨브넷이 주류가 되기 전인 2013년 후반에 캐글에서 컴퓨터 비전 경연 대회의 일환으로 이 데이터셋을 만들었습니다. 원본 데이터셋을 https://www.kaggle.com/c/dogs-vs-cats/data 에서 내려받을 수 있습니다(캐글 계정이 없다면 하나 만들어야 하지만 계정을 만드는 과정은 간단합니다).

이 사진들은 중간 정도의 해상도를 가진 컬러 JPEG파일입니다. 그림 5-8에서 샘플 몇 개를 확인 할 수 있습니다.

당연히 2013년 강아지 vs. 고양이 캐글 경연은 컨브넷을 사용한 참가자가 우승했습니다. 최고 성능은 95%의 정확도를 달성했습니다. 이 예제로 (다음 절에서) 참가자들이 상요했던 데이터의 10%보다 적은 양으로 모델을 훈련하고도 이와 아주 근접한 정확도를 달성해 보겠습니다.

이 데이터셋은 2만 5,000개의 강아지와 고양이 이미지(클래스마다 1만 2,500개)를 담고 있고(앞축해서) 543MB 크기입니다. 내려받아 앞축을 해제한 후 3개의 서브셋이 들어 있는 새로운 데이터셋을 만들 것입니다. 클래스마다 1,000개의 샘플로 이루어진 훈련 세트, 클래스마다 500개의 샘플로 이루어진 검증 세트, 클래스마다 500개의 샘플로 이루어진 테스트 세트입니다.

다음은 이를 처리하는 코드입니다.

    import os, shutil

    origianl_dataset_dir = './datasets/cats_and_dogs/train'.....원본 데이터셋을 압축 해제한 디렉터리 경로

    base_dir = './datasets/cats_ands_small' ........소규모 데이터셋을 저장할 디렉터리

    os.mkdir(base_dir)


    train_dir = os.path.join(base_dir, 'train')   ............. 훈련,검증, 테스트 분할을 위한 디렉터리

    os.mkdir(train_dir)

    validation_dir = os.path.join(base_dir, 'validation')

    os.mkdir(validation_dir)

    test_dir = os.path.join(base_dir, 'test')

    os.mkdir(test_dir)


    train_cats_dir = os.path.join(train_dir, 'cats')

    os.mkdir(train_cat_dir)


    train_dogs_dir = os.path.join(validation_dir, 'dogs')

    os.mkdir(train_dogs_dir)


    validation_cats_dir = os.path.join(validation_dir, 'cats')

    os.mkdir(validation_cat_dir)


    validation_dogs_dir =os.path.join(validation_dir, 'dogs')

    os.mkdir(validation_dogs_dir)


    test_cats_dir = os.path.join(test_dir, 'cats')

    os.mkdir(test_cats_dir)

    test_dogs_dir = os.path.join(test_dir, 'dogs')

    os.mkdir(test_dogs_dir)


    fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]

    for fname in fnames:

        src = os.path.join(original_dataset_dir, fname)

        dst = os.path.join(train_cats_dir, fname)

        shutil.copyfile(src, dst)


    fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]

    for fname in fnames:

        src = os.path.join(original_dataset_dir, fname)

        dst = os.path.join(validation_cats_dir, fname)

        shutil.copyfile(src, dst)


    fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]

    for fname in fnames:

        src = os.path.join(original_Dataset_dir, fname)

        dst = os.path.join(test_catas_dir, fname)

        shutilcopyfile(src, dst)


    fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]

    for fname in fnames:

        src = os.path.join(original_dataet_dir, fname)

        dst = os.path.join(train_dogs_dir, fname)

        shutil.copyfile(src, dst)


    fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]

    for fname in fnames:

        src = os.path.join(origianl_dataset_dir, fname)

        dst = os.path.join(test_dogs_dir, fname)

        shutil.copyfile(src, dst)

복사가 잘 되었는지 확인하기 위해 각 분할(훈련/검증/테스트)에 들어 있는 사진이 개수를 카운트 해보죠.

>>> print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir)))

훈련용 고양이 이미지 전체 개수: 1000

>>> print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))

훈련용 강아지 이미지 전체 개수 : 1000

>>> print('검증용 공양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir)))

검증용 공양이 이미지 전체 갯수: 500

>>> print('검증용 강아이 이미지 전체 개수:', len(os.listdir(validation_dogs_dir)))

검증용 강아지 이미지 전체 갯수:500

>>> print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir)))

테스트용 고양이 이미지 전체 개수 : 500

>>> print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir)))

테스트용 강아지 이미지 전체 개수: 500


이제 2,000개의 훈련 이미지, 1,000 개의 검증이미지, 1,000개의 테스트 이미지가 준비되었씁니다. ㅈ분할된 각 데이터는 클래스마다 동일한 개수의 샘플을 포함합니다. 균형 잡힌 이진 분류 문제이므로 정확도를 사용하여 성공을 측정하겠습니다.



    

    

댓글 없음: